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

4 回答 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=Falsekwarg。

于 2013-01-23T22:34:52.367 回答
4

这个答案对我有用:)

我做了

  • S3 存储桶策略设置
  • 时间设定
  • bucket = conn.get_bucket(BUCKET_NAME, validate=False)
于 2015-10-23T02:49:32.487 回答
0

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

于 2012-09-24T19:46:17.503 回答
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)
于 2020-01-23T15:10:55.543 回答