boto问题与IAM角色

Nil*_*ils 23 python amazon-s3 boto amazon-web-services

我正在尝试使用AWS最近宣布的"针对EC2的IAM角色"功能,该功能可以自动将安全凭证传递给EC2实例.(见http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/).

我已经设置了一个具有IAM角色的实例,如上所述.我也可以通过curl获得(看似)正确的访问密钥/凭证.

但是,即使我为角色启用了所有S3权限,boto也无法像"get_all_buckets"那样进行简单的调用.

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

但是,错误中列出的访问键与我从curl获得的访问键匹配.

以下是失败的脚本,在附加了IAM角色的EC2实例上运行,该角色提供所有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()
Run Code Online (Sandbox Code Playgroud)

gar*_*aat 62

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

>>> import boto
>>> c = boto.connect_s3()
>>> rs = c.get_all_buckets()
Run Code Online (Sandbox Code Playgroud)

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


Gab*_*iel 5

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

  1. 使用AmazonS3FullAccess权限创建IAM角色.
  2. 启动一个新实例并附加我新创建的角色.
  3. 即使这样做之后仍然无效.我还必须使用以下代码连接到适当的区域:

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

  • 谢谢,它很有帮助,这些天我遇到了同样的问题. (2认同)