2016-08-20 13 views
0

我有一個Django的Web應用程序,我想讓它從我的S3存儲桶下載文件。 這些文件不公開。我有一個IAM策略來訪問它們。 問題是我做不是想要下載在Django應用程序服務器上的文件,然後提供它在客戶端上下載。這就像下載兩次。我希望能夠直接在django應用程序的客戶端上下載。 此外,我不認爲在http請求中傳遞我的IAM憑證是安全的,所以我認爲我需要使用臨時令牌。 我看過: http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html如何從S3存儲桶中下載一個文件在Python中的臨時令牌

但我只是不明白如何生成臨時令牌。 蟒蛇解決方案(也許使用boto)將不勝感激。

+1

https://www.whitneyindustries.com/aws/2014/ 11/16/boto-plus-s3-plus-sts-tokens.html –

+0

@NehalJWani實際上,下載的文件有一個錯誤,表示沒有出現AWSAccessKey。我在URL中傳遞了AWSAccessKey,並在標頭中傳遞了令牌。 – max

回答

4

對於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下載網址在給定桶,有效期爲86400秒,也就是24小時。如果沒有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 
) 
+0

太好了。謝謝。 「驗證」是否意味着覆蓋? – max

+0

@max不,這些是爲下載網址。如果你省略了validate(默認爲'True'),那麼boto2會實際檢查密鑰是否存在,並且如果存儲桶不包含密鑰則會引發異常。 –

+0

什麼是「mykey」?我試着用我的文件名替換mykey,但它不允許我下載。 – max

相關問題