aws ruby amazon-s3 aws-sdk

ruby - El mecanismo de autorización que ha proporcionado no es compatible. Utilice AWS4-HMAC-SHA256



aws sdk ruby v3 (9)

AWS4-HMAC-SHA256, también conocido como Signature Version 4 ("V4") es uno de los dos esquemas de autenticación admitidos por S3.

Todas las regiones admiten V4, pero US-Standard¹, y muchas, pero no todas, otras regiones, también admiten el otro esquema anterior, Signature Version 2 ("V2").

Según http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... las nuevas regiones S3 desplegadas después de enero de 2014 solo admitirán V4.

Dado que Frankfurt se introdujo a finales de 2014, no es compatible con V2, que es lo que sugiere este error que está utilizando.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html explica cómo habilitar V4 en los diversos SDK, suponiendo que está utilizando un SDK que tiene esa capacidad.

Me gustaría especular que algunas versiones anteriores de los SDK podrían no admitir esta opción, por lo que si lo anterior no ayuda, es posible que necesite una versión más reciente del SDK que está utilizando.

¹ US Standard es el nombre anterior para la implementación regional S3 que se basa en la región us-east-1 . Desde el momento en que se escribió originalmente esta respuesta, "Amazon S3 cambió el nombre de la región estándar de EE. UU. A la región este de EE. UU. (N. Virginia) para que sea coherente con las convenciones regionales de denominación de AWS". Para todos los propósitos prácticos, es solo un cambio en la denominación.

Obtengo un error 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. cuando intento subir el archivo al cubo S3 en la nueva región de Frankfurt. Todo funciona correctamente con US Standard región US Standard . US Standard .

Guión:

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)

¿Como arreglarlo?

Gracias.


Con boto3, este es el código:

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

y

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


Con el nodo, prueba

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


Debe configurar signatureVersion: ''v4'' en config para usar la nueva versión de firma:

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

Funciona para JS SDK.


En Java tuve que establecer una propiedad

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

y agrega la región a la instancia de s3Client.

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


Para Android SDK, setEndpoint resuelve el problema, aunque ha quedado obsoleto.

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


Para las personas que usan boto3 ( Python SDK ), utiliza el siguiente código

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


Para thumbor-aws, que usaba configuración de boto, necesitaba poner esto en $AWS_CONFIG_FILE

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

Entonces, cualquier cosa que use boto directamente sin cambios, esto puede ser útil


Problema similar con el PHP SDK, esto funciona:

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

El bit importante es la signature y la region