Terraform S3生命周期规则失效:替换try为lookup后配置不生效
解决Terraform S3生命周期规则中止未完成分段上传不生效问题
问题概述
需要通过S3生命周期规则在指定天数后中止未完成的分段上传,要求使用lookup替代try函数,但调用自定义Terraform模块时,配置的中止规则未生效——执行terraform plan未生成预期的abort_incomplete_multipart_upload块,实际输出与预期不符。
问题原因
- 字段名不匹配:模块代码中动态块
abort_incomplete_multipart_upload从规则对象的abort_incomplete_multipart_upload字段读取配置,但调用模块时传入的字段名是abort_incomplete_multipart_upload_days,导致模块无法识别该配置。 try函数未替换:原模块使用try处理生命周期规则的JSON解码逻辑,未满足用lookup替代的要求。
修复方案
1. 修改自定义模块代码
替换try为lookup逻辑处理规则输入,同时确保动态块读取正确的字段:
resource "aws_s3_bucket_lifecycle_configuration" "default" { count = length(var.lifecycle_rule) != 0 ? 1 : 0 bucket = aws_s3_bucket.bucket.bucket dynamic "rule" { # 用lookup结合类型判断替代try,处理字符串/列表两种输入格式 for_each = lookup({ string = jsondecode(var.lifecycle_rule) list = var.lifecycle_rule }, type(var.lifecycle_rule), var.lifecycle_rule) content { id = lookup(rule.value, "id", "default") status = lookup(rule.value, "status", "Enabled") dynamic "abort_incomplete_multipart_upload" { # 检查规则对象中是否存在abort_incomplete_multipart_upload字段 for_each = lookup(rule.value, "abort_incomplete_multipart_upload", null) != null ? [rule.value.abort_incomplete_multipart_upload] : [] content { days_after_initiation = abort_incomplete_multipart_upload.value.days_after_initiation } } } } }
2. 修改模块调用代码
调整生命周期规则的字段名,与模块预期的abort_incomplete_multipart_upload匹配:
module "test" { source = "./s3" bucket_name = "test" lifecycle_rule = [ { expiration = { days = 7 } }, { id = "abort-incomplete-multipart-upload-lifecyle-rule" # 修正字段名为模块预期的abort_incomplete_multipart_upload abort_incomplete_multipart_upload = { days_after_initiation = 6 } } ] }
验证结果
修改后执行terraform plan,将生成预期的配置块:
+ rule { + id = "abort-incomplete-multipart-upload-lifecyle-rule" + status = "Enabled" + abort_incomplete_multipart_upload { + days_after_initiation = 6 } + filter { } }
内容的提问来源于stack exchange,提问作者cloudbud
相关产品推荐
相关产品推荐

