15

AmazonS3に自分の組織用のバケットがあります。mydev.orgname

  • クレデンシャルを使用してAmazonS3に接続し、S3に接続してファイルを作成、読み取りできるJavaアプリケーションがあります。

  • アプリケーションが同じバケットからPythonからデータを読み取るという要件があります。だから私はこれにボトを使っています。

私はバケツを手に入れるために次のことをします

>>> 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ライブラリの使用に関する問題です。明らかに、JavaS3ライブラリを使用する場合は追加のアクセス許可は必要ありません。

この場合の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バケットポリシー設定
  • 時間設定
  • バケット=conn.get_bucket(BUCKET_NAME、validate = False)
于 2015-10-23T02:49:32.487 に答える
0

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

于 2012-09-24T19:46:17.503 に答える
0

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)
于 2020-01-23T15:10:55.543 に答える