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

时间:2011-03-22 19:47:35

标签: amazon-s3 amazon-web-services boto

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

import boto
conn = boto.connect_s3()

并收到此错误:

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

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


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

12 个答案:

答案 0 :(得分:34)

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

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

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

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

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

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

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

现在你的代码片段在上面:

import boto
conn = boto.connect_s3()

会正常工作。

答案 1 :(得分:14)

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

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

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
除非您还添加:

,否则

将无效

$ export AWS_ACCESS_KEY_ID

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

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

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

答案 2 :(得分:10)

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

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

元数据服务在检索凭据时可能会超时。因此,正如文档所示,我在配置中添加了一个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)

答案 3 :(得分:8)

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

sudo apt-get install awscli
aws configure

这用于在〜/ .aws / config中设置您的凭据,就像@huythang所说的那样。 But boto looks for your credentials in ~/.aws/credentials所以复制它们

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

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

答案 4 :(得分:3)

查看最新的boto s3 introduction

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

答案 5 :(得分:3)

我找到了答案here

在Unix上:首先设置aws config:

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

并设置环境变量

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

答案 6 :(得分:2)

在我的情况下,问题是在IAM中“默认情况下用户没有权限”。我花了一整天来追踪这一点,因为我已经习惯了原始的AWS身份验证模型(pre-iam),其中现在称为“root”凭据是唯一的方法。

有许多关于创建用户的AWS文档,但只有少数几个地方他们注意到您必须授予他们执行任何操作的权限。一个是Working with Amazon S3 Buckets - Amazon Simple Storage Service,但即使它并没有真正告诉您转到“政策”选项卡,建议一个良好的启动政策,并解释如何应用它。

各种向导只是鼓励您“开始使用IAM用户”,并没有说明还有很多工作要做。即使你捅了一下,你也可以看到,例如“托管策略此用户没有附加托管策略。”并不表示您需要策略来执行任何操作。

要建立类似root的用户,请参阅: Creating an Administrators Group Using the Console - AWS Identity and Access Management

我没有看到一个特定的政策,只是简单地允许对所有S3(我自己的桶以及其他人拥有的公共桶)进行只读访问。

答案 7 :(得分:1)

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

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

我以为我会像其他人那样添加其他人。

答案 8 :(得分:1)

我以前曾经成功使用过s3-parallel-put,但莫名其妙地停止了工作,出现了上面的错误。尽管已导出AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。

解决方案是在boto配置文件中specify the the credentials

$ nano ~/.boto

输入凭据,如下所示:

[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY

答案 9 :(得分:0)

在Mac上,导出密钥必须如下所示:AWS_ACCESS_KEY_ID。因此,导出AWS_ACCESS_KEY_ID=yourkey环境变量应该如下所示:<marquee scrolldelay="10"><img src="/Users/rahulkhairwar/Downloads/Boulder-Bookstore_Sam-Hall.jpeg" height="500" width="500"></marquee> 。如果您的值有任何引用,如上面的答案中所述,boto将抛出上述错误。

答案 10 :(得分:0)

我在ec2上的烧瓶应用程序遇到了这个问题。我不想在应用程序中放置凭据,而是通过IAM角色获得管理权限。这样可以避免将密钥硬编码到代码中。然后我在AWS控制台中设置了一个策略(我甚至没有编写代码,我只使用了策略生成器)

我的代码与OP完全一样。这里的其他解决方案都很好,但有一种方法可以获得的强大权限,而无需硬编码访问密钥。

  1. 创建授予对S3资源的访问权限的IAM安全组
  2. 将策略提供给EC2实例
  3. 只使用boto.connect_s3() #no keys
  4. 连接

答案 11 :(得分:-4)

我看到你叫他们AWS_ACCESS_KEY_ID&amp; AWS_SECRET_ACCESS_KEY

当看起来应该设置为AWSAccessKeyId&amp; AWSSecretKey