Il meccanismo di authorization che hai fornito non è supportato. Si prega di utilizzare AWS4-HMAC-SHA256

Ricevo un errore AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. quando provo a caricare il file nel secchio S3 nella nuova regione di Francoforte. Tutto funziona correttamente con la regione degli US Standard .

script:

 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)

Come sistemarlo?

Grazie.

AWS4-HMAC-SHA256, noto anche come Signature Version 4, (“V4”) è uno dei due schemi di autenticazione supportati da S3.

Tutte le regioni supportano V4, ma lo standard USA¹ e molte, ma non tutte, altre regioni, supportano anche l’altro schema precedente, Signature Version 2 (“V2”).

Secondo http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html … le nuove regioni S3 distribuite dopo gennaio 2014 supporteranno solo V4.

Da quando Francoforte è stata introdotta alla fine del 2014, non supporta V2, che è ciò che questo errore suggerisce di utilizzare.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html spiega come abilitare V4 nei vari SDK, assumendo che si stia utilizzando un SDK con tale capacità.

Vorrei ipotizzare che alcune versioni precedenti degli SDK potrebbero non supportare questa opzione, quindi se quanto sopra non aiuta, potresti aver bisogno di una versione più recente dell’SDK che stai utilizzando.


¹ US Standard è il precedente nome per la distribuzione regionale S3 che si trova nella regione us-east-1 . Dal momento in cui questa risposta è stata originariamente scritta, “Amazon S3 ha rinominato la US Standard Region nella regione degli Stati Uniti orientali (Virginia del Nord) per essere coerenti con le convenzioni di denominazione regionale di AWS”. Per tutti gli scopi pratici, è solo un cambiamento nella denominazione.

Con il nodo, prova

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

È necessario impostare signatureVersion: 'v4' in config per utilizzare la nuova versione del segno:

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

Funziona con JS SDK.

Per le persone che usano boto3 ( Python SDK ) usa il codice qui sotto

 from botocore.client import Config s3 = boto3.resource( 's3', aws_access_key_id='xxxxxx', aws_secret_access_key='xxxxxx', config=Config(signature_version='s3v4') ) 

Problema simile con PHP SDK, questo funziona:

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

Il bit importante è la signature e la region

In Java ho dovuto impostare una proprietà

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

e aggiungi la regione all’istanza di s3Client.

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

Per thumbor-aws, che ha usato boto config, avevo bisogno di metterlo in $AWS_CONFIG_FILE

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

Quindi tutto ciò che ha usato direttamente Boto senza modifiche, può essere utile

Per Android SDK, setEndpoint risolve il problema, sebbene sia stato deprecato.

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

Con boto3, questo è il codice:

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

e

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