boto3 S3Transfer выдает ошибку AttributeError: у объекта ResourceMeta нет атрибута events - PullRequest
0 голосов
/ 29 января 2020

Я новичок в AWS и Boto3, и я пытаюсь загрузить свой файл json в s3. Я назначил роль sAMFullAccess IAM для моего ec2. У меня установлены python3 .5 и boto3. Я пытаюсь ниже код.

from boto3.s3.transfer import S3Transfer
import boto3
s3_client = boto3.resource('s3')
transfer = S3Transfer(s3_client)
bucket_name='test-bucket-oracle'
prefix='configurations'
transfer.upload_file('/home/ec2-user/temp/config.json', bucket_name, prefix+'configs3.json', ExtraArgs={'ServerSideEncryption': "AES256"})

и получаю ошибку ниже. Любая помощь высоко ценится.

Traceback (most recent call last):
  File "transfers3.py", line 4, in <module>
    transfer = S3Transfer(s3_client)
  File "/home/ec2-user/.local/lib/python3.5/site-packages/boto3/s3/transfer.py", line 259, in __init__
    self._manager = create_transfer_manager(client, config, osutil)
  File "/home/ec2-user/.local/lib/python3.5/site-packages/boto3/s3/transfer.py", line 160, in create_transfer_manager
    return TransferManager(client, config, osutil, executor_cls)
  File "/home/ec2-user/.local/lib/python3.5/site-packages/s3transfer/manager.py", line 264, in __init__
    self._register_handlers()
  File "/home/ec2-user/.local/lib/python3.5/site-packages/s3transfer/manager.py", line 514, in _register_handlers
    self._client.meta.events.register_first(
AttributeError: 'ResourceMeta' object has no attribute 'events'

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вам нужно использовать client, потому что это то, что ожидает S3Transfer. Вы можете проверить это здесь: boto3.s3.transfer.S3Transfer

Если вы отметите boto3 docs , resource (ServiceResource) описывается как:

A resource representing Amazon Simple Storage Service (S3)

И client как:

A low-level client representing Amazon Simple Storage Service (S3):

И как вы можете видеть в документах, это не одно и то же, хотя вы можете выполнять sh аналогичные задачи с помощью оба.

0 голосов
/ 29 января 2020

Так как никто еще не ответил. Оказалось, что мне нужно было использовать

boto3.client('s3')

Я пытался boto3.resource('s3'), поскольку github post рекомендовал это. Любой эксперт, который может объяснить разницу, приветствуется.

...