Python: Amazon S3 无法获取存储桶:显示403 Forbidden

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应用程序中一切似乎都正常工作。

我是否做错了什么?

4个回答

41

给用户赋予“更强的角色”不是正确的解决方案。这只是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。


4

这个回答对我很有帮助 :)

我做了以下几点操作:

  • 设置S3存储桶的策略
  • 修改时间设置
  • 使用 conn.get_bucket(BUCKET_NAME, validate=False) 方法获取存储桶对象

0

在给予我的“用户”更强的角色之后,这个错误消失了。这意味着用户被授予了获取存储桶的权限。


1
这不是一个答案,而是一条评论。它应该是问题的编辑或者问题的评论。 - Bruno Bronosky
1
@LegoStormtroopr,在留下这种评论之前,你真的应该更加小心……daydreamer 就是问题的作者。 - Sheridan
1
@BrunoBronosky,你也要小心留下这些评论。问题的作者完全可以为自己的问题提供答案。 - Sheridan
1
@daydreamer,以后请在回答问题时留下更有用的答案,或者简单地编辑您的问题摘要以突出您的解决方案...这将防止过于热心的用户错误地在您的答案上留下此类评论。 - Sheridan
3
三年过去了,这个答案仍然没有任何投票。我坚持认为这是一条评论而不是答案。更具体地说,“答案”应该说明哪些权限被更改,而不是说“更强大的角色”。但即使是这样,“答案”仍然是错误的解决方案(对于您可以控制代码的情况)。得票最高的答案是正确的解决方案(在相同的注意事项下),因为它可以解决boto中的意外行为。 - Bruno Bronosky

0

使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接