python boto3 - problème de boto avec le rôle IAM




aws s3 (3)

J'essaie d'utiliser la fonctionnalité "rôles IAM pour EC2" récemment annoncée par AWS, qui permet de délivrer automatiquement les informations d'identification de sécurité aux instances EC2. (voir http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/ ).

J'ai mis en place une instance avec un rôle IAM comme décrit. Je peux également obtenir (apparemment) une clé d'accès / des informations d'identification correctes avec curl.

Cependant, boto ne parvient pas à effectuer un appel simple comme "get_all_buckets", même si j'ai activé TOUTES les autorisations S3 pour le rôle.

L'erreur que j'obtiens est "L'ID de clé d'accès AWS que vous avez fourni n'existe pas dans nos dossiers"

Cependant, la clé d'accès répertoriée dans l'erreur correspond à celle que je reçois de curl.

Voici le script défaillant, exécuté sur une instance EC2 avec un rôle IAM associé donnant toutes les autorisations 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()

Answers

Si vous utilisez boto 2.5.1 ou plus tard, c'est beaucoup plus facile que cela. Boto trouvera automatiquement les informations d'identification dans les métadonnées de l'instance et les utilisera tant qu'aucune autre information d'identification ne se trouve dans les variables d'environnement ou dans un fichier de configuration boto. Donc, vous devriez pouvoir le faire simplement sur l'instance EC2:

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

Si votre approche manuelle échoue, les informations d'identification associées au rôle IAM sont des informations d'identification de session temporaires et comprennent une access_key d' access_key , une secret_key et une security_token . Vous devez fournir ces trois valeurs au constructeur S3Connection .


Je ne sais pas si cette réponse aidera n'importe qui mais je recevais la même erreur, je devais résoudre mon problème un peu différemment. Tout d'abord, mon instance amazonienne n'avait aucun rôle IAM. Je pensais pouvoir utiliser la clé d'accès et la clé secrète, mais je n'arrivais à obtenir cette erreur qu'avec ces deux clés. J'ai lu que j'avais également besoin d'un jeton de sécurité, mais je n'en avais pas, car je n'avais aucun rôle IAM. C'est ce que j'ai fait pour corriger le problème:

  1. Créez un rôle IAM avec les autorisations AmazonS3FullAccess.
  2. Démarrez une nouvelle instance et associez mon nouveau rôle.
  3. Même après cela, cela n'a toujours pas fonctionné. Je devais également me connecter à la région appropriée avec le code ci-dessous:

    import boto.s3.connection
    conn = boto.s3.connect_to_region ('votre-région')
    conn.get_all_buckets ()


Je voudrais ajouter quelques éléments à la réponse acceptée.

Tout d'abord, assurez-vous d'avoir un Default Root Object sur votre front cloud. Comme spécifié dans la documentation cela ne s'applique pas aux subdirectories .

Lors de la configuration d'une nouvelle distribution de cloudfront, il vous sera possible de sélectionner votre bucket bucket-name.s3.amazonaws.com . Notez que la région n'est pas spécifiée dans l'URL. Ce que vous devez faire est de récupérer l'URL du site statique de s3 et l'utiliser comme origin url (la région sera là).





python amazon-s3 amazon-web-services boto