我试图上传一个文件到S3 bucket,但是我没有访问bucket根级别的权限,我需要将它上传到某个前缀。
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条答案
按热度按时间zdwk9cvp1#
我想你已经准备好了
~/.aws/credentials
1.您可以访问S3,并且知道存储区名称和前缀(子目录)
根据Boto 3 S3
upload_file
文档,您应该按如下方式上传您的上传:upload_file(Filename, Bucket, Key, ExtraArgs=None, Callback=None, Config=None)
这里要注意的关键是
s3.meta.client
。不要忘记这一点--它对我很有效!希望能帮上忙。
ahy6op9u2#
7kqas0il3#
结果我需要SSE:
ztmd8pv54#
下面是John Adjei的另一个答案。这也来自Boto3 S3 upload_file documentation。因为客户端是低级别的(低抽象/更接近机器代码),它可以提高性能-特别是如果你要处理大数据。
zi8p0yeb5#
以下是我的回答:
kyvafyod6#
使用
resource
带有
client