2012-11-21 14 views
5

Ich versuche ein Bootstrap-Skript zu erstellen, um EC2-Instanzen einzurichten. Ich möchte, dass die Instanzen während des Starts automatisch Quellcode aus einem S3-Bucket herunterladen. Ich habe kürzlich gelesen, dass ich meinen EC2-Instanzen eine IAM-Rolle zugewiesen habe, damit sie temporäre Anmeldeinformationen vom Metadatenserver erhalten können. Auf diese Weise muss ich keine AWS-Anmeldeinformationen in meinem Image speichern oder sie während des Startvorgangs weitergeben.AWS - boto.connect_s3() -Berichterstellung "Während der Initialisierung der EC2-Instanz war kein Handler zur Authentifizierung bereit"

Ich schrieb ein Python-Skript, das den Download durch Verbinden mit S3 mit Boto durchführt. Ich habe dieses Skript an die init.d-Konfiguration angeschlossen. Mein Skript funktioniert einwandfrei, wenn ich es manuell in einer Remote-SSH-Sitzung ausführe, aber aus irgendeinem Grund schlägt es fehl, wenn es beim Booten ausgeführt wird.

Mein Code verwendet Boto auf folgende Weise:

import boto 
try: 
    conn = boto.connect_s3() 
except: 
    # log error 
    exit(-1) 

In der Theorie mit Boto 2.6, dass Code sollte den AWS-Metadaten-Server in Verbindung, um temporäre Sicherheitsnachweise basierend auf der IAM Rolle der aktuellen EC2-Instanz zu erhalten .

Aus irgendeinem Grund während des Bootens, boto.connect_s3() wirft eine boto.exception.NoAuthHandlerFound: ". Kein Handler war bereit zu authentifizieren 1 Handler geprüft wurden [ 'HmacAuthV1Handler'] Ihre Anmeldeinformationen prüfen".

Ich verfolgt den Fehler bis zum boto.auth module, in der Funktion get_auth_handler (der einzige Ort, an dem diese Ausnahme ausgelöst wird). Wenn das HmacAuthV1Handler-Objekt erstellt wird, schlägt der HmacKeys-Basisklassenkonstruktor fehl, wenn die Zugriffsschlüssel-ID oder der geheime Schlüssel None lautet. Nach ein paar Experimenten in meinem Skript habe ich festgestellt, dass, wenn ich explizit eine Instanz der boto.provider.Provider class mit name = 'aws' und keine Anmeldeinformationen erstelle, die Felder access_key/secret_key der Provider-Instanz beide None bleiben (aber nur während des Bootvorgangs; Anmeldeinformationen werden initialisiert, wenn ich das Skript später manuell ausführe). Dennoch weiß ich, dass der Metadaten-Server nicht der Schuldige ist (ein GET gibt tatsächlich die erwarteten Berechtigungsnachweise zurück, sogar während des Bootens).

Also ... Was könnte falsch sein? Könnte es ein Problem in Boto sein? Ein Config-Problem? Oder mache ich nur etwas falsch? Verdammt, könnte es sein, dass Ubuntu nicht in einem "richtigen Zustand" für diese Art von Operationen während des Bootens ist?

--- EDIT ---

Dank garnaat der unten beantworten, fand ich, dass das Problem ist, dass der Python-Pfad (sys.path) während des Bootvorgangs ist völlig anders als während meiner Remote-SSH-Sitzung.

Beim Booten:

['/home/bitnami', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages'] 

und wenn es von meiner SSH-Sitzung ausgeführt wird:

['/home/bitnami', 
'/opt/bitnami/python/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/MySQL_python-1.2.3c1-py2.7-linux-i686.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/html5lib-0.90-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/boto-2.6.0-py2.7.egg', 
'/opt/bitnami/python/lib/python2.7/site-packages/pip-1.2.1-py2.7.egg', 
'/opt/bitnami/apps/django/lib/python2.7/site-packages', 
'/home/bitnami/deploy', 
'/opt/bitnami/python/lib/python27.zip', 
'/opt/bitnami/python/lib/python2.7', 
'/opt/bitnami/python/lib/python2.7/plat-linux2', 
'/opt/bitnami/python/lib/python2.7/lib-tk', 
'/opt/bitnami/python/lib/python2.7/lib-old', 
'/opt/bitnami/python/lib/python2.7/lib-dynload', 
'/opt/bitnami/python/lib/python2.7/site-packages', 
'/opt/bitnami/python/lib/python2.7/site-packages/PIL'] 

(ich verwendet, um die 32-Bit-BitNami DjangoStack 1.4.2-1 Bild als meine Basis-Image.)

Antwort

9

Sie erwähnen, dass Sie auf Ubuntu laufen. Ich weiß, dass viele Ubuntu-Distributionen eine ältere Version von Boto vorinstalliert haben. Ich denke, es ist möglich, dass während des Startvorgangs diese ältere Version von Boto gefunden und verwendet wird, die nicht versteht, wie die Anmeldeinformationen von IAM-Rollen abgerufen werden.

Um dies zu testen, versuchen Sie, boto.Version in Ihrem Skript zu protokollieren und zu sehen, ob es 2.6.0 ist oder nicht.

+0

Ich benutze tatsächlich ein [BitNami DjangoStack Bild] (http://bitnami.org/stack/djangostack) und installiert Boto 2.6 mit Pip. Es könnte in der Tat ein Problem mit dem Booten sein, das unter einem anderen Benutzer getan wird, und folglich das falsche boto verwendend, wie Sie vorschlugen. Ich werde es überprüfen und Sie wissen lassen. – mbargiel

+1

Bingo, du hast es richtig gemacht! Während des Starts wird boto 2.2.2 und nicht 2.6 verwendet, und die Unterstützung für metadatenbasierte Anmeldeinformationen wurde um 2.5 herum eingeführt. – mbargiel