amazon s3 -如何使用IAM角色生成经过认证的s3 url



当我有了硬编码的访问密钥和秘密密钥时,我就能够生成经过身份验证的url,供用户查看S3上的私有文件。这是用以下代码完成的:

import hmac
import sha
import urllib
import time
filename = "".join([s3_url_prefix, filename])
expiry = str(int(time.time()) + 3600)
h = hmac.new(
    current_app.config.get("S3_SECRET_KEY", None),
    "".join(["GETnnn", expiry, "n", filename]),
    sha
)
signature = urllib.quote_plus(base64.encodestring(h.digest()).strip())
return "".join([
    "https://s3.amazonaws.com",
    filename,
    "?AWSAccessKeyId=",
    current_app.config.get("S3_ACCESS_KEY", None),
    "&Expires=",
    expiry,
    "&Signature=",
    signature
])

这给了我https://s3.amazonaws.com/bucket_name/path_to_file?AWSAccessKeyId=xxxxx&Expires=5555555555&Signature=eBFeN32eBb2MwxKk4nhGR1UPhk%3D的效果。不幸的是,出于安全原因,我无法在配置文件中存储密钥。出于这个原因,我切换到IAM角色。现在,我使用:

获取密钥
_iam = boto.connect_iam()
S3_ACCESS_KEY = _iam.access_key
S3_SECRET_KEY = _iam.secret_key

但是,这会给我一个错误"您提供的AWS Access Key Id在我们的记录中不存在"。从我的研究中,我明白这是因为我的IAM密钥不是实际的密钥,而是与令牌一起使用。因此,我的问题是双重的:

  1. 我如何以编程方式获得令牌?似乎没有一个简单的iam属性我可以使用

  2. 如何发送签名中的令牌?我相信我的签名最后应该看起来像"。join(["GETnnn", expiry, "n", token, filename]),但是我不知道该使用什么格式。

在https://github.com/boto/boto/commit/99e14f3df039997f54a5377cb6aecc83f22c2670(2012年6月)中对generate_url方法进行了更改,使使用会话凭据对URL进行签名成为可能。这意味着您需要使用boto 2.6.0或更高版本。如果你是,你应该可以这样做:

import boto
s3 = boto.connect_s3()
url = s3.generate_url(expires_in=3600, method='GET', bucket='<bucket_name>', key='<key_name>')

你用的是什么版本?

最新更新