【问题标题】:Python: Amazon S3 cannot get the bucket: says 403 ForbiddenPython:Amazon S3 无法获取存储桶:说 403 Forbidden
【发布时间】:2012-09-16 06:40:15
【问题描述】:

我在 Amazon S3 中有一个用于我的组织的存储桶,看起来像 mydev.orgname

  • 我有一个 Java 应用程序,它可以使用凭证连接到 Amazon S3,并且可以连接到 S3、创建、读取文件

  • 我有一个要求,应用程序从同一存储桶中的 Python 读取数据。所以我为此使用boto

为了得到桶,我做了以下操作

>>> import boto
>>> from boto.s3.connection import S3Connection
>>> from boto.s3.key import Key
>>> 
>>> conn = S3Connection('xxxxxxxxxxx', 'yyyyyyyyyyyyyyyyyyyyyy')
>>> conn
S3Connection:s3.amazonaws.com

现在当我尝试获取存储桶时,我看到了错误

>>> b = conn.get_bucket('mydev.myorg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/boto/s3/connection.py", line 389, in get_bucket
    bucket.get_all_keys(headers, maxkeys=0)
  File "/Library/Python/2.7/site-packages/boto/s3/bucket.py", line 367, in get_all_keys
    '', headers, **params)
  File "/Library/Python/2.7/site-packages/boto/s3/bucket.py", line 334, in _get_all
    response.status, response.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>EEC05E43AF3E00F3</RequestId><HostId>v7HHmhJaLLQJZYkZ7sL4nqvJDS9yfrhfKQCgh4i8Tx+QsxKaub50OPiYrh3JjQbJ</HostId></Error>

但从 Java 应用程序看来一切正常。

我在这里做错了吗?

【问题讨论】:

    标签: python amazon-s3 boto


    【解决方案1】:

    在赋予我的“用户”更强大的角色后,这个错误就消失了。表示用户获得了 get_bucket 的权限

    【讨论】:

    • 这不是答案。这是一条评论。它应该是对问题的编辑或对问题的评论
    • @LegoStormtroopr,在将这些类型的 cmets 留在答案上之前,您真的应该更加小心......白日梦问题作者。
    • @BrunoBronosky,你也应该小心离开这些 cmets。问题作者完全可以为自己的问题提供答案。
    • @daydreamer,将来,请为您的问题留下更多有用的答案,或者只是为您的问题添加摘要编辑以突出您的解决方案......这将阻止敏锐的用户错误地离开这些您的答案中的各种 cmets。
    • 3 年,这个答案仍然有 0 票。我将坚持这是评论而不是答案。更具体地说,an answer 会说更改了哪些权限,而不是“更强大的角色”。但是,它仍然是错误的解决方案(对于您可以控制代码的情况)。 highest voted answer 是正确的解决方案(给出相同的警告),因为它可以解决 boto 中的意外行为。
    【解决方案2】:

    赋予用户“更强的角色”并不是正确的解决方案。这只是boto 库使用的问题。显然,使用 Java S3 库时不需要额外的权限。

    在这种情况下使用 boto 的正确方法是:

    b = conn.get_bucket('my-bucket', validate=False)
    k = b.get_key('my/cool/object.txt') # will send HEAD request to S3
    ...
    

    基本上,boto 默认情况下(恕我直言,这是他们的一个错误),假设您想要与 S3 存储桶进行交互。诚然,有时您确实希望这样做,但您应该使用具有 S3 存储桶操作权限的凭证。但更流行的用例是与 S3 对象交互,在这种情况下您不需要任何特殊的存储桶级权限,因此使用 validate=False kwarg。

    【讨论】:

      【解决方案3】:

      this answer 为我工作 :)

      我做到了

      • S3 存储桶策略设置
      • 时间设置
      • bucket = conn.get_bucket(BUCKET_NAME, validate=False)

      【讨论】:

        【解决方案4】:

        使用 Python 从 Amazon S3 存储桶读取文件

        import boto3
        import csv
        
        # get a handle on s3
        session = boto3.Session(
                        aws_access_key_id='XXXXXXXXXXXXXXXXXXXXXXX',
                        aws_secret_access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
                        region_name='XXXXXXXXXX')
        
        s3 = session.resource('s3')
        
        # get a handle on the bucket that holds your file
        bucket = s3.Bucket('bucket name') # example: energy_market_procesing
        
        # get a handle on the object you want (i.e. your file)
        obj = bucket.Object(key='file to read') # example: market/zone1/data.csv
        
        # get the object
        response = obj.get()
        
        # read the contents of the file
        lines = response['Body'].read()
        
        # saving the file data in a new file test.csv
        with open('test.csv', 'wb') as file:
            file.write(lines)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          • 2016-01-07
          相关资源
          最近更新 更多