Der von Ihnen bereitgestellte Autorisierungsmechanismus wird nicht unterstützt. Bitte verwenden Sie AWS4-HMAC-SHA256

130

Ich erhalte eine Fehlermeldung, AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.wenn ich versuche, eine Datei in den S3-Bucket in der neuen Region Frankfurt hochzuladen. Alles funktioniert einwandfrei mitUS Standard Region.

Skript:

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)

Wie man es repariert?

Danke dir.

Alexey
quelle
1
Diese Antwort löste mein Problem: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Antworten:

151

AWS4-HMAC-SHA256, auch als Signaturversion 4 ("V4") bekannt, ist eines von zwei von S3 unterstützten Authentifizierungsschemata.

Alle Regionen unterstützen V4, aber US-Standard¹, und viele - aber nicht alle - andere Regionen unterstützen auch das andere, ältere Schema, Signature Version 2 ("V2").

Laut http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... werden neue S3-Regionen, die nach Januar 2014 bereitgestellt wurden, nur V4 unterstützen.

Da Frankfurt Ende 2014 eingeführt wurde, wird V2 nicht unterstützt. Dieser Fehler deutet darauf hin, dass Sie es verwenden.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html erläutert, wie Sie V4 in den verschiedenen SDKs aktivieren, vorausgesetzt, Sie verwenden ein SDK mit dieser Funktion.

Ich würde spekulieren, dass einige ältere Versionen der SDKs diese Option möglicherweise nicht unterstützen. Wenn dies nicht hilft, benötigen Sie möglicherweise eine neuere Version des von Ihnen verwendeten SDK.


¹ US Standardist der frühere Name für die regionale Bereitstellung von S3 in der us-east-1Region. Seit der ursprünglichen Erstellung dieser Antwort wurde "Amazon S3 die US-Standardregion in die Region US-Ost (N. Virginia) umbenannt, um den regionalen Namenskonventionen von AWS zu entsprechen." Für alle praktischen Zwecke ist es nur eine Änderung der Benennung.

Michael - sqlbot
quelle
Dies stumpft s3cmd-1.5.0-0.alpha3.fc20.noarch, das mit Fedora 20 geliefert wird. Und anscheinend stumpft auch 1.5.0-rc1 , das neueste für jetzt.
David Tonhofer
1
@ DavidTonhofer das scheint richtig. Es sieht so aus, als hätten die s3cmd-Entwickler noch nichts AWS4-HMAC-SHA256implementiert: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot
2
@ "Michael - sqlbot" Nun, ich habe vorerst zu "awscli" gewechselt. Für diejenigen, die es eilig haben: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer
aws-sdk v2 scheint die AWS4-HMAC-SHA256 "V4" -Authentifizierung gut zu unterstützen (verwandtes Problem )
Jeewes
Danke .. das ist nützlich für mich
Manish Vadher
68

Versuchen Sie es mit Node

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

Sie sollten setzen signatureVersion: 'v4'in configneue Zeichen Version zu verwenden:

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

Funktioniert für JSSDK.

Denis Rizun
quelle
3
Rettete meinen Tag! Nicht sicher, warum diese Option nicht mehr bekannt gemacht wird
André Werlang
26

Verwenden Sie für Benutzer von boto3( Python SDK) den folgenden Code

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)
Penkey Suresh
quelle
4
Ich erhalte eine Fehlermeldung AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Also habe ich region_name='us-east-2' den obigen Code hinzugefügt
Aseem
13

Ähnliches Problem mit dem PHP SDK, dies funktioniert:

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

Das Wichtige ist das signatureund dasregion

Pascal
quelle
Muss die Region angegeben werden?
Chirag Mehta
3

In Java musste ich eine Eigenschaft festlegen

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

und fügen Sie die Region der s3Client-Instanz hinzu.

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
GameScripting
quelle
3

Bei boto3 ist dies der Code:

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

oder

s3_client = boto3.client('s3', region_name='eu-central-1')
Benoit
quelle
du hast s3_client zweimal?
MH
2

Für thumbor-aws, die boto config verwendeten, musste ich dies auf die setzen $AWS_CONFIG_FILE

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

Alles, was Boto direkt ohne Änderungen verwendet hat, kann nützlich sein

Higuita
quelle
2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

Dies sparte mir auch Zeit nach dem 24-stündigen Surfen.

Smartybrainy
quelle
Dies funktioniert hervorragend, Sie müssen nur den Namen der Region ändern, um ihn an Ihre
anzupassen,
Keine Codierungsänderungen notwendig! Stellen Sie diese beiden Umgebungsvariablen ein und boto wird gut funktionieren
Stevko
1

Für Android SDK löst setEndpoint das Problem, obwohl es veraltet ist.

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context, "identityPoolId", Regions.US_EAST_1);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
s3.setEndpoint("s3.us-east-2.amazonaws.com");
Ian Darke
quelle
1

Grundsätzlich lag der Fehler daran, dass ich die alte Version von aws-sdk verwendet und die Version aktualisiert habe, sodass dieser Fehler auftrat.

in meinem Fall mit Knoten js habe ich signatureVersionin parmas Objekt wie folgt verwendet:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    signatureVersion: 'v4',
    region: process.env.AWS_S3_REGION
  }
});

Dann habe ich die Signatur aus dem params-Objekt entfernt und wie ein Zauber gearbeitet:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    region: process.env.AWS_S3_REGION
  },
  signatureVersion: 'v4'
});
Salahudin Malik
quelle
1

Überprüfen Sie Ihre AWS S3-Bucket- Region und übergeben Sie die richtige Region in der Verbindungsanforderung.

In My Senario habe ich ' APSouth1 ' für den asiatisch-pazifischen Raum (Mumbai) eingestellt.

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);
}
Ravi Oza
quelle
1

Verwenden Sie für Boto3 diesen Code.

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')
        )
Pushplata
quelle
1

In meinem Fall war der Anforderungstyp falsch. Ich habe GET (dumm) benutzt. Es muss PUT sein.

ManiKandan Selvanathan
quelle
Ich habe meinen Tag gerettet, in meinem Fall habe ich POST verwendet.
Shahid Kamal
0

Manchmal wird die Standardversion nicht aktualisiert. Fügen Sie diesen Befehl hinzu

AWS_S3_SIGNATURE_VERSION = "s3v4"

im settings.py

gokul krishna
quelle
0

Versuchen Sie diese Kombination.

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
});
Ankit Kumar Rajpoot
quelle
0

Code für Flasche (boto3)

Vergessen Sie nicht, Config zu importieren. Wenn Sie eine eigene Konfigurationsklasse haben, ändern Sie deren Namen.

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)
P. Gupta
quelle