ファイルをS3バケットにアップロードしようとしていますが、バケットのルートレベルにアクセスできず、代わりに特定のプレフィックスにアップロードする必要があります。次のコード:
_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')
_
エラーが発生します:
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
_はabcd
の形式で、prefix
は_a/b/c/d/
_の形式です。エラーがスラッシュの間違いによるものなのか、他の場所でプレフィックスを指定する方法があるのか、書き込み権限がないのかはわかりません(おそらくそうしますが)。
このコードはエラーなしで実行されます:
_for object in output_bucket.objects.filter(Prefix=prefix):
print(object.key)
_
バケットが空のため、出力はありませんが。
私はSSEが必要であることがわかりました:
transfer = S3Transfer(s3_client)
transfer.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt', extra_args={'ServerSideEncryption': "AES256"})
私はあなたがこのすべてをセットアップしていると仮定しています:
~/.aws/credentials
_に保存されます)Boto3 S3 _upload_file
_ documentation によると、次のようにアップロードをアップロードする必要があります。
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')
_
ここで注意すべきキーは_s3.meta.client
_です。それを忘れないでください-それは私のために働いた!
それがお役に立てば幸いです。
import boto3
s3 = boto3.resource('s3')
s3.meta.client.upload_file( 'csv1.csv', "bucketname", "prefixna/csv1.csv")