小编mba*_*iel的帖子

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

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

boot amazon-s3 amazon-ec2 boto amazon-iam

5
推荐指数
1
解决办法
3937
查看次数

在AWS上使用mod_wsgi的Django站点无法创建FK表单字段,因为尚未加载相关模型

我正在使用Django 1.4官方版本在Django网站上工作.我的网站有一些应用程序.其中一个应用程序有一个名为CampaignFKs的模型,用于其他应用程序中的模型.如在参考的Django(https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey)建议,我选择来定义FK字段使用字符串来代替相关的模型类本身,因为我希望在下一个版本中有循环引用,这种方法避免了循环导入问题.

当我使用部署在AWS(亚马逊网络服务)网站的BitNami djangostack 1.4(阿帕奇,mod_wsgi的,MySQL的),我部署的站点工作正常的大部分.在显示Campaign模型表单的页面上,Django在尝试创建依赖于Campaign模型的外键字段的表单字段时引发了异常,抱怨相关模型未加载.有趣/可怕的是,当我设置settings.DEBUG为True(绝对不是我们在网站上线后我们想要的东西),问题不再发生!

当我在我的本地Django开发服务器上测试它时,该网站工作得很好,并且它也使用部署在我的Windows工作站上的相同BitNami djangostack完美地工作.

这是我在AWS控制台上看到的相关Apache错误输出.

[error] ERROR :: Internal Server Error: /campaigns/
[error] Traceback (most recent call last):
[error]   File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/core/handlers/base.py", line 101, in get_response
[error]     request.path_info)
    ... (django/wsgi blah blah)
[error]   File "/opt/bitnami/apps/django/django_projects/Project/campaign/views.py", line 5, in <module>
[error]     from forms import CampaignForm
[error]   File "/opt/bitnami/apps/django/django_projects/Project/campaign/forms.py", line 12, in <module>
[error]     class CampaignForm(forms.ModelForm):
[error]   File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 206, in __new__
[error]     opts.exclude, opts.widgets, formfield_callback)
[error]   File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 160, …
Run Code Online (Sandbox Code Playgroud)

django mod-wsgi amazon-web-services

4
推荐指数
1
解决办法
1131
查看次数