Le mécanisme d'autorisation que vous avez fourni n'est pas pris en charge. Veuillez utiliser AWS4-HMAC-SHA256


130

J'obtiens une erreur AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.lorsque j'essaye de télécharger un fichier dans le compartiment S3 dans la nouvelle région de Francfort. Tout fonctionne correctement avec la US Standardrégion.

Scénario:

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)

Comment le réparer?

Je vous remercie.


1
Cette réponse a résolu mon problème: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Réponses:


151

AWS4-HMAC-SHA256, également connu sous le nom de Signature Version 4, ("V4") est l'un des deux schémas d'authentification pris en charge par S3.

Toutes les régions prennent en charge la version 4, mais US-Standard¹, et de nombreuses autres régions, mais pas toutes, prennent également en charge l'autre modèle plus ancien, Signature Version 2 («V2»).

Selon http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... les nouvelles régions S3 déployées après janvier 2014 ne prendront en charge que la V4.

Depuis que Francfort a été introduit à la fin de 2014, il ne prend pas en charge V2, ce que cette erreur suggère que vous utilisez.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html explique comment activer V4 dans les différents SDK, en supposant que vous utilisez un SDK doté de cette capacité.

Je suppose que certaines anciennes versions des SDK peuvent ne pas prendre en charge cette option, donc si ce qui précède ne vous aide pas, vous aurez peut-être besoin d'une version plus récente du SDK que vous utilisez.


¹ US Standardest l'ancien nom du déploiement régional S3 basé dans la us-east-1région. Depuis la rédaction de cette réponse, «Amazon S3 a renommé la région standard des États-Unis en région USA Est (Virginie du Nord) pour être cohérente avec les conventions de dénomination régionales AWS». À toutes fins pratiques, ce n'est qu'un changement de nom.


Cela stumps s3cmd-1.5.0-0.alpha3.fc20.noarch qui vient avec Fedora 20. Et apparemment aussi les souches 1.5.0-rc1 , le dernier pour le moment.
David Tonhofer

1
@DavidTonhofer cela semble juste. Il semble que les développeurs de s3cmd ne soient pas AWS4-HMAC-SHA256encore implémentés: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot

2
@ "Michael - sqlbot" et bien je suis passé à "awscli" pour le moment. Pour ceux qui sont pressés: yum install python-pip; pip install awscli; aws configure; aws --region = eu-central-1 s3 ls s3: // $ BUCKET etc ...
David Tonhofer

aws-sdk v2 semble bien prendre en charge l'authentification AWS4-HMAC-SHA256 "V4" ( problème connexe )
Jeewes

thnx .. cela m'est utile
Manish Vadher

68

Avec node, essayez

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

34

Vous devez définir signatureVersion: 'v4'à configutiliser une nouvelle version de signe:

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

Fonctionne pour JSsdk.


3
J'ai sauvé ma journée! Je ne sais pas pourquoi cette option n'est pas plus médiatisée
André Werlang

26

Pour les personnes utilisant boto3( Python SDK), utilisez le code ci-dessous

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
J'obtiens une erreur AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 J'ai donc ajouté region_name='us-east-2' au code ci-dessus
Aseem

13

Problème similaire avec le SDK PHP, cela fonctionne:

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

L'important est le signatureet leregion


La région doit-elle être spécifiée?
Chirag Mehta


3

En Java, j'ai dû définir une propriété

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

et ajoutez la région à l'instance s3Client.

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

3

Avec boto3, voici le code:

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

ou

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

vous avez s3_client deux fois?
MH

2

Pour thumbor-aws, qui utilisait boto config, j'avais besoin de le mettre $AWS_CONFIG_FILE

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

Donc, tout ce qui a utilisé boto directement sans changement, cela peut être utile


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

cela m'a également permis de gagner du temps après avoir surfé pendant 24 heures.


Cela fonctionne très bien, il vous suffit de changer le nom de la région pour l'adapter au vôtre si ce n'est pas "ap-south-1"
Devman

Aucun changement de codage nécessaire! Définissez ces deux variables d'environnement et le boto fonctionnera bien
Stevko

1

Pour Android SDK, setEndpoint résout le problème, bien qu'il soit obsolète.

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

1

Fondamentalement, l'erreur était due au fait que j'utilisais l'ancienne version de aws-sdk et que j'ai mis à jour la version, donc cette erreur s'est produite.

dans mon cas avec le nœud js que signatureVersionj'utilisais dans un objet parmas comme celui-ci:

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

Ensuite, j'ai mis la signature hors de l'objet params et j'ai travaillé comme du charme:

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

1

Vérifiez votre région de compartiment AWS S3 et transmettez la région appropriée dans la demande de connexion.

Dans My Senario, j'ai défini ' APSouth1 ' pour l' Asie-Pacifique (Mumbai)

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

Pour Boto3, utilisez ce 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')
        )


0

Parfois, la version par défaut ne sera pas mise à jour. Ajoutez cette commande

AWS_S3_SIGNATURE_VERSION = "s3v4"

dans settings.py


0

Essayez cette combinaison.

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

Code pour Flask (boto3)

N'oubliez pas d'importer Config. Aussi, si vous avez votre propre classe de configuration, changez son nom.

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.