AWS - boto.connect_s3()在EC2实例启动时报告"没有处理程序已准备好进行身份验证"

mba*_*iel 5 boot amazon-s3 amazon-ec2 boto amazon-iam

我正在尝试创建一个引导脚本来设置EC2实例.我希望实例在引导期间自动从S3存储桶下载源代码.我最近阅读了有关为我的EC2实例分配IAM角色的信息,以便他们可以从元数据服务器获取临时凭证.这样,我就不必在我的映像上存储AWS凭据或在引导期间传递它们.

我编写了一个Python脚本,通过使用boto连接到S3来执行下载.我将该脚本连接到init.d配置.当我在远程SSH会话中手动运行它时,我的脚本运行正常,但由于某种原因,它在启动时执行时失败.

我的代码以下列方式使用boto:

import boto
try:
    conn = boto.connect_s3()
except:
    # log error
    exit(-1)
Run Code Online (Sandbox Code Playgroud)

理论上,使用boto 2.6,该代码应联系AWS元数据服务器,以根据当前EC2实例的IAM角色获取临时安全凭证.

出于某种原因,在启动时,boto.connect_s3()引发了一个boto.exception.NoAuthHandlerFound: "没有处理程序准备好进行身份验证.检查了1个处理程序.['HmacAuthV1Handler']检查您的凭据".

我将错误追溯到boto.auth模块,在get_auth_handler函数中(引发此异常的唯一地方).创建HmacAuthV1Handler对象时,如果访问密钥ID或密钥为None,则HmacKeys基类构造函数将失败.实际上,经过我的脚本中的一些实验,我发现如果我显式创建了一个名为='aws'并且没有凭据的boto.provider.Provider类的实例,那么Provider实例的access_key/secret_key字段都保持为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']
Run Code Online (Sandbox Code Playgroud)

从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']
Run Code Online (Sandbox Code Playgroud)

(我使用32位BitNami DjangoStack 1.4.2-1图像作为我的基本图像.)

gar*_*aat 9

你提到你在Ubuntu上运行.我知道很多Ubuntu发行版都预装了旧版本的boto.我认为在启动过程中可能会发现并使用旧版本的boto,它不了解如何从IAM角色获取凭据.

要对此进行测试,请尝试在脚本中记录boto.Version,看看它是否为2.6.0.