Terraform配置版本化S3桶生命周期规则:永久删除旧对象
问题解答
首先明确S3版本控制下的核心概念:
- 当前版本:对象的最新版本,未被覆盖或标记删除的版本
- 非当前版本:被新版本覆盖、或被删除标记替代的旧版本
针对你的需求(永久删除所有创建满365天的对象,无论存储类),仅设置expiration是不可行的,原因如下:
expiration块的days参数,在启用版本控制的桶中,只会给当前版本对象添加删除标记(Delete Marker),并不会彻底删除对象本身——此时原对象会变成非当前版本,依然保存在桶中。
要实现彻底删除的需求,你需要同时配置noncurrent_version_expiration,配合expiration一起工作:
expiration:让创建满365天的当前版本对象生成删除标记,转为非当前版本noncurrent_version_expiration:彻底删除满足条件的非当前版本对象(包括由expiration生成删除标记后的原对象,以及其他旧版本对象)
正确的Terraform配置示例
resource "aws_s3_bucket" "main" { bucket = "zzz-bucket-127364-${terraform.workspace}" server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } } lifecycle_rule { enabled = true # 180天后转存至Glacier transition { days = 180 storage_class = "GLACIER" } # 对创建满365天的当前版本对象添加删除标记,转为非当前版本 expiration { days = 365 } # 彻底删除成为非当前版本满0天的对象(即转为非当前版本后立即删除) # 若希望给非当前版本留缓冲期,可调整days为大于0的数值 noncurrent_version_expiration { days = 0 } } versioning { enabled = true } }
关键说明
noncurrent_version_expiration的days参数,指的是对象成为非当前版本后的天数,而非对象创建的天数。上述配置中,当前版本在365天时转为非当前版本,随后立即被删除,整体效果符合“创建满365天彻底删除”的需求。- 该配置会覆盖所有存储类(包括Glacier)的对象,满足你“无论存储类”的要求。
内容的提问来源于stack exchange,提问作者Trent
相关产品推荐
相关产品推荐

