aws - python s3 upload
problema de boto con el rol de IAM (2)
No sé si esta respuesta ayudará a alguien, pero estaba obteniendo el mismo error, tuve que resolver mi problema de manera un poco diferente. Primero, 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 solo con esas dos teclas. Leí que también necesitaba un token de seguridad, pero no tenía uno porque no tenía ningún rol de IAM. Esto es lo que hice para corregir el problema:
- Cree un rol de IAM con permisos de AmazonS3FullAccess.
- Comience una nueva instancia y adjunte mi función recién creada.
Incluso después de hacer esto, todavía no funcionó. También tuve que conectarme a la región apropiada con el siguiente código:
importar boto.s3.connection
conn = boto.s3.connect_to_region (''su-región'')
conn.get_all_buckets ()
Estoy tratando de usar la característica recientemente anunciada de "Funciones de IAM para EC2" de AWS, que permite que las credenciales de seguridad se entreguen automáticamente a las instancias de EC2. (ver http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/ ).
Configuré una instancia con un rol de IAM como se describe. También puedo obtener (aparentemente) clave de acceso / credenciales correctas con curl.
Sin embargo, boto no puede hacer una simple llamada como "get_all_buckets", aunque he activado TODOS los permisos S3 para la función.
El error que recibo es "El ID de clave de acceso de AWS que proporcionó no existe en nuestros registros"
Sin embargo, la clave de acceso que figura en el error coincide con la que obtengo de curl.
Aquí está la secuencia de comandos que falla, se ejecuta en una instancia de EC2 con una función de IAM conectada que otorga 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()
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 las variables de entorno o en un archivo de configuración del boto. Entonces, debería poder hacer esto simplemente en la instancia de EC2:
>>> import boto
>>> c = boto.connect_s3()
>>> rs = c.get_all_buckets()
La razón por la cual su enfoque manual está fallando es que las credenciales asociadas con el rol IAM son credenciales de sesión temporales y constan de una access_key
, una secret_key
y una security_token
y debe proporcionar esos tres valores al constructor S3Connection
.