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

Terraform基于JSON响应嵌套循环创建多资源的实现咨询

Terraform 资源模板实现

首先按以下配置编写locals逻辑,即可生成符合要求的资源name属性:

  1. 定义基础变量与转换逻辑
locals {
  # 区域数组
  regions = [
    {name = "region1"}, 
    {name = "region2"}, 
    {name = "region3"}, 
    {name = "region4"}, 
    {name = "region5"}, 
    {name = "region6"}
  ]
  # 区域集群映射,也可通过jsondecode读取外部JSON文件
  region_cluster_map = {
    "region1" : ["cluster1"],
    "region2" : [],
    "region3" : ["cluster1"],
    "region4" : ["cluster1","cluster2"]
  }
  # 扁平化生成符合要求的资源名称列表
  flattened_resources = flatten([
    # 仅保留JSON中存在的区域,不需要可删除if过滤条件
    for r in local.regions : [
      length(lookup(local.region_cluster_map, r.name, [])) == 0 ? r.name : [
        for c in lookup(local.region_cluster_map, r.name, []) : "${r.name}/${c}"
      ]
    ] if contains(keys(local.region_cluster_map), r.name)
  ])
}
  1. 资源定义
resource "type" "name" {
  count = length(local.flattened_resources)
  name  = local.flattened_resources[count.index]
}

生成的name属性将完全匹配要求的格式:

  • region1/cluster1
  • region2
  • region3/cluster1
  • region4/cluster1
  • region4/cluster2

自定义Final数组逻辑实现

你描述的逻辑完全可以实现,直接在locals中新增如下定义即可:

locals {
  # 复用上方定义的regions、region_cluster_map变量
  Final = flatten([
    for r, cs in local.region_cluster_map : [
      for oc in local.regions : [
        for c in cs : merge(oc, {cluster = "${r}-${c}"})
      ] if oc.name == r
    ]
  ])
}

逻辑说明:

  • 遍历区域集群映射的区域r和对应集群列表cs
  • 匹配regions数组中名称等于r的元素oc
  • 遍历集群列表cs,用merge函数给oc新增cluster属性,值为${r}-${c}
  • 最后通过flatten展开为一维数组,即得到你需要的Final数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:36:03