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

我有我的$ AWS_ACCESS_KEY_ID和$ AWS_SECRET_ACCESS_KEY环境variables设置正确,我运行此代码:

import boto conn = boto.connect_s3() 

并得到这个错误:

 boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] 

发生了什么? 我不知道从哪里开始debugging。


看来boto没有从我的环境variables中取值。 如果我将密钥ID和密钥作为parameter passing给连接构造函数,这可以正常工作。

博托将从环境variables中获取凭据。 我已经用V2.0b3testing过了,它工作正常。 它将优先于在构造函数中明确指定的凭证,但它也会从环境variables中获取凭证。

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

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

创build一个名为“mycred.txt”的文件,并将其放入C:\ temp该文件包含两行:

 AWSAccessKeyId=<your access id> AWSSecretKey=<your secret key> 

将环境variablesAWS_CREDENTIAL_FILE定义为指向C:\ temp \ mycred.txt

 C:\>SET AWS_CREDENTIAL_FILE=C:\temp\mycred.txt 

现在你的代码片段如上:

 import boto conn = boto.connect_s3() 

将工作正常。

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

你很可能无法在bash中导出你的variables。 如果你只是定义,那么它们只在当前shell中有效,导出它们并且pythoninheritance这个值。 从而:

 $ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER" 

将不会工作,除非你还添加:

 $ export AWS_ACCESS_KEY_ID 

或者你可以在同一行上完成:

 $ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER" 

同样的其他价值。 你也可以把它放在你的.bashrc中(假设bash是你的shell,并假设你记得导出)

跟随nealmcb对IAMangular色的回答。 在使用IAMangular色部署EMR集群的同时,我也遇到了类似的问题,有时(并非每次)都会在将boto连接到s3时出现此错误。

 boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] 

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

 import boto, ConfigParser try: boto.config.add_section("Boto") except ConfigParser.DuplicateSectionError: pass boto.config.set("Boto", "metadata_service_num_attempts", "20") 

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)

我在使用Linux和SES时遇到了这个问题,我希望这可以帮助其他人解决类似的问题。 我已经安装了awscli并configuration了我的密钥:

 sudo apt-get install awscli aws configure 

这是用来在〜/ .aws / config中设置你的凭证,就像@huythang所说。 但博托在〜/ .aws /凭证中查找您的凭证,以便将其复制

 cp ~/.aws/config ~/.aws/credentials 

假设使用这些凭据为您的用户设置了适当的策略 – 您不需要设置任何环境variables。

我在这里find了我的答案。

在Unix上:首先设置aws config:

 #vim ~/.aws/config [default] region = Tokyo aws_access_key_id = xxxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxx 

并设置环境variables

 export AWS_ACCESS_KEY_ID="aws_access_key_id" export AWS_SECRET_ACCESS_KEY="aws_secret_access_key" 

看最新boto s3介绍 :

 from boto.s3.connection import S3Connection conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 

您现在可以在connect函数调用中将它们设置为参数。

 s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 

只是想我会补充说,任何人都像我一样search。

在我的情况下,问题是在IAM“用户默认没有权限”。 我花了整整一天的时间来追踪这个问题,因为我习惯了原来的AWSauthentication模式(pre-iam),现在只有“root”凭证是唯一的方法。

有很多关于创build用户的AWS文档,但只有less数几个地方他们注意到您必须授予他们执行任何操作的权限。 一个是使用亚马逊S3存储桶 – 亚马逊简单存储服务 ,但即使它不只是告诉你去政策选项卡,build议一个好的启动政策,并解释如何应用它。

这种向导只是鼓励你“开始使用IAM用户”,并没有说明还有很多事情要做。 即使你捅了一下,你只能看到例如“托pipe策略没有托pipe的策略附加到这个用户”。 这并不意味着你需要一个政策来做任何事情。

要build立一个类似根的用户,请参阅: 使用控制台创buildpipe理员组 – AWS标识和访问pipe理

我没有看到一个具体的政策,只是简单地允许只读访问所有的S3(我自己的桶和其他人拥有的公共的)。

在Mac上,导出密钥需要如下所示: key=value 。 因此,导出AWS_ACCESS_KEY_ID环境AWS_ACCESS_KEY_ID应如下所示: AWS_ACCESS_KEY_ID=yourkey 。 如果你在上面的答案中提到了你的价值,boto会抛出上面提到的错误。

我看到你叫他们AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

当它看起来应该被设置为AWSAccessKeyIdAWSSecretKey