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

如何在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
      }
    ]
  ])
})}

关键调整说明

  1. ID计算逻辑:利用从0开始的index,每个schema的两个规则ID分别为index*2+1和index*2+2,确保ID连续唯一。
  2. 简化变量引用:去掉不必要的字符串插值${value},直接使用变量value,jsonencode会自动处理字符串转义。
  3. 补全缺失字段:给transformation规则添加了期望输出中要求的value字段。

内容的提问来源于stack exchange,提问作者Theo Sweeny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:34:53