自定义Terraform模块传参构建AWS CodePipeline必填参数缺失报错
问题根因
报错和遍历索引逻辑无关,是两处基础配置错误导致的:
- 工作区YAML文件语法错误:YAML键值对要求用
:分隔,你在action块里混用了HCL的=赋值,解析器根本识别不到这些用等号的字段,导致传入模块的action对象里name/owner/category这些必填属性全部为空,才触发了参数缺失的报错。 - 模块本身的CodePipeline配置不符合AWS Provider规范:比如要求
input_artifacts/output_artifacts必须是列表格式,你直接传字符串;configuration块硬编码了4个固定字段,既无法支持其他类型的action,传入null值还会触发配置校验错误。
修复步骤
1. 修正YAML配置语法
统一使用YAML标准的:做键值分隔,将input_artifacts/output_artifacts调整为列表格式,把action专属配置归到configuration字段下,和顶层必填字段做区分:
test_pipeline_prefix: "test" test_pipeline_name: "test-pipeline" test_pipeline_description: "this is a POC pipeline" test_pipeline_s3: "<<REDACTED ARN>>" test_pipeline_codestar_arn: "<<REDACTED ARN>>" test_pipeline_tags: {} test_pipeline_stages: - name: "Source" actions: - name: "Source" category: "Source" owner: "AWS" version: "1" provider: "CodeStarSourceConnection" output_artifacts: - "source_output" region: "eu-west-2" run_order: 1 configuration: BranchName: "main" PollForSourceChanges: "false" RepositoryName: "<<REDACTED REPO>>" ConnectionArn: "<<REDACTED CODESTAR ARN>>" - name: "Plan" actions: - name: "Plan" category: "Build" owner: "AWS" version: "1" provider: "CodeBuild" input_artifacts: - "source_output" output_artifacts: - "build_output" run_order: 2 configuration: ProjectName: "pipeline-plan"
注意:这里把原配置里单数形式的action字段改为复数actions,符合多动作的列表语义,避免后续扩展时的命名歧义。
2. 修正模块dynamic块逻辑
移除硬编码的configuration字段,正确处理artifact列表格式,自动过滤configuration中的空值:
dynamic "stage" { for_each = [for s in var.stages : s if lookup(s, "enabled", true)] content { name = stage.value.name dynamic "action" { for_each = stage.value.actions content { name = action.value.name owner = action.value.owner version = action.value.version category = action.value.category provider = action.value.provider input_artifacts = lookup(action.value, "input_artifacts", []) output_artifacts = lookup(action.value, "output_artifacts", []) configuration = { for k, v in lookup(action.value, "configuration", {}) : k => v if v != null } role_arn = lookup(action.value, "role_arn", null) run_order = lookup(action.value, "run_order", 1) region = lookup(action.value, "region", null) } } } } tags = merge( { "Name" = "${var.prefix}-${var.name}" }, var.tags, )
3. 给变量加类型约束
在模块的variables.tf中为stages变量添加明确的类型定义,提前拦截格式错误的输入,避免资源创建阶段才报晦涩的参数错误:
variable "stages" { type = list(object({ name = string enabled = optional(bool, true) actions = list(object({ name = string owner = string version = string category = string provider = string input_artifacts = optional(list(string), []) output_artifacts = optional(list(string), []) configuration = optional(map(any), {}) role_arn = optional(string, null) run_order = optional(number, 1) region = optional(string, null) })) })) default = [] }
验证方式
修改完成后先执行terraform console,输入local.vars.test_pipeline_stages查看解析后的结构,确认每个action下的name/owner/version等必填字段都有正确值、无null,再执行terraform plan即可正常生成执行计划。
内容的提问来源于stack exchange,提问作者KerbalRemedies
相关产品推荐
相关产品推荐

