mydev.orgname
のようなAmazonS3の組織用のバケットがあります
資格情報を使用してAmazonS3に接続でき、S3に接続してファイルを作成、読み取りできるJavaアプリケーションがあります
アプリケーションが同じバケットから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アプリケーションからは、すべてが機能しているようです。
私はここで何か間違ったことをしていますか?
私の「ユーザー」にはるかに強力な役割を与えた後、このエラーはなくなりました。 get_bucketへのアクセス許可をユーザーに付与したことを意味します
ユーザーに「より強力な役割」を与えることは正しい解決策ではありません。これは単に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を使用します。
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)