新しいフランクフルト地域のS3バケットにファイルをアップロードしようとすると、エラーAWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
が表示されます。すべてがUS Standard
リージョンで正常に機能します。
スクリプト:
backup_file = '/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz'
s3 = AWS::S3.new(
access_key_id: AMAZONS3['access_key_id'],
secret_access_key: AMAZONS3['secret_access_key']
)
s3_bucket = s3.buckets['test-frankfurt']
# Folder and file name
s3_name = "database-backups-last20days/#{File.basename(File.dirname(backup_file))}_#{File.basename(backup_file)}"
file_obj = s3_bucket.objects[s3_name]
file_obj.write(file: backup_file)
aws-sdk(1.56.0)
修正方法
ありがとうございました。
AWS4-HMAC-SHA256は、署名バージョン4( "V4")とも呼ばれ、S3でサポートされている2つの認証スキームの1つです。
すべてのリージョンはV4をサポートしますが、米国標準¹、および他の多くのリージョン(すべてではない)は、他の古いスキームである署名バージョン2(「V2」)もサポートします。
http://docs.aws.Amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html によると... 2014年1月以降に展開された新しいS3リージョンは、 V4。
フランクフルトは2014年後半に導入されたため、V2をサポートしていません。これは、このエラーが使用していることを示唆しています。
http://docs.aws.Amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html は、さまざまなSDKでV4を有効にする方法を説明しています(その機能を備えたSDKを使用している場合)。
一部の古いバージョンのSDKはこのオプションをサポートしていない可能性があるため、上記の方法で解決しない場合は、使用しているSDKの新しいリリースが必要になる可能性があります。
¹US Standard
は、us-east-1
リージョンに基づくS3リージョン展開の以前の名前です。この回答が最初に書かれた時から "Amazon S3は、AWSの地域の命名規則と一致するように、US Standard RegionをUS East(N. Virginia)Regionに改名しました。 すべての実用的な目的のために、名前の変更のみです。
ノードで、試してください
var s3 = new AWS.S3( {
endpoint: 's3-eu-central-1.amazonaws.com',
signatureVersion: 'v4',
region: 'eu-central-1'
} );
新しい変数バージョンを使用するには、config
にsignatureVersion: 'v4'
を設定する必要があります。
AWS.config.update({
signatureVersion: 'v4'
});
JS
SDKで機能します。
boto3
(Python SDK
)を使用している人は、以下のコードを使用してください
from botocore.client import Config
s3 = boto3.resource(
's3',
aws_access_key_id='xxxxxx',
aws_secret_access_key='xxxxxx',
config=Config(signature_version='s3v4')
)
PHP SDKの同様の問題、これは機能します:
$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));
重要なビットはsignature
とregion
です
私はDjangoを使用していましたが、これらの追加の構成変数を追加してこの機能を動作させる必要がありました。 ( https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-Amazon-s3-in-a-Django-project.html に記載されている設定に加えて) 。
AWS_S3_REGION_NAME = "ap-south-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"
Javaでプロパティを設定する必要がありました
System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")
領域をs3Clientインスタンスに追加します。
s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
Boto configを使用したthumb-awsの場合、これを$AWS_CONFIG_FILE
に配置する必要がありました
[default]
aws_access_key_id = (your ID)
aws_secret_access_key = (your secret key)
s3 =
signature_version = s3
そのため、ボトを変更せずに直接使用したものはすべて、これが役立つ場合があります
Boto3では、これがコードです:
s3_client = boto3.resource('s3', region_name='eu-central-1')
そして
s3_client = boto3.client('s3', region_name='eu-central-1')
Android SDKの場合、setEndpointは問題を解決しますが、廃止されました。
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
context, "identityPoolId", Regions.US_EAST_1);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
s3.setEndpoint("s3.us-east-2.amazonaws.com");
いつかデフォルトバージョンは更新されません。このコマンドを追加
AWS_S3_SIGNATURE_VERSION = "s3v4"
settings.py
基本的にエラーは、古いバージョンのaws-sdkを使用していて、バージョンを更新してこのエラーが発生したためです。
私の場合、ノードjsでは、次のようにparmasオブジェクトでsignatureVersion
を使用していました。
const AWS_S3 = new AWS.S3({
params: {
Bucket: process.env.AWS_S3_BUCKET,
signatureVersion: 'v4',
region: process.env.AWS_S3_REGION
}
});
次に、paramsオブジェクトから署名を出力し、チャームのように動作しました。
const AWS_S3 = new AWS.S3({
params: {
Bucket: process.env.AWS_S3_BUCKET,
region: process.env.AWS_S3_REGION
},
signatureVersion: 'v4'
});