Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 为什么没有准备好AmazonS3身份验证处理程序?_Amazon S3_Amazon Web Services_Boto - Fatal编程技术网

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

Amazon s3 为什么没有准备好AmazonS3身份验证处理程序?,amazon-s3,amazon-web-services,boto,Amazon S3,Amazon Web Services,Boto,我已正确设置$AWS\u ACCESS\u KEY\u ID和$AWS\u SECRET\u ACCESS\u KEY环境变量,并运行以下代码: import boto conn = boto.connect_s3() 并获取以下错误: boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] 发生了什么事?我不

我已正确设置$AWS\u ACCESS\u KEY\u ID和$AWS\u SECRET\u ACCESS\u KEY环境变量,并运行以下代码:

import boto
conn = boto.connect_s3()
并获取以下错误:

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']
发生了什么事?我不知道从哪里开始调试



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

Boto将从环境变量中获取凭据。 我已经用V2.0b3测试过了,效果很好。它将优先于构造函数中显式指定的凭据,但也将从环境变量中获取凭据

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

例如(在Windows上:我希望它在Linux上也能正常工作,但我个人还没有尝试过)

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

AWSAccessKeyId=<your access id>
AWSSecretKey=<your secret key>
现在,您的代码片段位于上面:

import boto
conn = boto.connect_s3()

很好。

我看到你叫他们
AWS\u ACCESS\u KEY\u ID
AWS\u SECRET\u ACCESS\u KEY


当它们似乎应该设置为
AWSAccessKeyId
&
AWSSecretKey
时,我对python和boto都是新手,但能够重现您的错误(或者至少是错误的最后一行)

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

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
除非您还添加以下内容,否则将不起作用:

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

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

对于另一个值也是如此。您还可以将其放在.bashrc中(假设bash是您的shell,并假设您记得导出)

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

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
我只是想补充一下,以防其他人像我一样搜索。

见最新:

我找到了答案

在Unix上:首先设置aws配置:

#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"

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

有很多关于创建用户的AWS文档,但是只有少数地方他们注意到你必须给他们权限才能做任何事情。一个是,但即使它并没有真正告诉你去“策略”选项卡,建议一个好的开始策略,并解释如何应用它

该向导只是鼓励您“开始使用IAM用户”,并没有说明还有很多事情要做。即使您稍微浏览一下,您也只会看到例如“托管策略此用户没有附加托管策略”,这并不意味着您需要一个策略来执行任何操作

要建立类似于root的用户,请参阅:


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

继续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")


向下滚动至:
您可以控制从元数据服务检索信息时使用的超时和重试次数(用于检索EC2实例上IAM角色的凭据)

在Mac上,导出密钥需要如下所示:
key=value
。所以导出,比如说,
AWS\u ACCESS\u KEY\u ID
环境变量应该是这样的:
AWS\u ACCESS\u KEY\u ID=yourkey
。如上面的回答所述,如果您的值周围有任何引用,boto将抛出上述错误

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

sudo apt-get install awscli
aws configure
这用于在~/.aws/config中设置您的凭据,就像@huythang所说的那样。所以把它们复制过来

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

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

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

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

  • 创建授权访问S3资源的IAM安全组
  • 将策略提供给EC2实例
  • 只使用boto进行连接。连接s3()#无需按键

  • 我以前成功地使用了s3并行put,但它莫名其妙地停止了工作,出现了上面的错误。尽管已导出AWS_访问密钥ID和AWS_机密访问密钥,但仍存在此问题

    解决方案是在boto配置文件中:

    $ nano ~/.boto
    
    按如下方式输入凭据:

    [Credentials]
    aws_access_key_id = KEY_ID
    aws_secret_access_key = SECRET_ACCESS_KEY
    

    带下划线的版本是正确的。相信您还应该能够在连接动词上提供KWARG,例如:boto.cloudformation.connect\u to\u region(myregion,aws\u access\u key\u id=xxxx,aws\u secret\u access\u key=yyyy)我刚刚为Linux用户发布了一个不需要环境变量的答案。这里有更多关于AWS凭证的详细信息,使用
    boto
    ,最好不要使用inc
    $ nano ~/.boto
    
    [Credentials]
    aws_access_key_id = KEY_ID
    aws_secret_access_key = SECRET_ACCESS_KEY