更新AWS S3过期时间

red*_*boy 9 amazon-s3 amazon-web-services

我想知道如何延长密钥的有效期。 我指的不是访问对象的签名 URL,而是密钥本身。

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

上面的方法没有起作用。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.
Run Code Online (Sandbox Code Playgroud)

然后,我根据此链接尝试了上述内容的变体(添加了 setStorageClass): https://alestic.com/2013/09/s3-lifecycle-extend/

任何帮助表示赞赏。

Joh*_*ein 6

您似乎正在尝试实现以下目标:

  • 定义一个具有生命周期规则的存储桶,该规则将在 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')
Run Code Online (Sandbox Code Playgroud)

此代码将对象“复制到自身”,并且管理控制台显示新的上次修改日期。我没有测试生命周期规则,但我假设这是用于确定 90 天期限开始的日期。


red*_*boy 5

我确实有正确的答案。下面的 Python 代码可能会执行相同的技巧,将 BUCKET/KEY 复制到自身上,并且还会重置过期时间。AWS S3 根据 24 小时时钟将到期时间四舍五入到同一时间,因此在同一天完成的任何复制都不会被注意到。我让密钥在 90 天的刷新中放置一周左右进行测试,看起来“上次修改”+ ExpirationRuleDays =“到期日期”确实成立。

我创建了两个密钥,运行以下代码后,我从 S3 管理控制台获得了以下信息。

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

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

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

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

代码:

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