如何在python中使用临时令牌从s3存储桶下载文件

max*_*max 2 python amazon-s3

我有一个django网络应用程序,我想允许它从我的s3桶下载文件.这些文件不公开.我有一个IAM策略来访问它们.问题是,我希望下载Django应用程序服务器上的文件,然后为它服务下载客户端上.这就像下载两次.我希望能够直接在django应用程序的客户端上下载.另外,我认为在http请求中传递我的IAM凭证是不安全的,所以我认为我需要使用临时令牌.我读到:http: //docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html

但我只是不明白如何动态生成临时令牌.一个python解决方案(也许使用boto)将不胜感激.

Ant*_*ala 8

使用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)
Run Code Online (Sandbox Code Playgroud)

这将生成foo给定存储桶中密钥的下载URL ,该URL 有效24小时(86400秒).如果没有validate=FalseBoto 2,将首先检查密钥实际存在于桶中,如果不存在,将抛出异常.使用这些服务器控制的文件通常是不必要的额外步骤,因此validate=False在该示例中


在Boto3中,API完全不同:

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
)
Run Code Online (Sandbox Code Playgroud)