为啥没有准备好 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用户发布了一个答案。 在boto
boto.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
。
如果看起来应该将它们设置为AWSAccessKeyId
和AWSSecretKey
。
【讨论】:
带下划线的版本是正确的。 boto.s3.amazonaws.com/s3_tut.htmlcode.google.com/p/boto/wiki/BotoConfig以上是关于为啥没有准备好 Amazon S3 身份验证处理程序?的主要内容,如果未能解决你的问题,请参考以下文章
Amazon S3 是不是支持带有基本身份验证的 HTTP 请求
AWS Lambda 中的 Amazon S3 waitFor()
“没有当前用户”:是不是甚至可以通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用?