5

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

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

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

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

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

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

我在 get_auth_handler 函数中将错误追溯到boto.auth 模块(引发此异常的唯一地方)。创建 HmacAuthV1Handler 对象时,如果访问密钥 id 或密钥为 None,则 HmacKeys 基类构造函数将失败。事实上,在我的脚本中进行了一些实验后,我发现如果我显式创建一个带有 name='aws' 且没有凭据的boto.provider.Provider 类的实例,则 Provider 实例的 access_key/secret_key 字段都保持为 None (但仅在启动期间;如果我之后手动运行脚本,凭据将被初始化)。然而,我知道元数据服务器不是罪魁祸首(GET 确实返回了预期的凭据,即使在启动期间也是如此)。

所以... 有什么问题吗?这可能是boto的问题吗?配置问题?还是我只是做错了什么?哎呀,是不是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 图像作为我的基础图像。)

4

1 回答 1

9

你提到你在 Ubuntu 上运行。我知道许多 Ubuntu 发行版都预装了旧版本的 boto。我认为在启动过程中它可能正在查找并使用不了解如何从 IAM 角色获取凭证的旧版本的 boto。

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

于 2012-11-21T04:29:16.613 回答