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.

Alexey
la source
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.

Michael - sqlbot
la source
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'
} );
morris4
la source
34

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

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

Fonctionne pour JSsdk.

Denis Rizun
la source
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')
)
Penkey Suresh
la source
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

Pascal
la source
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))
GameScripting
la source
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')
Benoit
la source
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

higuita
la source
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.

Smartybrainy
la source
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");
Ian Darke
la source
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'
});
Salahudin Malik
la source
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);
}
Ravi Oza
la source
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')
        )
Pushplata
la source
1

Dans mon cas, le type de demande était incorrect. J'utilisais GET (stupide) Ça doit être PUT.

ManiKandan Selvanathan
la source
J'ai sauvé ma journée, dans mon cas, j'utilisais POST.
Shahid Kamal le
0

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

AWS_S3_SIGNATURE_VERSION = "s3v4"

dans settings.py

gokul krishna
la source
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
});
Ankit Kumar Rajpoot
la source
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)
P. Gupta
la source