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

Terraform传map变量到CodePipeline EnvironmentVariables段报错解决

报错核心原因

AWS CodePipeline 动作配置的EnvironmentVariables字段要求传入的是固定结构的JSON序列化字符串,格式为对象数组,每个数组元素必须包含name(环境变量名)、value(环境变量值,字符串类型)两个必填字段,可额外加type字段指定值类型。
你之前直接jsonencode(var.egress_ports)生成的是单层JSON对象(形如{"from_port":8443,"to_port":8443}),和要求的数组结构完全不匹配;用templatefile时如果没有把map转换成上述要求的数组结构,同样会触发格式校验报错。

无需模板的最简实现

不需要调用templatefile,直接用for表达式把map转换成要求的结构后再做JSON序列化即可,配置如下:

EnvironmentVariables = jsonencode([
  for env_key, env_val in var.egress_ports : {
    name  = env_key
    value = tostring(env_val) # 强制转换为字符串,避免数值、布尔类型值触发类型校验错误
  }
])

针对你给出的默认egress_ports取值,上述配置最终生成的JSON字符串完全符合CodePipeline的要求:

[{"name":"from_port","value":"8443"},{"name":"to_port","value":"8443"}]

如果需要同时传入其他固定环境变量,用concat拼接数组即可:

EnvironmentVariables = jsonencode(concat(
  [
    {
      name  = "PIPELINE_NAME"
      value = var.pipeline_name
    },
    {
      name  = "APP_ID"
      value = tostring(var.app_id)
    }
  ],
  [
    for env_key, env_val in var.egress_ports : {
      name  = env_key
      value = tostring(env_val)
    }
  ]
))
templatefile方案的修正方式

如果要保留templatefile的渲染逻辑,需要确保模板最终输出的是符合要求的数组结构JSON,不要直接把编码后的map插入对象位置。参考模板写法:

[
  {"name":"PIPELINE_NAME","value":"${pipeline_name}"},
  {"name":"APP_ID","value":"${app_id}"},
  ${jsonencode([for k, v in jsondecode(egress_ports) : {name = k, value = tostring(v)}])}
]

注意传入模板的egress_ports是jsonencode生成的字符串,模板内需要先通过jsondecode转回结构化值再做格式转换,否则会出现JSON语法错误。

内容的提问来源于stack exchange,提问作者sharad jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:18:19