24

我正在尝试使用 AWS 最近宣布的“EC2 的 IAM 角色”功能,该功能可以让安全凭证自动传送到 EC2 实例。(请参阅http://aws.amazon.com/about-aws/whats-new/2012/06/11/Annocing-IAM-Roles-for-EC2-instances/)。

如上所述,我已经设置了一个具有 IAM 角色的实例。我还可以(看似)使用 curl 获取正确的访问密钥/凭据。

但是,boto 无法执行像“get_all_buckets”这样的简单调用,即使我已经为该角色打开了所有 S3 权限。

我得到的错误是“您提供的 AWS 访问密钥 ID 在我们的记录中不存在”

但是,错误中列出的访问密钥与我从 curl 获得的访问密钥匹配。

以下是失败的脚本,在 EC2 实例上运行,附加了一个 IAM 角色,该角色授予所有 S3 权限:

import urllib2
import ast
from boto.s3.connection import S3Connection

resp=urllib2.urlopen('http://169.254.169.254/latest/meta-data/iam/security-credentials/DatabaseApp').read()
resp=ast.literal_eval(resp)
print "access:" + resp['AccessKeyId']
print "secret:" + resp['SecretAccessKey']
conn = S3Connection(resp['AccessKeyId'], resp['SecretAccessKey'])
rs= conn.get_all_buckets()
4

2 回答 2

61

如果您使用的是 boto 2.5.1 或更高版本,它实际上比这容易得多。Boto 会自动为您在实例元数据中找到凭据并使用它们,只要在环境变量或 boto 配置文件中没有找到其他凭据。因此,您应该能够在 EC2 实例上简单地执行此操作:

>>> import boto
>>> c = boto.connect_s3()
>>> rs = c.get_all_buckets()

您的手动方法失败的原因是与 IAM 角色关联的凭证是临时会话凭证,由 a access_key、 asecret_key和 a组成security_token,您需要将所有这三个值提供给S3Connection构造函数。

于 2012-06-21T02:17:28.563 回答
5

我不知道这个答案是否会帮助任何人,但我遇到了同样的错误,我不得不以不同的方式解决我的问题。首先,我的亚马逊实例没有任何 IAM 角色。我以为我可以只使用访问密钥和密钥,但我只用这两个密钥就一直收到这个错误。我读到我也需要一个安全令牌,但我没有,因为我没有任何 IAM 角色。这是我为纠正这个问题所做的:

  1. 创建具有 AmazonS3FullAccess 权限的 IAM 角色。
  2. 启动一个新实例并附加我新创建的角色。
  3. 即使在这样做之后它仍然没有工作。我还必须使用以下代码连接到正确的区域:

    导入 boto.s3.connection
    conn = boto.s3.connect_to_region('your-region')
    conn.get_all_buckets()

于 2015-06-27T22:28:39.123 回答