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图像作为我的基本图像.)
你提到你在Ubuntu上运行.我知道很多Ubuntu发行版都预装了旧版本的boto.我认为在启动过程中可能会发现并使用旧版本的boto,它不了解如何从IAM角色获取凭据.
要对此进行测试,请尝试在脚本中记录boto.Version,看看它是否为2.6.0.
| 归档时间: |
|
| 查看次数: |
3937 次 |
| 最近记录: |