我只能对S3存储桶中的特定目录进行S3访问。
例如,使用s3cmd
命令,如果我尝试列出整个bucket:
$ s3cmd ls s3://bucket-name
我得到一个错误:Access to bucket 'my-bucket-url' was denied
但如果我尝试访问存储桶中的特定目录,我可以看到内容:
$ s3cmd ls s3://bucket-name/dir-in-bucket
现在我想用python boto连接到S3 bucket。类似于:
bucket = conn.get_bucket('bucket-name')
我得到一个错误:boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
但如果我尝试:
bucket = conn.get_bucket('bucket-name/dir-in-bucket')
脚本停顿了大约10秒,然后打印出一个错误。Bellow是完整的跟踪。你知道如何继续吗?
注意问题是关于boto版本2的模块,而不是boto3。
Traceback (most recent call last):
File "test_s3.py", line 7, in <module>
bucket = conn.get_bucket('bucket-name/dir-name')
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 471, in get_bucket
return self.head_bucket(bucket_name, headers=headers)
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 490, in head_bucket
response = self.make_request('HEAD', bucket_name, headers=headers)
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 633, in make_request
retry_handler=retry_handler
File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 1046, in make_request
retry_handler=retry_handler)
File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 922, in _mexe
request.body, request.headers)
File "/usr/lib/python2.7/httplib.py", line 958, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
self.endheaders(body)
File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
self.send(msg)
File "/usr/lib/python2.7/httplib.py", line 776, in send
self.connect()
File "/usr/lib/python2.7/httplib.py", line 1157, in connect
self.timeout, self.source_address)
File "/usr/lib/python2.7/socket.py", line 553, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno -2] Name or service not known
8条答案
按热度按时间s5a0g9ez1#
对于boto3
fnx2tebb2#
默认情况下,当你在boto中执行
get_bucket
调用时,它会尝试通过对bucket URL执行HEAD
请求来验证你是否真的拥有对该bucket的访问权限。在这种情况下,你不希望boto这样做,因为你没有访问bucket本身的权限。然后你就可以像这样列出对象:
如果仍然出现403错误,请尝试在前缀末尾添加一个斜杠。
注:此答案是针对boto version 2模块编写的,该模块现已过时,目前(2020年)boto3是与AWS配合使用的标准模块,更多信息请参见此问题:What is the difference between the AWS boto and boto3
llmtgqce3#
Boto3客户端:
使用会话
f45qwnt84#
我刚刚遇到了同样的问题,这段代码可以解决这个问题。
lo8azlld5#
以下代码将列出S3存储桶中特定目录下的所有文件:
hsvhsicv6#
这可以通过以下方式完成:
xj3cbfub7#
如果要列出存储桶中某个文件夹的所有对象,可以在列出时指定。
oxosxuxt8#
在S3中列出具有特定前缀的对象的最简单方法是使用
awswrangler
:这将返回存储在
some/prefix/
中的对象列表