web-dev-qa-db-ja.com

Boto3を使用してプレフィックス付きのS3バケットにファイルをアップロードする

ファイルを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)
_

バケットが空のため、出力はありませんが。

6
foxes

私はSSEが必要であることがわかりました:

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

私はあなたがこのすべてをセットアップしていると仮定しています:

  1. AWSアクセスキーIDとシークレットキーのセットアップ(通常は_~/.aws/credentials_に保存されます)
  2. S3にアクセスでき、バケット名とプレフィックス(サブディレクトリ)がわかっている

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_です。それを忘れないでください-それは私のために働いた!

それがお役に立てば幸いです。

7
John Adjei
import boto3

s3 = boto3.resource('s3')
s3.meta.client.upload_file( 'csv1.csv', "bucketname", "prefixna/csv1.csv")
2
Ranajit kumar