无法使用 boto 从 public s3 存储桶访问文件
Unable to access files from public s3 bucket with boto
我最近创建了一个新的 AWS 账户(我们称之为 "Account A")并在该账户中创建了一个 S3 存储桶(我们称之为 "bucketa"),上传了一个文件 foo.txt。在 advice from the internet 之后,我设置了我认为最宽松的存储桶策略(它应该允许任何用户进行任何类型的访问):
{
"Version": "2012-10-17",
"Id": "PolicyABCDEF123456",
"Statement": [
{
"Sid": "StmtABCDEF123456",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketa/*",
"arn:aws:s3:::bucketa"
]
}
]
}
为账户 A 创建一个 IAM 用户("Identity & Access Management -> Users -> Create New Users" 并创建一个用户并选中 "Generate an access key for each user")并将该用户的凭据存储在 ~/.boto 中后,一个使用 boto S3 接口的简单脚本可以访问上传的文件 foo.txt:
import boto
conn = boto.connect_s3()
b = conn.get_bucket("bucketa", validate=False)
k = boto.s3.key.Key(b)
k.key = "foo.txt"
print len(k.get_contents_as_string())
# 9
然后我创建了一个新的 AWS 账户(我们称之为 "Account B"),并按照相同的步骤将 IAM 凭证存储在 .boto 文件中,运行 相同 python脚本。但是在这种情况下,我在执行行 print len(k.get_contents_as_string())
:
时收到 403 错误
Traceback (most recent call last):
File "access.py", line 7, in <module>
print len(k.get_contents_as_string())
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1775, in get_contents_as_string
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1643, in get_contents_to_file
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1475, in get_file
query_args=None)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1507, in _get_file_internal
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 343, in open
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 291, in open_read
self.resp.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>7815726085F966F2</RequestId><HostId>EgFfldG4FoA5csuUVEKBq15gg3QQlQbPyqnyZjc2fp5DewlqDZ4F4HNjXYWQtBl5MUlSyLAOeKA=</HostId></Error>
为什么账户 B 无法访问 bucketa,尽管它的存储桶策略非常宽松?我是否需要设置额外的权限以启用其他 AWS 的 public 访问帐号?
注意:我已经排除了帐户 B 的 .boto 文件中的无效凭据作为罪魁祸首,方法是使用相同的存储桶策略从帐户 B 创建 S3 存储桶 bucketb ("bucketa" 替换为 "bucketb" 两行);在这种情况下,我可以使用帐户 B 的凭据访问 bucketb,但在使用 Bucket A 的凭据时会出现相同的 403 错误。
您的策略允许匿名用户访问存储桶。但是,在您的情况下,帐户 B 不是匿名用户,它是经过身份验证的 AWS 用户,如果您希望该用户具有访问权限,则需要在策略中明确授予它。或者,您可以在 boto 中匿名访问它:
conn = boto.connect_s3(anon=True)
这应该可以解决问题。这可能不言而喻,但我不会按原样保留该政策。它允许任何人将他们想要的任何东西倒入桶中。
我最近创建了一个新的 AWS 账户(我们称之为 "Account A")并在该账户中创建了一个 S3 存储桶(我们称之为 "bucketa"),上传了一个文件 foo.txt。在 advice from the internet 之后,我设置了我认为最宽松的存储桶策略(它应该允许任何用户进行任何类型的访问):
{
"Version": "2012-10-17",
"Id": "PolicyABCDEF123456",
"Statement": [
{
"Sid": "StmtABCDEF123456",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucketa/*",
"arn:aws:s3:::bucketa"
]
}
]
}
为账户 A 创建一个 IAM 用户("Identity & Access Management -> Users -> Create New Users" 并创建一个用户并选中 "Generate an access key for each user")并将该用户的凭据存储在 ~/.boto 中后,一个使用 boto S3 接口的简单脚本可以访问上传的文件 foo.txt:
import boto
conn = boto.connect_s3()
b = conn.get_bucket("bucketa", validate=False)
k = boto.s3.key.Key(b)
k.key = "foo.txt"
print len(k.get_contents_as_string())
# 9
然后我创建了一个新的 AWS 账户(我们称之为 "Account B"),并按照相同的步骤将 IAM 凭证存储在 .boto 文件中,运行 相同 python脚本。但是在这种情况下,我在执行行 print len(k.get_contents_as_string())
:
Traceback (most recent call last):
File "access.py", line 7, in <module>
print len(k.get_contents_as_string())
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1775, in get_contents_as_string
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1643, in get_contents_to_file
response_headers=response_headers)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1475, in get_file
query_args=None)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 1507, in _get_file_internal
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 343, in open
override_num_retries=override_num_retries)
File "/usr3/josilber/.local/lib/python2.7/site-packages/boto/s3/key.py", line 291, in open_read
self.resp.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>7815726085F966F2</RequestId><HostId>EgFfldG4FoA5csuUVEKBq15gg3QQlQbPyqnyZjc2fp5DewlqDZ4F4HNjXYWQtBl5MUlSyLAOeKA=</HostId></Error>
为什么账户 B 无法访问 bucketa,尽管它的存储桶策略非常宽松?我是否需要设置额外的权限以启用其他 AWS 的 public 访问帐号?
注意:我已经排除了帐户 B 的 .boto 文件中的无效凭据作为罪魁祸首,方法是使用相同的存储桶策略从帐户 B 创建 S3 存储桶 bucketb ("bucketa" 替换为 "bucketb" 两行);在这种情况下,我可以使用帐户 B 的凭据访问 bucketb,但在使用 Bucket A 的凭据时会出现相同的 403 错误。
您的策略允许匿名用户访问存储桶。但是,在您的情况下,帐户 B 不是匿名用户,它是经过身份验证的 AWS 用户,如果您希望该用户具有访问权限,则需要在策略中明确授予它。或者,您可以在 boto 中匿名访问它:
conn = boto.connect_s3(anon=True)
这应该可以解决问题。这可能不言而喻,但我不会按原样保留该政策。它允许任何人将他们想要的任何东西倒入桶中。