更新 AWS S3 过期时间

Updating AWS S3 expiration time

我想知道如何延长密钥的到期时间。我指的不是访问对象的已签名 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 );

以上方法无效。 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.

然后我基于这个 link 尝试了上面的变体(添加了 setStorageClass): https://alestic.com/2013/09/s3-lifecycle-extend/

感谢任何帮助。

看来您正在努力实现以下目标:

  • 定义一个包含 生命周期规则 的存储桶,它将在 90 天后永久删除对象
  • 将对象上传到存储桶
  • 对于某些指定对象,重新启动 90 天超时

根据您引用的 alestic 博客 post,这可以通过将对象复制到自身之上来完成。事实上,它甚至似乎不需要更改存储 class。

我将对象上传到存储桶,然后 运行 这个 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')

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

我确实答对了。下面的 Python 代码可能会使用相同的技巧将 BUCKET/KEY 复制到自身,并且还会重置过期时间。 AWS S3 根据 24 小时时钟将到期时间四舍五入到同一时间,因此不会注意到在同一天完成的任何复制。我让密钥在 90 天刷新后放置一周左右进行测试,看起来 "Last Modified" + ExpirationRuleDays = "Expiry Date" 成立。

我创建了两个密钥,在 运行 下面的代码之后,我从 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

新 - 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

旧 - 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

新 - 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

代码:

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);
}