Uso de boto para AWS S3 Buckets para Signature V4

Tengo un problema con el uso de Python-Boto SDK para S3 Buckets para la región de Frankfurt. Según el enlace de Amazon esta región solo soportará V4. Este documento explica cómo agregar soporte V4 para Boto SDK. He añadido una nueva sección:

if not boto.config.get('s3', 'use-sigv4'): boto.config.add_section('s3') boto.config.set('s3', 'use-sigv4', 'True') 

y luego he creado una nueva conexión y tengo todos los cubos:

 connection = S3Connection(accesskey, secretkey, host=S3Connection.DefaultHost) buckets = connection.get_all_buckets() 

funciona bien, pero luego traté de obtener todas las llaves de mi cubo:

 for bucket in buckets: bucket.get_all_keys() 

y obtuve lo siguiente:

 S3ResponseError: 400 Bad Request  AuthorizationHeaderMalformedThe authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'eu-central-1 

¿Por qué ocurrió? Después de eso me conecté a la región y obtuve todos los datos necesarios:

 region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey) bucket = region_con.get_bucket(bucket.name) bucket.get_all_keys() 

¿Cómo puedo arreglarlo correctamente?

Tuve el mismo problema con Boto. La región fue Frankfurt y obtuvo errores sobre regiones equivocadas. La solución para mí fue simplemente apuntar a un host (un URI obtenido de esta página http://docs.aws.amazon.com/general/latest/gr/rande.html ) a ‘s3.eu-central-1.amazonaws .com ‘en lugar del predeterminado ‘ s3.amazonaws.com ‘

 s3 = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey, host='s3.eu-central-1.amazonaws.com') 

Intenta eliminar s3 de boto config, el siguiente código me funciona

if 's3' in boto.config.sections(): boto.config.remove_section('s3')

La respuesta anterior de hsrv funciona para boto 2. Para boto3 , lo siguiente es ampliamente equivalente:

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

Alternativamente, puede establecer el campo de region en su .aws/config :

 [default] output = json region = eu-central-1 

Esto establece la región por defecto; Todavía puedes elegir una región específica en Python como se muestra arriba.

La importancia de la región varía de un servicio a otro (por ejemplo, suponiendo que no está sentado en una VPC, puede acceder a un grupo de S3 desde cualquier lugar). Sin embargo, en este caso, lo importante es que las regiones más nuevas (como Frankfurt) solo admiten el esquema de autenticación más nuevo (AWS4-HMAC-SHA256). Boto se enfrenta a problemas si intenta conectarse a cualquier cosa en una región de este tipo desde una región que aún usa el esquema anterior (como Dublín).

para boto2 – agregando esto a la configuración de .boto funcionó

 [s3] use-sigv4 = True host=s3.eu-central-1.amazonaws.com