web-dev-qa-db-ja.com

署名V4のAWSS3バケットにbotoを使用する

フランクフルト地域のS3バケットにPython-BotoSDKを使用する際に問題が発生しました。 Amazonリンク によると、このリージョンはV4のみをサポートします。この ドキュメント は、BotoSDKのV4サポートを追加する方法を説明しています。新しいセクションを追加しました:

if not boto.config.get('s3', 'use-sigv4'):
    boto.config.add_section('s3')
    boto.config.set('s3', 'use-sigv4', 'True')

次に、新しい接続を作成し、すべてのバケットを取得しました。

connection = S3Connection(accesskey, secretkey, Host=S3Connection.DefaultHost)
buckets = connection.get_all_buckets()

正常に動作しますが、バケットのすべてのキーを取得しようとしました。

for bucket in buckets:
    bucket.get_all_keys()

そして私は次のものを手に入れました:

S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'</Message><Region>eu-central-1</Region>

なぜそれが起こったのですか?その後、リージョンに接続して、必要なすべてのデータを取得しました。

region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey)
bucket = region_con.get_bucket(bucket.name)
bucket.get_all_keys()

どうすれば正しく修正できますか?

12
Oleg

Botoを使用しても同じ問題が発生しました。地域はフランクフルトで、間違った地域についてエラーが発生しました。私にとっての解決策は、ホスト(このページから取得したURI http://docs.aws.Amazon.com/general/latest/gr/rande.html )を 's3.eu-central-1.amazonaws.com'デフォルトの代わりに 's3.amazonaws.com'

s3 = boto.s3.connect_to_region('eu-central-1',
                               aws_access_key_id=accesskey,
                               aws_secret_access_key=secretkey,
                               Host='s3.eu-central-1.amazonaws.com')
7
hsrv

Botoconfigからs3を削除してみてください。次のコードが機能します。

if 's3' in boto.config.sections(): boto.config.remove_section('s3')

2
pseudonym

上記のhsrvの回答はboto2で機能します。boto3の場合、以下はほぼ同等です。

s3 = boto3.client('s3', region_name='eu-central-1')

または、.aws/configregionフィールドを設定することもできます。

[default]
output = json
region = eu-central-1

これにより、デフォルトのリージョンが設定されます。上記のように、Python)で特定の領域を選択することもできます。

リージョンの重要性はサービスごとに異なります(たとえば、VPCに座っていない場合、どこからでもS3バケットにアクセスできます)。ただし、この場合、重要なことは、新しいリージョン(フランクフルトなど)は新しい認証スキーム(AWS4-HMAC-SHA256)のみをサポートすることです。古いスキームをまだ使用しているリージョン(ダブリンなど)からそのようなリージョン内の何かに接続しようとすると、Botoで問題が発生します。

1
Rob Hague

boto2の場合-これを.boto構成に追加すると機能しました

[s3]
use-sigv4 = True
Host=s3.eu-central-1.amazonaws.com
0
storm_m2138