2012-06-21 10 views
22

Ich versuche, die kürzlich von AWS angekündigte Funktion "IAM-Rollen für EC2" zu verwenden, mit der Sicherheitsnachweise automatisch an EC2-Instanzen übermittelt werden können. (siehe http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/).BOTO-Problem mit IAM-Rolle

Ich habe eine Instanz mit einer IAM-Rolle wie beschrieben eingerichtet. Ich kann auch (scheinbar) richtige Zugangsschlüssel/Zugangsdaten mit curl bekommen.

Boto führt jedoch keinen einfachen Aufruf wie "get_all_buckets" aus, obwohl ich ALLE S3-Berechtigungen für die Rolle aktiviert habe.

Der Fehler, den ich bekommen ist „Die AWS Access Key Id Sie nicht in unseren Unterlagen zur Verfügung gestellt existieren“

jedoch der Zugriffsschlüssel in dem Fehler aufgelistet übereinstimmt, die ich von curl bekommen.

Hier ist das fehlerhafte Skript auf einer EC2-Instanz mit einer IAM-Rolle ausführen angebracht, die alle S3-Berechtigungen gibt:

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() 

Antwort

60

Wenn Sie Boto 2.5.1 verwenden oder es später eigentlich viel einfacher als diese. Boto findet automatisch die Anmeldeinformationen in den Instanzmetadaten für Sie und verwendet sie, solange keine anderen Anmeldeinformationen in Umgebungsvariablen oder in einer Boto-Konfigurationsdatei gefunden werden. Also, sollten Sie in der Lage sein, diese Instanz auf der EC2 einfach zu tun:

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

Der Grund, dass Ihr manueller Ansatz versagt wird, ist, dass die mit der IAM Rolle zugeordnet Anmeldeinformationen eine temporäre Sitzung Anmeldeinformationen und besteht aus einem access_key, a secret_key und security_token und Sie müssen alle drei dieser Werte an den S3Connection Konstruktor liefern.

+0

Für die manuelle Vorgehensweise, haben Sie Recht, Hinzufügen der Security_Token behoben. Vielen Dank! Ich habe dich als "Antwort" dafür markiert. – Nils

+0

Die vereinfachte Version, die Sie gepostet haben, funktioniert auch nach dem Upgrade auf 2.5.1. Also wenn ich dir 2 Anerkennungen geben könnte, würde ich es tun! – Nils

+0

Schön, dass es jetzt für dich funktioniert. Ich mag das neue IAM Roles-Feature, es ist wirklich glatt. – garnaat

5

Ich weiß nicht, ob diese Antwort jedem helfen wird, aber ich bekam den gleichen Fehler, ich musste mein Problem ein wenig anders lösen. Erstens, meine Amazon-Instanz hatte keine IAM-Rollen. Ich dachte, ich könnte nur den Zugriffsschlüssel und den geheimen Schlüssel verwenden, aber ich habe diesen Fehler nur mit diesen beiden Schlüsseln erhalten. Ich habe gelesen, dass ich auch einen Sicherheitstoken brauchte, aber ich hatte keinen, weil ich keine IAM-Rollen hatte. Dies ist, was ich getan habe, um das Problem zu beheben:

  1. Erstellen Sie eine IAM-Rolle mit AmazonS3FullAccess-Berechtigungen.
  2. Starten Sie eine neue Instanz und fügen Sie meine neu erstellte Rolle an.
  3. Selbst nachdem dies getan wurde, hat es immer noch nicht funktioniert. Ich musste auch unten mit dem Code auf den richtigen Bereich verbinden:

    Import boto.s3.connection
    conn = boto.s3.connect_to_region ('your-Region')
    conn.get_all_buckets()

+2

Danke, Es ist hilfreich, ich habe das gleiche Problem in diesen Tagen. – timesking

+0

Einstellung AWS_DEFAULT_REGION hat den Trick gemacht, aber warum nicht Boto das aus den Instanzdaten zu bekommen? –