求助:Terraform的S3生命周期策略无法删除指定文件夹内容
通过Terraform创建了名为arapbi的S3存储桶,配置的生命周期策略要求athena_results/路径下的对象3天后过期,非当前版本对象1天后过期,但策略未按预期删除该路径下的数据。Terraform代码如下:
resource "aws_s3_bucket" "arapbi" { bucket = "arapbi" tags = { Name = "ARAPBI" } } resource "aws_s3_bucket_lifecycle_configuration" "arapbi" { bucket = aws_s3_bucket.arapbi.id rule { id = "Lifecycle" status = "Enabled" filter { object_size_greater_than = "0" prefix = "athena_results/" } expiration { days = 3 } noncurrent_version_expiration { noncurrent_days = 1 } } }
以下是具体排查思路:
确认生命周期策略已生效
登录AWS控制台,进入该S3桶的「管理」→「生命周期规则」,检查是否存在Lifecycle规则,状态是否为启用,前缀、过期天数等参数是否和Terraform配置一致。如果怀疑配置未同步,手动执行terraform apply确认配置已推送至AWS。区分对象的版本状态
规则同时配置了当前版本和非当前版本的过期逻辑:- 当前版本对象:需等待创建时间满3天,S3会在过期后24小时内执行删除;
- 非当前版本对象:只有当对象被覆盖/删除产生新版本后,旧版本才会成为非当前版本,此时满1天会被清理。
若桶未开启版本控制,noncurrent_version_expiration规则不会生效,仅关注当前版本的过期时间即可。
验证对象前缀匹配度
S3前缀区分大小写,检查athena_results/下的对象路径是否严格匹配规则前缀。比如Athena_Results/file.csv(大小写不符)、athenaresults/file.csv(格式错误)这类对象不会被规则命中。核对对象创建时间
在S3控制台查看目标对象的「创建时间」,确认是否已超过3天。生命周期规则的过期天数是基于对象创建时间计算,而非规则生效时间,未到时间的对象不会被删除。排查规则冲突
若桶上存在其他生命周期规则,可能存在优先级冲突。S3会执行最匹配的规则,比如其他规则对athena_results/对象设置了更长过期时间,或配置了expired_object_delete_marker等,都会影响当前规则执行。查看操作日志
开启S3访问日志,或在CloudTrail中搜索该桶的DeleteObject、LifecycleExpiration事件,确认S3是否尝试执行清理,是否有报错(如权限问题)。检查Terraform配置逻辑
配置中filter块同时使用object_size_greater_than和prefix,二者是逻辑与关系,只有大于0字节且前缀匹配的对象才会被处理。若athena_results/下有0字节对象,可删除object_size_greater_than = "0"这一行,避免过滤掉这类对象。
内容的提问来源于stack exchange,提问作者Evan Volgas

