2012-11-21 10 views
5

Próbuję utworzyć skrypt startowy, aby skonfigurować instancje EC2. Chcę, aby instancje automatycznie pobierały kod źródłowy z zasobnika S3 podczas rozruchu. Ostatnio przeczytałem o przypisaniu roli IAM do moich instancji EC2, aby mogły uzyskać tymczasowe referencje z serwera metadanych. W ten sposób nie muszę przechowywać danych uwierzytelniających AWS na moim obrazie ani przekazywać ich podczas uruchamiania.AWS - boto.connect_s3() raportowanie "Żaden przewodnik nie był gotowy do uwierzytelnienia", podczas gdy instancja EC2 uruchamia się

Napisałem skrypt w języku Python, który wykonuje pobieranie, łącząc się z S3 przy użyciu boto. Podłączyłem ten skrypt do konfiguracji init.d. Mój skrypt działa dobrze, gdy uruchamiam go ręcznie, w zdalnej sesji SSH, ale z jakiegoś powodu nie powiedzie się, gdy zostanie wykonany podczas uruchamiania.

Moje kod wykorzystuje Boto w następujący sposób:

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

Teoretycznie z boto 2.6, że kod powinien skontaktować się z serwerem metadanych AWS, aby uzyskać tymczasowe poświadczenia bezpieczeństwa w oparciu o IAM Rola bieżącej instancji EC2 .

Z jakiegoś powodu, podczas uruchamiania, boto.connect_s3() podnosi boto.exception.NoAuthHandlerFound: . „Nie był gotowy do obsługi uwierzytelnienia sprawdzono 1 koparki [«HmacAuthV1Handler»] Sprawdź swoje dane”.

Śledziłem błąd do boto.auth module, w funkcji get_auth_handler (jedyne miejsce, w którym ten wyjątek został zgłoszony). Po utworzeniu obiektu HmacAuthV1Handler konstruktor klasy podstawowej programu HmacKeys kończy się niepowodzeniem, jeśli klucz dostępu lub tajny klucz to Brak. Rzeczywiście, po krótkim eksperymencie w moim skrypcie, stwierdziłem, że jeśli jawnie utworzę instancję boto.provider.Provider class o nazwie = 'aws' i żadnych poświadczeń, pola access_key/secret_key instancji Providera pozostaną bez zmian (ale tylko podczas bootowania; referencje są inicjowane po ręcznym uruchomieniu skryptu). Jednak wiem na pewno, że serwer metadanych nie jest winowajcą (GET rzeczywiście zwraca oczekiwane referencje, nawet podczas rozruchu).

Więc ... Co może być nie tak? Czy to może być problem w boto? Problem z konfiguracją? Czy robię coś złego? Heck, czy to możliwe, że Ubuntu nie jest "w odpowiednim stanie" dla tego rodzaju operacji podczas uruchamiania?

--- EDIT ---

Dzięki garnaat na odpowiedź poniżej, okazało się, że problemem jest to, że ścieżka python (sys.path) jest zupełnie inna niż podczas uruchamiania podczas mojego zdalnej sesji SSH.

Podczas uruchamiania:

['/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'] 

i podczas uruchamiania go z mojego sesji SSH:

['/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'] 

(użyłem 32-bitową BitNami DjangoStack 1.4.2-1 obraz jako mojego podstawowego obrazu.)

Odpowiedz

9

Wspomniałeś, że używasz Ubuntu. Wiem, że wiele dystrybucji Ubuntu ma starszą wersję boto preinstalowaną. Myślę, że jest możliwe, że podczas procesu uruchamiania znajduje i używa starej wersji boto, która nie wie, jak pobrać poświadczenia z ról IAM.

Aby to sprawdzić, spróbuj zalogować się do pliku boto.Version w swoim skrypcie i sprawdź, czy jest w wersji 2.6.0 czy nie.

+0

Jestem rzeczywiście przy użyciu [BitNami DjangoStack image] (http://bitnami.org/stack/djangostack) oraz zainstalowany boto 2,6 użyciu pip. Może to być rzeczywiście problem z uruchamianiem systemu przez innego użytkownika, a zatem używanie niewłaściwego boto, jak sugerujesz. Sprawdzę to i dam ci znać. – mbargiel

+1

Bingo, masz rację! Podczas rozruchu używa on boto 2.2.2, a nie 2.6, a obsługa uwierzytelnień opartych na metadanych jest funkcją wprowadzoną około 2,5. – mbargiel

Powiązane problemy