web-dev-qa-db-fra.com

Chargement d'un fichier dans un compartiment S3 avec un préfixe avec Boto3

J'essaie de télécharger un fichier dans un compartiment S3, mais je n'ai pas accès au niveau racine du compartiment et je dois le télécharger à un certain préfixe. Le code suivant:

import boto3
s3 = boto3.resource('s3')
open('/tmp/hello.txt', 'w+').write('Hello, world!')
s3_client.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt')

Me donne une erreur:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied: ClientError Traceback (most recent call last): File "/var/task/tracker.py", line 1009, in testHandler s3_client.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt') File "/var/runtime/boto3/s3/inject.py", line 71, in upload_file extra_args=ExtraArgs, callback=Callback) File "/var/runtime/boto3/s3/transfer.py", line 641, in upload_file self._put_object(filename, bucket, key, callback, extra_args) File "/var/runtime/boto3/s3/transfer.py", line 651, in _put_object **extra_args) File "/var/runtime/botocore/client.py", line 228, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 492, in _make_api_call raise ClientError(parsed_response, operation_name) ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

bucket_name est au format abcd tandis que prefix est au format a/b/c/d/. Je ne sais pas si l'erreur est due aux barres obliques erronées ou s'il est possible de spécifier le préfixe ailleurs, ou si je ne dispose pas d'autorisations en écriture (bien que ce soit supposément le cas).

Ce code s'exécute sans erreur:

for object in output_bucket.objects.filter(Prefix=prefix):
    print(object.key)

Bien qu'il n'y ait pas de sortie car le compartiment est vide. 

3
foxes

Il s'avère que j'avais besoin de SSE:

transfer = S3Transfer(s3_client)
transfer.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt', extra_args={'ServerSideEncryption': "AES256"})
7
foxes

Je suppose que vous avez tout mis en place:

  1. Configuration de l'ID de clé d'accès et de la clé secrète AWS (généralement stockée à ~/.aws/credentials
  2. Vous avez accès à S3 et vous connaissez vos noms et préfixes de compartiment (sous-répertoires)

Selon la documentation Boto3 S3 upload_file , vous devez télécharger votre téléchargement de la manière suivante:

upload_file(Filename, Bucket, Key, ExtraArgs=None, Callback=None, Config=None)

import boto3
s3 = boto3.resource('s3')
s3.meta.client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')

La clé à noter ici est s3.meta.client. N'oubliez pas que cela a fonctionné pour moi!

J'espère que cela a aidé.

1
John Adjei