Я пытаюсь создать загрузочный скрипт для настройки экземпляров 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.)