フランクフルト地域の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()
どうすれば正しく修正できますか?
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')
Botoconfigからs3を削除してみてください。次のコードが機能します。
if 's3' in boto.config.sections(): boto.config.remove_section('s3')
上記のhsrvの回答はboto2で機能します。boto3
の場合、以下はほぼ同等です。
s3 = boto3.client('s3', region_name='eu-central-1')
または、.aws/config
のregion
フィールドを設定することもできます。
[default]
output = json
region = eu-central-1
これにより、デフォルトのリージョンが設定されます。上記のように、Python)で特定の領域を選択することもできます。
リージョンの重要性はサービスごとに異なります(たとえば、VPCに座っていない場合、どこからでもS3バケットにアクセスできます)。ただし、この場合、重要なことは、新しいリージョン(フランクフルトなど)は新しい認証スキーム(AWS4-HMAC-SHA256)のみをサポートすることです。古いスキームをまだ使用しているリージョン(ダブリンなど)からそのようなリージョン内の何かに接続しようとすると、Botoで問題が発生します。
boto2の場合-これを.boto構成に追加すると機能しました
[s3]
use-sigv4 = True
Host=s3.eu-central-1.amazonaws.com