2015-05-19 102 views
0

我想知道如何擴展密鑰的到期時間。我不是指訪問對象但簽名本身的簽名URL。更新AWS S3到期時間

我將AWS設置爲有一個規則,即存儲區中的所有對象都應在90天內過期。這是我想在大多數情況下發生的事情。現在,我需要將個人密鑰的使用期限延長90天。事實上,重置倒計時很好。

我試過這個使用AWS SDK無濟於事。

我第一次嘗試使用copyObject改變的元數據:

ObjectMetadata meta = s3client.getObjectMetadata(bucket, key); 
meta.setExpirationTime(getFutureDate(90*DAYS)); 
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, key, bucket, key); 
copyObjectRequest.setNewObjectMetadata(meta); 
copyObjectRequest.setStorageClass(StorageClass.Standard); 
s3client.copyObject(copyObjectRequest); 

以上沒有工作。 JavaDoc甚至爲我提供了原因(嘗試後讀取它)。

void com.amazonaws.services.s3.model.ObjectMetadata.setExpirationTime(Date expirationTime) 

For internal use only. This will *not* set the object's expiration time, and is only used to set the value in the object after receiving the value in a response from S3. 

我然後試圖在上述的變型基於此鏈路(加入setStorageClass)上: https://alestic.com/2013/09/s3-lifecycle-extend/

任何幫助理解。

+0

你說的 「上面沒有工作」 是什麼意思?它運行了嗎?它有錯誤嗎? –

回答

0

我確實有正確的答案。下面的Python代碼可能會將BUCKET/KEY複製到自身,並重置過期。 AWS S3根據24小時時鐘將到期時間同時縮短,因此在同一天進行的任何複製都不會被注意到。我讓密鑰在90天內刷新一週左右來做測試,看起來好像是「Last Modified」+ ExpirationRuleDays =「Expiry Date」。

我有兩個鍵創建,運行下面的代碼後,我得到了以下形式的S3管理控制檯。

OLD - 1

Last Modified: Thu Jun 04 15:48:58 GMT-700 2015 
Expiry Date: Wed Sep 02 17:00:00 GMT-700 2015 
Expiration Rule: Auto-Expire after 90 days 

NEW - 1

Last Modified: Mon Jun 08 15:37:01 GMT-700 2015 
Expiry Date: Sun Sep 06 17:00:00 GMT-700 2015 
Expiration Rule: Auto-Expire after 90 days 

OLD - 2

Last Modified: Thu Jun 04 13:34:36 GMT-700 2015 
Expiry Date: Wed Sep 02 17:00:00 GMT-700 2015 
Expiration Rule: Auto-Expire after 90 days 

NEW - 2

Last Modified: Mon Jun 08 15:41:19 GMT-700 2015 
Expiry Date: Sun Sep 06 17:00:00 GMT-700 2015 
Expiration Rule: Auto-Expire after 90 days 

CODE:

public void refreshURLTTL(String messageId) { 
    AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider(configFileName, profileName)); 

    ObjectMetadata meta = s3client.getObjectMetadata(BUCKETNAME, KEY); 
    ObjectMetadata newmeta = meta.clone(); 
    Date oldExpiration = meta.getExpirationTime(); 

    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(BUCKETNAME, KEY, BUCKETNAME, KEY); 
    copyObjectRequest.setNewObjectMetadata(newmeta); 

    s3client.copyObject(copyObjectRequest);  

    ObjectMetadata finalmeta = s3client.getObjectMetadata(BUCKETNAME, KEY); 
    Date currentExpiration = finalmeta.getExpirationTime(); 

    System.out.println("OLD: "+oldExpiration); 
    System.out.println("NEW: "+currentExpiration); 
} 
0

這樣看來,你正在努力實現以下幾點:

  • 定義一個桶一個生命週期規則是90天之後將永久刪除對象
  • 對象上傳到桶
  • 對於某些指定的對象,重新啓動90天的超時時間

根據您引用的alestic博客文章,此可以通過將對象複製到其自身上來完成。事實上,它似乎甚至不需要改變存儲類別。

我上傳的對象到桶中,然後運行這個Python代碼:

import boto 
conn = boto.s3.connect_to_region('ap-southeast-2') 
mybucket = conn.get_bucket('BUCKET-NAME') 
mybucket.copy_key('OBJECT-NAME', 'BUCKET-NAME', 'OBJECT-NAME') 

這段代碼複製的對象「本身」和管理控制檯顯示新的最後修改日期。我沒有測試生命週期規則,但我會認爲這是確定90天期開始的日期。

+0

這看起來像上面我的Java示例的Python equivilent,並且可能也會起作用。我確認了最近修改的數據用於確定90天的開始,儘管麪包屑非常混亂。 – redboy