TypeError при использовании клиента Boto3 для помещения объекта в AWS S3 Bucket - PullRequest
0 голосов
/ 04 декабря 2018

Когда я запускаю этот код:

bucket_name = self.myBucket['PhysicalResourceId']  #evaluates to 'myBucket234342'
some_binary_data = b'Here we have some data'
S3client.put_object(Body=some_binary_data, Bucket=bucket_name, Key='hello.txt')

Я получаю эту ошибку:

TypeError: можно только объединить str (не "dict") в str

С помощью этой трассировки стека:

ERROR [0.333s]: test_cant_access_encrypted_files_unless_authorized (testS3Security.TestS3Security)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\ddrayton\Desktop\template-build-s3\tests\testS3Security.py", line 130, in test_cant_access_encrypted_files_unless_authorized
    S3client.put_object(Body=some_binary_data, Bucket=bucket_name, Key='helloencrypt.txt')
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\client.py", line 320, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\client.py", line 610, in _make_api_call
    operation_model, request_dict)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\endpoint.py", line 102, in make_request
    return self._send_request(request_dict, operation_model)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\endpoint.py", line 132, in _send_request
    request = self.create_request(request_dict, operation_model)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\endpoint.py", line 116, in create_request
    operation_name=operation_model.name)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\hooks.py", line 356, in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\hooks.py", line 228, in emit
    return self._emit(event_name, kwargs)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\hooks.py", line 211, in _emit
    response = handler(**kwargs)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\signers.py", line 90, in handler
    return self.sign(operation_name, request)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\signers.py", line 157, in sign
    auth.add_auth(request)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\auth.py", line 425, in add_auth
    super(S3SigV4Auth, self).add_auth(request)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\auth.py", line 368, in add_auth
    signature = self.signature(string_to_sign, request)
  File "C:\Users\ddrayton\AppData\Roaming\Python\Python37\site-packages\botocore\auth.py", line 348, in signature
    k_date = self._sign(('AWS4' + key).encode('utf-8'),
TypeError: can only concatenate str (not "dict") to str

Обычно эта ошибка означает, что вы не можете объединить словарь со строкой.В этом есть смысл.Но единственный аргумент, который я передаю здесь, который должен быть строкой, это не буквальная строка, это bucket_name, и я уверен, что это строка, потому что я сделал:

print(type(bucket_name))

...и он вернул строку.

И тело, я не думаю, что тело вызывает какие-либо проблемы ( в этом примере ).Тело имеет тип 'байты', согласно документам .

Трассировка стека заставляет меня задуматься, если это ошибка самого Boto3 ... но я сомневаюсь в этом.Что я делаю не так?

1 Ответ

0 голосов
/ 04 декабря 2018

Это прекрасно работает для меня:

import boto3

s3_client = boto3.client('s3', region_name='ap-southeast-2')

some_binary_data = b'Here we have some data'
s3_client.put_object(Body=some_binary_data, Bucket='my-bucket', Key='hello.txt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...