Terraform配置S3存储桶双生命周期规则是否生效的疑问
S3存储桶生命周期策略配置验证
问题描述
我有个名为my-bucket的S3存储桶,桶里有不少对象和文件夹,其中包含TestDataQA子文件夹。我想配置生命周期策略,让桶里非TestDataQA文件夹的对象30天后自动删除,TestDataQA文件夹内的对象则10000天后再删除。
我已经写了下面这段Terraform代码,并且成功执行了plan和apply,但不确定这个配置能不能按预期工作,会不会误删TestDataQA里的对象?
resource "aws_s3control_bucket_lifecycle_configuration" "my-lifecycle-conf" { bucket = "my-bucket" rule { id = "thousands-days-data" expiration { days = 10000 } filter { prefix = "TestDataQA/" } status = "Enabled" } rule { id = "30-days-data" expiration { days = 30 } status = "Enabled" } }
问题分析
当前配置肯定会误删TestDataQA里的对象,原因如下:
- S3的生命周期规则是只要对象匹配规则就会触发,一个对象可以同时匹配多个规则。
TestDataQA/路径下的对象会同时命中两个规则:第一个规则匹配TestDataQA/前缀,第二个规则没有任何过滤条件,相当于匹配所有对象。- 当同一个对象被多个过期规则匹配时,S3会执行过期时间最短的那个规则,也就是30天后就删除
TestDataQA里的对象,完全不符合你的预期。
正确配置方案
你需要修改第二个规则,添加过滤条件排除TestDataQA/前缀的对象。利用S3生命周期规则的not过滤条件,让第二个规则只作用于非TestDataQA路径下的对象:
resource "aws_s3control_bucket_lifecycle_configuration" "my-lifecycle-conf" { bucket = "my-bucket" rule { id = "thousands-days-data" expiration { days = 10000 } filter { prefix = "TestDataQA/" } status = "Enabled" } rule { id = "30-days-data" expiration { days = 30 } filter { not { prefix = "TestDataQA/" } } status = "Enabled" } }
验证逻辑
TestDataQA/下的对象:只会匹配第一个规则,10000天后过期删除。- 其他路径的对象:只会匹配第二个规则,30天后过期删除。
- 这样就能实现你想要的差异化过期策略了。
内容的提问来源于stack exchange,提问作者Rohini
相关产品推荐
相关产品推荐

