我有一个django网络应用程序,我想允许它从我的s3存储桶下载文件。 这些文件不公开。我有一个IAM策略来访问它们。 问题是我 NOT 想要在django app服务器上下载该文件,然后将其提供给客户端下载。这就像下载两次。我希望能够直接在django应用程序的客户端上下载。 另外,我认为在http请求中传递我的IAM凭证是不安全的,所以我认为我需要使用临时令牌。 我读: http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html
但我只是不明白如何动态生成临时令牌。 一个python解决方案(也许使用boto)将不胜感激。
答案 0 :(得分:7)
使用Boto(2),如果您的IAM策略具有适当的权限,那么生成有时间限制的下载URL应该非常容易。我正在使用这种方法从私有S3存储桶向登录用户提供视频。
from boto.s3.connection import S3Connection
conn = S3Connection('<aws access key>', '<aws secret key>')
bucket = conn.get_bucket('mybucket')
key = bucket.get_key('mykey', validate=False)
url = key.generate_url(86400)
这将生成给定存储桶中密钥foo
的下载URL,该URL有效24小时(86400秒)。没有validate=False
Boto 2将首先检查密钥实际存在于桶中,如果不存在,将抛出异常。使用这些服务器控制的文件通常是不必要的额外步骤,因此示例中的validate=False
在Boto3 the API is quite different中:
s3 = boto3.client('s3')
# Generate the URL to get 'key-name' from 'bucket-name'
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'mybucket',
'Key': 'mykey'
},
expires=86400
)