problema de boto con el rol IAM


Estoy tratando de usar la función "Roles de IAM para EC2" recientemente anunciada de AWS, que permite que las credenciales de seguridad se entreguen automáticamente a las instancias de EC2. (véase http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/).

He configurado una instancia con un rol IAM como se describe. También puedo obtener (aparentemente) la clave de acceso / credenciales adecuadas con curl.

Sin embargo, boto no puede hacer una llamada simple como "get_all_buckets", aunque He activado TODOS los permisos de S3 para el rol.

El error que obtengo es"El Id de clave de acceso de AWS que proporcionó no existe en nuestros registros"

Sin embargo, la clave de acceso que aparece en el error coincide con la que obtengo de curl.

Aquí está el script que falla, ejecutado en una instancia EC2 con un rol IAM adjunto que da todos los permisos de S3:

import urllib2
import ast
from boto.s3.connection import S3Connection

resp=urllib2.urlopen('http://169.254.169.254/latest/meta-data/iam/security-credentials/DatabaseApp').read()
resp=ast.literal_eval(resp)
print "access:" + resp['AccessKeyId']
print "secret:" + resp['SecretAccessKey']
conn = S3Connection(resp['AccessKeyId'], resp['SecretAccessKey'])
rs= conn.get_all_buckets()
Author: Nils, 2012-06-21

2 answers

Si está utilizando boto 2.5.1 o posterior, en realidad es mucho más fácil que esto. Boto buscará automáticamente las credenciales en los metadatos de la instancia y las usará siempre que no se encuentren otras credenciales en variables de entorno o en un archivo de configuración de boto. Por lo tanto, debería poder hacer esto simplemente en la instancia EC2:

>>> import boto
>>> c = boto.connect_s3()
>>> rs = c.get_all_buckets()

La razón por la que su enfoque manual está fallando es que las credenciales asociadas con el rol IAM son una credencial de sesión temporal y consisten en an access_key, a secret_key y a security_token y necesita suministrar los tres valores al constructor S3Connection.

 61
Author: garnaat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-15 12:48:40

No se si esta respuesta va a ayudar a alguien pero estaba recibiendo el mismo error, tuve que resolver mi problema un poco diferente. En primer lugar, mi instancia de Amazon no tenía ningún rol de IAM. Pensé que podría usar la clave de acceso y la clave secreta, pero seguí recibiendo este error con solo esas dos claves. Leí que necesitaba un token de seguridad también, pero no tenía uno porque no tenía ningún rol de IAM. Esto es lo que hice para corregir el problema:

  1. Crear un rol de IAM con AmazonS3FullAccess permisos.
  2. Inicie una nueva instancia y adjunte mi rol recién creado.
  3. Incluso después de hacer esto, todavía no funcionó. También tuve que conectarme a la región adecuada con el siguiente código:

    Importar boto.s3.conexión
    conn = boto.s3.connect_to_region('su-región')
    control.get_all_buckets ()

 5
Author: Gabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-27 22:28:39