2012-06-21 52 views
22

我正在尝试使用AWS最近宣布的“ECAM的IAM角色”功能,该功能可以让安全证书自动传递到EC2实例。 (见http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/)。boto问题与IAM角色

我已经建立了一个具有IAM角色的实例,如上所述。我还可以通过curl(看似)获得适当的访问密钥/证书。

但是,boto未能做一个简单的调用,如“get_all_buckets”,尽管我已经打开了该角色的所有S3权限。

我得到的错误是

“你提供我们的记录中不存在的AWS访问密钥”然而,在错误中列出的访问密钥相匹配的一个我从卷曲得到。

这里是失败的脚本,在EC2实例与给所有S3权限连接的IAM角色运行:

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

回答

60

如果您使用的博托2.5.1或更高版本,它实际上比这更简单。只要在环境变量或boto配置文件中找不到其他凭据,Boto就会自动在实例元数据中为您找到凭据并使用它们。所以,你应该能够简单地做这在EC2实例:

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

的原因,你的手工做法失败是与IAM角色相关联的证书是一个临时会话证书,由一个access_key的,一个secret_key和一个security_token,您需要将这三个值提供给S3Connection构造函数。

+0

对于手动方法,你是对的,加入security_token就可以解决它。谢谢!我将你标记为“答案”。 – Nils

+0

您发布的简化版本在升级到2.5.1后也可以使用。所以如果我能给你两个接受,我会的! – Nils

+0

太棒了,很高兴它现在适合你。我喜欢新的IAM角色功能,它非常漂亮。 – garnaat

5

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

  1. 使用AmazonS3FullAccess权限创建IAM角色。
  2. 开始一个新实例并附加我新创建的角色。
  3. 即使这样做,它仍然没有工作。我只好也与下面的代码连接到正确的区域:

    进口boto.s3.connection
    康恩= boto.s3.connect_to_region( '你的区域')
    conn.get_all_buckets()

+2

谢谢,它的帮助,我现在有同样的问题。 – timesking

+0

设置AWS_DEFAULT_REGION诀窍,但为什么博托不能从实例数据中获取? –