我想知道如何延长密钥的到期时间。我不是指访问该对象的签名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.
然后我根据此链接尝试了上面的变体(添加了setStorageClass): https://alestic.com/2013/09/s3-lifecycle-extend/
感谢任何帮助。
答案 0 :(得分:2)
您似乎正在努力实现以下目标:
根据您引用的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天期限开始的日期。
答案 1 :(得分:1)
我确实有正确的答案。下面的Python代码可能会将BUCKET / KEY复制到自身上,并且还会重置过期。 AWS S3基于24小时时钟将到期时间四舍五入到同一时间,因此在同一天完成的任何复制都不会被注意到。我让密钥在90天刷新一周左右进行测试,看起来好像是“上次修改”+ ExpirationRuleDays =“到期日”。
我创建了两个密钥,在运行以下代码后,我从S3 Management Console获得了以下格式。
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
新 - 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
新 - 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);
}