51

我正确设置了 $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 和密钥作为参数传递给连接构造函数,则可以正常工作。

4

12 回答 12

40

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()

会正常工作。

于 2011-04-29T11:05:51.563 回答
15

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

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

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

除非您还添加:

$ export AWS_ACCESS_KEY_ID

或者您可以在同一行上完成所有操作:

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

对于其他值也是如此。你也可以把它放在你的 .bashrc 中(假设 bash 是你的 shell 并假设你记得导出)

于 2011-11-11T12:18:11.900 回答
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)

于 2015-05-20T10:58:02.390 回答
10

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

sudo apt-get install awscli
aws configure

这用于在 ~/.aws/config 中设置您的凭据,就像@huythang 所说的那样。 但是 boto 在 ~/.aws/credentials 中查找您的凭据,因此将它们复制过来

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

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

于 2016-05-14T12:10:50.557 回答
4

我在这里找到了答案。

在 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"
于 2014-09-01T10:34:41.660 回答
3

查看最新的 boto s3 介绍

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
于 2013-11-26T13:32:05.737 回答
2

就我而言,问题是在 IAM 中“默认情况下用户没有权限”。我花了一整天的时间来追踪它,因为我习惯了原始的 AWS 身份验证模型(pre-iam),其中现在所谓的“根”凭证是唯一的方法。

有很多关于创建用户的 AWS 文档,但只有少数地方指出您必须授予他们权限才能让他们执行任何操作。一个是使用 Amazon S3 Buckets - Amazon Simple Storage Service,但它实际上并不仅仅是告诉您转到“策略”选项卡,建议一个好的开始策略,并解释如何应用它。

分类向导只是鼓励您“开始使用 IAM 用户”,并没有说明还有很多事情要做。即使您仔细观察,您也只会看到例如“托管策略没有附加到该用户的托管策略”。 这并不意味着你需要一个策略来做任何事情。

要建立类似 root 的用户,请参阅: 使用控制台创建管理员组 - AWS 身份和访问管理

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

于 2015-05-01T04:09:14.327 回答
1

您现在可以将这些设置为连接函数调用中的参数。

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

只是想我会补充一点,以防其他人像我一样搜索。

于 2013-10-22T11:33:03.530 回答
1

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

解决方案是在 boto 配置文件中指定凭据:

$ nano ~/.boto

像这样输入凭据:

[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
于 2018-07-08T12:00:59.560 回答
0

在 Mac 上,导出密钥需要如下所示:key=value. 所以导出,比如说,AWS_ACCESS_KEY_ID环境变量应该是这样的:AWS_ACCESS_KEY_ID=yourkey. 如果您对您的价值观有任何引用,如上述答案中所述,boto 将抛出上述错误。

于 2015-06-22T20:30:20.277 回答
0

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

我的代码与 OP 的完全一样。这里的其他解决方案很好,但是有一种方法可以在没有硬编码访问密钥的情况下获得授权。

  1. 创建授予对 S3 资源的访问权限的 IAM 安全组
  2. 将策略提供给 EC2 实例
  3. 仅使用boto.connect_s3()#no key 进行连接
于 2017-12-08T16:56:51.767 回答
-4

我看到你叫他们AWS_ACCESS_KEY_ID& AWS_SECRET_ACCESS_KEY

看起来它们应该设置为AWSAccessKeyId& AWSSecretKey

于 2011-07-28T18:06:51.950 回答