我正在尝试创建一个引导脚本来设置 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 图像作为我的基础图像。)