web-dev-qa-db-fra.com

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

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

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.

107
Alexey

AWS4-HMAC-SHA256, également appelé 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 V4, à l'exception de la norme américaine¹, et de nombreuses régions, mais pas toutes, prennent également en charge le système 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 V4.

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

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

Je suppose que certaines versions plus anciennes du SDK pourraient ne pas prendre en charge cette option. Par conséquent, si les solutions ci-dessus ne vous aident pas, vous aurez peut-être besoin d'une version plus récente du SDK que vous utilisez.


¹US Standard est l'ancien nom du déploiement régional S3 basé dans la région us-east-1. Depuis le moment où cette réponse a été écrite à l'origine, "" Amazon S3 a renommé la région US Standard en région US East (Virginie du Nord) pour être conforme aux conventions de dénomination régionales AWS. " Pour des raisons pratiques, il ne s'agit que d'un changement de nom.

139
Michael - sqlbot

Avec noeud, essayez

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

Vous devez définir signatureVersion: 'v4' dans config pour utiliser la nouvelle version de signe:

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

Fonctionne pour JS sdk.

27
Denis Rizun

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')
)
22
Penkey Suresh

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

Le bit important est le signature et le region

12
Pascal

J'utilisais Django et je devais ajouter ces variables de configuration supplémentaires pour que cela fonctionne. (en plus des paramètres mentionnés dans 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"
7
SuperNova

Dans Java je devais 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
GameScripting

Pour thumbor-aws, qui utilisait boto config, je devais mettre cela au $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 utilise boto directement sans modifications, cela peut être utile

2
higuita

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')
2
Benoit

Pour Android SDK, setEndpoint résout le problème, même s'il est 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
Ian Darke

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

AWS_S3_SIGNATURE_VERSION = "s3v4"

dans settings.py

0
gokul krishna

En gros, l'erreur était due au fait que j'utilisais l'ancienne version d'aws-sdk et que j'ai mis à jour la version afin que cette erreur se produise.

dans mon cas avec le noeud js, j'utilisais signatureVersion dans un objet Parmas comme ceci:

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 sur l'objet params et j'ai travaillé comme un charme:

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