【问题标题】: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 和密钥作为参数传递给连接构造函数,则可以正常工作。

【问题讨论】:

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


    【解决方案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()
    

    会正常工作。

    【讨论】:

    【解决方案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 的完全一样。这里的其他解决方案很好,但有一种方法可以在没有硬编码访问密钥的情况下获得大权限。

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

            【讨论】:

              【解决方案12】:

              我看到你叫他们AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY

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

              【讨论】:

              猜你喜欢
              • 2013-07-29
              • 1970-01-01
              • 2012-11-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-09
              相关资源
              最近更新 更多