为什么没有准备好Amazon S3身份验证处理程序?

44 amazon-s3 boto amazon-web-services

我正确设置了$ AWS_ACCESS_KEY_ID和$ AWS_SECRET_ACCESS_KEY环境变量,并运行此代码:

import boto
conn = boto.connect_s3()
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
Run Code Online (Sandbox Code Playgroud)

发生了什么?我不知道从哪里开始调试.


似乎boto没有从我的环境变量中获取值.如果我将密钥id和密钥作为参数传递给连接构造函数,这可以正常工作.

lia*_*amf 35

Boto 将从环境变量中获取您的凭据.我用V2.0b3测试了它,它工作正常.它将优先于构造函数中显式指定的凭据,但它也将从环境变量中获取凭据.

最简单的方法是将您的凭据放入文本文件中,并在环境中指定该文件的位置.

例如(在Windows上:我希望它在Linux上可以正常工作,但我没有亲自尝试过)

创建一个名为"mycred.txt"的文件并将其放入C:\ temp这个文件包含两行:

AWSAccessKeyId=<your access id>
AWSSecretKey=<your secret key>
Run Code Online (Sandbox Code Playgroud)

将环境变量AWS_CREDENTIAL_FILE定义为指向C:\ temp\mycred.txt

C:\>SET AWS_CREDENTIAL_FILE=C:\temp\mycred.txt
Run Code Online (Sandbox Code Playgroud)

现在你的代码片段如上:

import boto
conn = boto.connect_s3()
Run Code Online (Sandbox Code Playgroud)

会很好的.


小智 14

我是python和boto的新手,但能够重现你的错误(或者至少是错误的最后一行.)

您很可能无法在bash中导出变量.如果你只是定义那么,它们只在当前shell中有效,导出它们并且python继承该值.从而:

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
Run Code Online (Sandbox Code Playgroud)

除非你还添加:

$ export AWS_ACCESS_KEY_ID
Run Code Online (Sandbox Code Playgroud)

或者你可以在同一行上完成所有工作:

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
Run Code Online (Sandbox Code Playgroud)

同样对于另一个值.你也可以把它放在.bashrc中(假设bash是你的shell并假设你记得导出)


dyl*_*ini 10

跟进nealmcb关于IAM角色的回答.虽然使用IAM角色部署EMR集群,但我遇到了类似的问题,在将boto连接到s3时,有时(并非每次)都会出现此错误.

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
Run Code Online (Sandbox Code Playgroud)

元数据服务在检索凭据时可能会超时.因此,正如文档所示,我在配置中添加了一个Boto部分,并增加了重试次数以检索凭据.请注意,默认值为1次尝试.

import boto, ConfigParser
try:
    boto.config.add_section("Boto")
except ConfigParser.DuplicateSectionError:
    pass
boto.config.set("Boto", "metadata_service_num_attempts", "20")
Run Code Online (Sandbox Code Playgroud)

http://boto.readthedocs.org/en/latest/boto_config_tut.html?highlight=retries#boto

向下滚动到: You can control the timeouts and number of retries used when retrieving information from the Metadata Service (this is used for retrieving credentials for IAM roles on EC2 instances)


Gav*_*mer 8

我在使用Linux和SES时遇到了这个问题,我希望它可以帮助处理类似问题的其他人.我安装了awscli并配置了我的密钥:

sudo apt-get install awscli
aws configure
Run Code Online (Sandbox Code Playgroud)

这用于在〜/ .aws/config中设置你的凭证,就像@huythang所说的那样. 但是boto会在〜/ .aws /凭证中查找您的凭据,因此请将其复制

cp ~/.aws/config ~/.aws/credentials
Run Code Online (Sandbox Code Playgroud)

假设使用这些凭据为您的用户设置了适当的策略 - 您不需要设置任何环境变量.