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
相关产品推荐
相关产品推荐

