web-dev-qa-db-ja.com

Python:Amazon S3はバケットを取得できません:403Forbiddenと言います

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アプリケーションからは、すべてが機能しているようです。

私はここで何か間違ったことをしていますか?

14
daydreamer

私の「ユーザー」にはるかに強力な役割を与えた後、このエラーはなくなりました。 get_bucketへのアクセス許可をユーザーに付与したことを意味します

0
daydreamer

ユーザーに「より強力な役割」を与えることは正しい解決策ではありません。これは単に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を使用します。

40
Pavel Repin

この答え 私のために働く:)

やった

  • S3バケットポリシー設定
  • 時間設定
  • バケット= conn.get_bucket(BUCKET_NAME、validate = False)
4
Wonjun Hwang

Pythonを使用してAmazonS3バケットからファイルを読み取る

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)
0
Ajeet Verma