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

Posted

技术标签:

【中文标题】为啥没有准备好 Amazon S3 身份验证处理程序?【英文标题】:Why are no Amazon S3 authentication handlers ready?为什么没有准备好 Amazon S3 身份验证处理程序? 【发布时间】:2011-07-20 19:06:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

会正常工作。

【讨论】:

相信您也应该能够在连接动词上提供 kwargs,例如:boto.cloudformation.connect_to_region(myregion, aws_access_key_id=xxxx, aws_secret_access_key=yyyy) 我刚刚为不需要环境变量的Linux用户发布了一个答案。 botoboto.cloudhackers.com/en/latest/boto_config_tut.html@boto.cloudhackers.com/en/latest/boto_config_tut.html 上有更多关于 AWS 凭证的详细信息【参考方案2】:

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

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

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

除非您还添加以下内容,否则将无法使用:

$ export AWS_ACCESS_KEY_ID

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

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

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

【讨论】:

把这些细节放在哪里?因为我将这些凭据放在我的 settings.py 中。还有其他设置吗?【参考方案3】:

我在使用 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

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

【讨论】:

在 OSX 上,无需重命名 ~/.aws/config【参考方案4】:

跟进 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)

【讨论】:

谢谢!这就是我们遇到的问题。但请注意以下其他人 - 确保导入 boto 和 ConfigParser 以使上述工作。【参考方案5】:

我找到了我的答案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】:

查看最新boto s3 introduction:

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

【讨论】:

最好不要在代码中明确包含凭据。您可能会忘记自己拥有它并将其签入公共存储库,甚至让您组织的其他人访问您的凭据。【参考方案7】:

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

有很多关于创建用户的 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(我自己的存储桶以及其他人拥有的公共存储桶)进行只读访问的特定策略。

【讨论】:

值得注意的是,您分配 S3 权限的用户名/标识符是 64 个字符的字符串【参考方案8】:

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

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

只是想我会添加,以防其他人像我一样搜索。

【讨论】:

【参考方案9】:

我之前成功使用过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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

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

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

【讨论】:

【参考方案12】:

我看到你叫他们AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY

如果看起来应该将它们设置为AWSAccessKeyIdAWSSecretKey

【讨论】:

带下划线的版本是正确的。 boto.s3.amazonaws.com/s3_tut.htmlcode.google.com/p/boto/wiki/BotoConfig

以上是关于为啥没有准备好 Amazon S3 身份验证处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 是不是支持带有基本身份验证的 HTTP 请求

为啥需要 Amazon S3 和 Cloudfront?

带有 SSH 身份验证的 WinSCP 到 S3

数据中心的 Amazon S3 替代方案?

AWS Lambda 中的 Amazon S3 waitFor()

“没有当前用户”:是不是甚至可以通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用?