【问题标题】:AWS - boto.connect_s3() reporting "No handler was ready to authenticate" while EC2 instance is bootingAWS - boto.connect_s3() 在 EC2 实例启动时报告“没有处理程序准备好进行身份验证”
【发布时间】:2012-11-09 06:13:25
【问题描述】:

我正在尝试创建一个引导脚本来设置 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 module(引发此异常的唯一地方)。创建 HmacAuthV1Handler 对象时,如果访问密钥 id 或密钥为 None,则 HmacKeys 基类构造函数将失败。事实上,在我的脚本中进行了一些实验后,我发现如果我显式创建一个带有 name='aws' 且没有凭据的 boto.provider.Provider class 实例,则 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 映像作为我的基础映像。)

【问题讨论】:

    标签: amazon-s3 amazon-ec2 boot boto amazon-iam


    【解决方案1】:

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

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

    【讨论】:

    • 我实际上使用的是BitNami DjangoStack image 并使用 pip 安装了 boto 2.6。在不同的用户下进行引导确实可能是一个问题,因此按照您的建议使用了错误的 boto。我会检查并告诉你。
    • 宾果游戏,你做对了!在启动期间,它使用 boto 2.2.2,而不是 2.6,并且基于元数据的凭据支持是在 2.5 左右引入的功能。
    猜你喜欢
    • 2013-07-29
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多