繁体   English   中英

无法使用Boto从公用S3存储桶访问文件

[英]Unable to access files from public s3 bucket with boto

我最近创建了一个新的AWS账户(我们称其为“账户A”),并在该账户中创建了一个S3存储桶(称其为“ bucketa”),并上传了文件foo.txt。 以下建议 互联网 ,我成立了我认为是最宽松的政策桶可能(应该允许任何用户的任何类型的访问):

{
  "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用户(“身份和访问管理->用户->创建新用户”,并选中“为每个用户生成访问密钥”来创建用户)并将该用户的凭据存储在〜/ .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账户(我们称其为“账户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尽管实行非常宽松的存储桶策略,仍无法访问存储桶? 我需要设置其他权限以启用其他AWS账户的公共访问吗?

注意:我已经通过使用相同存储桶策略(用两行“ bucketa”替换为“ bucketb”)从帐户B创建S3存储桶bucketb来​​排除帐户B的.boto文件中的无效凭据作为罪魁祸首。 在这种情况下,我可以使用帐户B的凭据访问bucketb,但是在使用Bucket A的凭据时也会出现403错误。

您拥有的策略允许匿名用户访问存储桶。 但是,如果您的帐户B不是匿名用户,则它是经过身份验证的AWS用户,并且如果您希望该用户具有访问权限,则需要在策略中显式授予它。 或者,您可以在boto中匿名访问它:

conn = boto.connect_s3(anon=True)

这应该够了吧。 可能不言而喻,但我不会原样保留该政策。 它将允许任何人将他们想要的任何东西倾倒到水桶中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM