You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Terraform模块传参构建AWS CodePipeline必填参数缺失报错

问题根因

报错和遍历索引逻辑无关,是两处基础配置错误导致的:

  1. 工作区YAML文件语法错误:YAML键值对要求用:分隔,你在action块里混用了HCL的=赋值,解析器根本识别不到这些用等号的字段,导致传入模块的action对象里name/owner/category这些必填属性全部为空,才触发了参数缺失的报错。
  2. 模块本身的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:03:35