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