AWS — boto.connect_s3() сообщает об отсутствии обработчика, готового к аутентификации во время загрузки экземпляра EC2

Я пытаюсь создать загрузочный скрипт для настройки экземпляров EC2. Я хочу, чтобы экземпляры автоматически загружали исходный код из корзины S3 во время загрузки. Недавно я прочитал о назначении роли IAM моим экземплярам EC2, чтобы они могли получать временные учетные данные с сервера метаданных. Таким образом, мне не нужно хранить учетные данные AWS на моем образе или передавать их во время загрузки.

Я написал скрипт Python, который выполняет загрузку, подключаясь к S3 с помощью boto. Я подключил этот скрипт к конфигу init.d. Мой скрипт отлично работает, когда я запускаю его вручную в удаленном сеансе SSH, но по какой-то причине он терпит неудачу, когда выполняется во время загрузки.

Мой код использует boto следующим образом:

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

Теоретически, с boto 2.6 этот код должен связаться с сервером метаданных AWS, чтобы получить временные учетные данные безопасности на основе роли IAM текущего экземпляра EC2.

По какой-то причине при загрузке boto.connect_s3() возникает исключение boto.exception. NoAuthHandlerFound: "Ни один обработчик не был готов к аутентификации. Был проверен 1 обработчик. ['HmacAuthV1Handler'] Проверьте свои учетные данные".

Я проследил ошибку до модуля boto.auth в функции get_auth_handler ( единственное место, где возникает это исключение). При создании объекта HmacAuthV1Handler конструктор базового класса HmacKeys дает сбой, если либо идентификатор ключа доступа, либо секретный ключ имеет значение None. Действительно, немного поэкспериментировав со своим сценарием, я обнаружил, что если я явно создам экземпляр boto.provider.Provider с name='aws' и без учетных данных, оба поля access_key/secret_key экземпляра Provider остаются None (но только во время загрузки; учетные данные инициализируются, если впоследствии я запускаю скрипт вручную). Тем не менее, я точно знаю, что сервер метаданных не является виновником (GET действительно возвращает ожидаемые учетные данные даже во время загрузки).

Итак... Что может быть не так? Может дело в боте? Проблема с конфигурацией? Или я просто делаю что-то не так? Черт возьми, может быть, Ubuntu не находится в «надлежащем состоянии» для такого рода операций во время загрузки?

--- ИЗМЕНИТЬ ---

Благодаря приведенному ниже ответу garnaat я обнаружил, что проблема в том, что путь python (sys.path) во время загрузки полностью отличается от во время моего удаленного сеанса SSH.

Во время загрузки:

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

и при запуске из моего 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']

(В качестве базового образа я использовал 32-разрядный образ BitNami DjangoStack 1.4.2-1.)


person mbargiel    schedule 21.11.2012    source источник


Ответы (1)


Вы упомянули, что работаете на Ubuntu. Я знаю, что во многих дистрибутивах Ubuntu предустановлена ​​более старая версия boto. Я думаю, возможно, что в процессе загрузки он находит и использует старую версию boto, которая не понимает, как получить учетные данные из ролей IAM.

Чтобы проверить это, попробуйте зарегистрировать boto.Version в своем скрипте и посмотреть, 2.6.0 это или нет.

person garnaat    schedule 21.11.2012
comment
На самом деле я использую образ BitNami DjangoStack и установил boto 2.6 с помощью pip. Это действительно может быть проблема с загрузкой под другим пользователем и, таким образом, с использованием неправильного бото, как вы предложили. Я проверю это и дам вам знать. - person mbargiel; 21.11.2012
comment
Бинго, ты правильно понял! Во время загрузки используется boto 2.2.2, а не 2.6, а поддержка учетных данных на основе метаданных — это функция, появившаяся примерно в версии 2.5 или около того. - person mbargiel; 21.11.2012