指定した認証メカニズムはサポートされていません。AWS4-HMAC-SHA256を使用してください


130

AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.新しいフランクフルト地域のS3バケットにファイルをアップロードしようとすると、エラーが発生します。すべては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)

それを修正するには?

ありがとうございました。


1
この答えは、私の問題を解決:stackoverflow.com/questions/34483795/...
Bahadir Tasdemir

回答:


151

AWS4-HMAC-SHA256、別名署名バージョン4(「V4」)は、S3でサポートされている2つの認証方式の1つです。

すべてのリージョンはV4をサポートしていますが、US-Standard¹と多くの(すべてではありません)他のリージョンも、他の古いスキームである署名バージョン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の新しいリリースが必要になる可能性があります。


¹ US Standardは、us-east-1リージョンに基づくS3リージョン展開の以前の名前です。この回答が最初に書かれたときから、 「Amazon S3はAWS標準リージョンをAWSリージョン命名規則に準拠するように米国東部(バージニア北部)リージョンに名前を変更しました。」 すべての実用的な目的のために、それは命名の変更にすぎません。


これは、Fedora 20に付属するs3cmd-1.5.0-0.alpha3.fc20.noarchを切り捨てます。また、明らかに今のところ最新の1.5.0-rc1も切り捨てます。
David Tonhofer 2014年

1
@DavidTonhofer正しいようです。s3cmd開発者はAWS4-HMAC-SHA256まだ実装していないようです: github.com/s3tools/s3cmd/issues/402
マイケル

2
@ "Michael-sqlbot"まあ、とりあえず "awscli"に切り替えました。急いでいる人のために:yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3:// $ BUCKETなど...
David Tonhofer

aws-sdk v2はAWS4-HMAC-SHA256「V4」認証を適切にサポートしているようです(関連する問題
Jeewes

thnx ..これは私に便利です
Manish Vadher '16

68

ノードで、試してください

var s3 = new AWS.S3( {
    endpoint: 's3-eu-central-1.amazonaws.com',
    signatureVersion: 'v4',
    region: 'eu-central-1'
} );

34

あなたは、設定すべきsignatureVersion: 'v4'config新しい看板バージョンを使用します:

AWS.config.update({
    signatureVersion: 'v4'
});

以下のための作品集JSSDK。


3
私の日を救った!なぜこのオプションがもっと宣伝されないのかわからない
アンドレ・Werlang

26

boto3Python 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')
)

4
エラーが発生するため、上記のコードAuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 に追加region_name='us-east-2' しました
Aseem

13

PHP SDKの同様の問題、これは動作します:

$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));

重要なのはsignatureregion


地域を指定する必要がありますか?
Chirag Mehta


3

Javaでは、プロパティを設定する必要がありました

System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")

リージョンをs3Clientインスタンスに追加します。

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))

3

boto3では、これはコードです。

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

または

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

あなたは2回s3_clientを持っていますか?
MH

2

boto設定を使用した親指のあわについては、これを $AWS_CONFIG_FILE

[default]
aws_access_key_id = (your ID)
aws_secret_access_key = (your secret key)
s3 =
    signature_version = s3

したがって、変更なしで直接botoを使用したものは、これが役立つ場合があります


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

これにより、24時間サーフィンした後の時間も節約できました。


これはうまく機能します。「ap-south-1」でない場合は、リージョン名を自分の名前に変更する必要があります
Devman

コーディングの変更は必要ありません!これら2つの
環境

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");

1

基本的には、aws-sdkの古いバージョンを使用していて、バージョンを更新してこのエラーが発生したため、エラーが発生しました。

私の場合、ノードjsで私はsignatureVersionこのようなparmasオブジェクトで使用していました:

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'
});

1

AWS S3バケットリージョンを確認し、接続リクエストで適切なリージョンを渡します。

私のセナリオではアジア太平洋(ムンバイ)のAPSouth1」を設定しました

using (var client = new AmazonS3Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.APSouth1))
{
    GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
    {
        BucketName = bucketName,
        Key = keyName,
        Expires = DateTime.Now.AddMinutes(50),
    };
    urlString = client.GetPreSignedURL(request1);
}

1

Boto3では、このコードを使用します。

import boto3
from botocore.client import Config


s3 = boto3.resource('s3',
        aws_access_key_id='xxxxxx',
        aws_secret_access_key='xxxxxx',
        region_name='us-south-1',
        config=Config(signature_version='s3v4')
        )

1

私の場合、リクエストのタイプが間違っていました。私はGET(dumb)を使用していました。PUTである必要があります。


私の場合はPOSTを使用していたので、1日が節約できました。
Shahid Kamal

0

デフォルトバージョンが更新されない場合があります。このコマンドを追加

AWS_S3_SIGNATURE_VERSION = "s3v4"

settings.py


0

この組み合わせを試してください。

const s3 = new AWS.S3({
  endpoint: 's3-ap-south-1.amazonaws.com',       // Bucket region
  accessKeyId: 'A-----------------U',
  secretAccessKey: 'k------ja----------------soGp',
  Bucket: 'bucket_name',
  useAccelerateEndpoint: true,
  signatureVersion: 'v4',
  region: 'ap-south-1'             // Bucket region
});

0

Flaskのコード(boto3)

設定をインポートすることを忘れないでください。また、独自の構成クラスがある場合は、その名前を変更します。

from botocore.client import Config

s3 = boto3.client('s3',config=Config(signature_version='s3v4'),region_name=app.config["AWS_REGION"],aws_access_key_id=app.config['AWS_ACCESS_KEY'], aws_secret_access_key=app.config['AWS_SECRET_KEY'])
s3.upload_fileobj(file,app.config["AWS_BUCKET_NAME"],file.filename)
url = s3.generate_presigned_url('get_object', Params = {'Bucket':app.config["AWS_BUCKET_NAME"] , 'Key': file.filename}, ExpiresIn = 10000)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.