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.
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"})
Je suppose que vous avez tout mis en place:
~/.aws/credentials
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é.