当前位置: 首页 > 知识库问答 >
问题:

无法使用boto访问公共s3 bucket中的文件

邹书
2023-03-14

我最近创建了一个新的AWS帐户(我们称之为“帐户a”),并在这个帐户中创建了一个S3 bucket(我们称之为“bucketa”),上传了一个文件foo.txt。根据来自internet的建议,我设置了我认为是最允许的桶策略(它应该允许任何用户进行任何类型的访问):

{
  "Version": "2012-10-17",
  "Id": "PolicyABCDEF123456",
  "Statement": [
    {
      "Sid": "StmtABCDEF123456",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::bucketa/*",
        "arn:aws:s3:::bucketa"
      ]
    }
  ]
}
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
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帐户的公共访问权限?

注意:我已经排除了帐户B的.boto文件中作为罪魁祸首的无效凭据,方法是使用相同的bucket策略从帐户B创建一个S3 bucket bucketb(“bucketa”在两行中替换为“bucketb”);在本例中,我可以使用帐户B的凭据访问bucketb,但当使用Bucket A的凭据时,会得到相同的403错误。

共有1个答案

杨高翰
2023-03-14

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

conn = boto.connect_s3(anon=True)

应该能奏效。这可能不言而喻,但我不会离开这个政策,就像现在这样。它将允许任何人把他们想要的任何东西倒进桶里。

 类似资料:
  • Firebase存储允许使用URL访问文件

  • 我正在init容器中创建一个文件,并希望在主容器中使用该文件。 Pods进入crashlookBack关闭状态,出现以下错误 我已验证文件是否安装在tmp位置。

  • 我想使用谷歌的REST API访问公共日历。 Google的日历API建议我需要OAuth令牌才能访问日历: https://developers.google.com/google-apps/calendar/auth 然而,我正在访问一个公共日历,并且正在服务器上执行此操作,因此不能/不应该要求用户进行身份验证。 我使用node.jsapi: 这将返回“您的客户端发出了一个格式错误或非法的请求

  • 我在一个公共类中有以下构造函数: 和变量在类中定义,该类对其进行了扩展。 当使用执行它时,我会得到以下错误消息。 将其设置为静态的,或者向类中添加一个无参数的构造函数 抛出com.hp.lft.sdk.GeneralleanFTException,java.lang.InterruptedException:将其设置为静态,或者在org.testng.internal.utils.CheckIns

  • 问题内容: 我在Python网络环境中工作,我可以使用boto的key.set_contents_from_filename(path / to / file)将文件从文件系统上传到S3。但是,我想上传已经在网络上的图像(例如https://pbs.twimg.com/media/A9h_htACIAAaCf6.jpg:large)。 我是否应该以某种方式将映像下载到文件系统,然后照常使用boto

  • 我有一个默认ACL设置为private的bucket。我想生成预签名的url,并将其分发给用户,以便他们可以上传文件,上传后文件需要公开访问。 我可以生成预签名的url并上传文件,但文件始终保持私有。如果我在创建签名url时将ACL设置为“public-read”,那么getSignedUrl()正在生成签名url,但对该签名url的PUT请求会拒绝访问。 bucket可以包含私有或公共可访问的文