我在Amazon S3中为我的组织提供了一个看起来像mydev.orgname
我有一个Java应用程序,可以使用凭据连接到Amazon S3并可以连接到S3,创建,读取文件
我有一个要求,即应用程序从同一个存储桶中读取Python中的数据。所以我正在使用boto。
我在oder中执行以下操作以获取存储桶
>>> 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应用程序开始,一切似乎都有效。
我在这里做错了吗?
答案 0 :(得分:39)
为用户提供“更强大的作用”并不是正确的解决方案。这只是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。
答案 1 :(得分:4)
答案 2 :(得分:0)
在给予我的“用户”更强大的作用后,这个错误就消失了。表示用户获得get_bucket的许可
答案 3 :(得分:0)
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)