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.
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.
Avec noeud, essayez
var s3 = new AWS.S3( {
endpoint: 's3-eu-central-1.amazonaws.com',
signatureVersion: 'v4',
region: 'eu-central-1'
} );
Vous devez définir signatureVersion: 'v4'
dans config
pour utiliser la nouvelle version de signe:
AWS.config.update({
signatureVersion: 'v4'
});
Fonctionne pour JS
sdk.
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')
)
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
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"
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))
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
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')
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");
Parfois, la version par défaut ne sera pas mise à jour. Ajouter cette commande
AWS_S3_SIGNATURE_VERSION = "s3v4"
dans settings.py
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'
});