如何在Terraform templatefile迭代中生成双JSON对象并修正ID索引
问题描述
需要在Terraform的templatefile每次迭代中生成两个JSON对象,当前已能生成对应结构,但rule-id的索引无法实现连续递增。
原模板
${jsonencode({ rules = flatten([ [ for index, value in schemas : { "rule-type": "selection", "rule-id": "${index + 1}", "object-locator": { "schema-name": "${value}", "table-name": "%" }, } ], ]) })}
调用代码
variable "schemas" { default = ["xxx", "yyy", "zzz"] } output "json_rules" { value = templatefile("${path.module}/rules.json.tpl", { schemas = var.schemas }) }
当前输出
{ "rules": [ { "object-locator": { "schema-name": "xxx", "table-name": "%" }, "rule-id": 1, "rule-type": "selection" }, { "object-locator": { "schema-name": "yyy", "table-name": "%" }, "rule-id": 2, "rule-type": "selection" }, { "object-locator": { "schema-name": "zzz", "table-name": "%" }, "rule-id": 3, "rule-type": "selection" } ] }
期望输出
{ "rules": [ { "object-locator": { "schema-name": "xxx", "table-name": "%" }, "rule-id": 1, "rule-type": "selection" }, { "rule-type": "transformation", "rule-id": "2", "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "xxx" }, "value": "xxx" }, { "object-locator": { "schema-name": "yyy", "table-name": "%" }, "rule-id": 3, "rule-type": "selection" }, { "rule-type": "transformation", "rule-id": "4", "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "yyy" }, "value": "yyy" }, { "object-locator": { "schema-name": "zzz", "table-name": "%" }, "rule-id": 5, "rule-type": "selection" }, { "rule-type": "transformation", "rule-id": "6", "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "zzz" }, "value": "zzz" } ] }
编辑1:结构正确但索引错误的尝试
修改后的模板
${jsonencode({ rules = flatten([ [ for index, value in schemas : [ { "rule-type": "selection", "rule-id": index + 1, "object-locator": { "schema-name": "${value}", "table-name": "%" } }, { "rule-type": "transformation", "rule-id": index + 2, "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "${value}" } }] ], ]) })}
修正后输出(索引错误)
{ "rules": [ { "object-locator": { "schema-name": "xxx", "table-name": "%" }, "rule-id": 1, "rule-type": "selection" }, { "object-locator": { "schema-name": "xxx" }, "rule-action": "rename", "rule-id": 2, "rule-target": "schema", "rule-type": "transformation" }, { "object-locator": { "schema-name": "yyy", "table-name": "%" }, "rule-id": 2, "rule-type": "selection" }, { "object-locator": { "schema-name": "yyy" }, "rule-action": "rename", "rule-id": 3, "rule-target": "schema", "rule-type": "transformation" }, { "object-locator": { "schema-name": "zzz", "table-name": "%" }, "rule-id": 3, "rule-type": "selection" }, { "object-locator": { "schema-name": "zzz" }, "rule-action": "rename", "rule-id": 4, "rule-target": "schema", "rule-type": "transformation" } ] }
解决方案
问题核心是rule-id的计算逻辑错误:每个schema对应两个规则,需基于索引计算出连续递增的ID。修改后的模板如下:
${jsonencode({ rules = flatten([ for index, value in schemas : [ { "rule-type": "selection", "rule-id": index * 2 + 1, "object-locator": { "schema-name": value, "table-name": "%" } }, { "rule-type": "transformation", "rule-id": index * 2 + 2, "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": value }, "value": value } ] ]) })}
关键调整说明
- ID计算逻辑:利用从0开始的
index,每个schema的两个规则ID分别为index*2+1和index*2+2,确保ID连续唯一。 - 简化变量引用:去掉不必要的字符串插值
${value},直接使用变量value,jsonencode会自动处理字符串转义。 - 补全缺失字段:给
transformation规则添加了期望输出中要求的value字段。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

