2016-04-20 90 views
1

我正在使用boto3的s3.transfer從s3下載幾個4GB +文件。所有,但一個能下載,但失敗的人給了以下錯誤:在http://boto3.readthedocs.org/en/latest/_modules/boto3/s3/transfer.html如何增加boto3.s3.transfer下載的令牌過期時間?

s3_client = session.client('s3') 
transfer = S3Transfer(s3_client) 
# Download s3://bucket/key to /tmp/myfile 
transfer.download_file('bucket', 'key', '/tmp/myfile') 

ERROR: An error occurred (ExpiredToken) when calling the GetObject operation: The provided token has expired. 

我現在用同樣的方式是文件是否有增加的方式boto3中使用的簽名url的過期時間?

如果它是相關的,我使用Cognito拿到證書,並與他們,會話

client = boto3.client('cognito-identity', AWS_REGION) 

    # credentials[] contains the IdentityId and Token I get from my server 
    # which I get using client.get_open_id_token_for_developer_identity 
    # with TokenDuration=86400 
    resp = client.get_credentials_for_identity(IdentityId=credentials['IdentityId'], 
               Logins={'cognito-identity.amazonaws.com': credentials['Token']}) 

    # The resp contains the actual temporary AWS secret/access codes and a session token, to be 
    # used with the rest of the AWS APIs 
    secretKey = resp['Credentials']['SecretKey'] 
    accessKey = resp['Credentials']['AccessKeyId'] 
    sessionToken = resp['Credentials']['SessionToken'] 

    session = Session(aws_access_key_id=accessKey, 
         aws_secret_access_key=secretKey, 
         aws_session_token=sessionToken, 
         region_name=AWS_REGION) 

    s3_client = session.client('s3') 
+0

您的代碼如何接收訪問密鑰/密鑰?我的猜測是你的問題是代碼在一個附加了IAM角色的EC2實例上運行。它是否正確 ?或者你是否通過配置文件傳遞AK/SK? ENV變量? –

+0

忘記提及我使用cognito獲取密鑰,訪問密鑰和會話令牌。 – dkarchmer

+0

更新了OP,代碼顯示了我是如何獲得會話和s3客戶端的 – dkarchmer

回答

1

遇到沒有連接到S3的問題已簽署的網址,你所想象。

Cognito建立在稱爲安全令牌服務(STS)的IAM服務之上。該服務允許通過使用谷歌,Facebook,亞馬遜,通過承擔角色(IAM用戶,EC2實例,Lambda函數等)或通過提供聯合身份驗證方案的Web身份令牌來生成臨時憑證(訪問密鑰和密鑰) 。

根據用例,這些憑證的範圍是有限的(根據您定義的任何IAM角色),並且時間在15秒到幾個小時之間。

您通過Cognito獲取的憑據由STS生成。在低級別,STS API允許指定您希望這些憑據保持有效的時間(請參閱http://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。但是,我無法在Cognito API(https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html)中找到等效項。我希望在這一點上被證明是錯誤的。

爲什麼你看到錯誤?

根據您提供的元素,我的猜測是您的下載代碼運行時間超過了您收到的臨時憑證的壽命。首先下載作品,但後來沒有。

如何解決它?

  • 在低層次,一個乾淨的解決方案是使用STS,而不是Cognito,但 將需要大量的工作和你將失去使用跨越登錄提供商Cognito(穩定的用戶ID的所有 好處, 多個登錄提供者,未經身份驗證的用戶...)
  • 假設您有多個文件傳輸,在循環中的另一種解決方案是檢查憑證過期時間,並在文件傳輸之間更新它們。檢查resp['Credentials']['Expiration']的到期時間。您可以通過再次致電get_credentials_for_identity來續訂Cognito提供的憑證。
  • 您也可以考慮通過AWS提供的50多個邊緣位置之一下載您的文件。這是本週剛發佈的一項新的S3功能,可大大加快上傳或下載大文件的速度。有關更多詳情,請參閱http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html。有與該用法相關的價格標籤,請參閱http://aws.amazon.com/s3/pricing/
+1

我忘記了認知正在產生臨時令牌,但我現在可以看到問題出現在那裏。有些東西還在繼續,因爲令牌應該持續24小時,但有了這個,我知道要調試什麼 – dkarchmer