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

Terraform遍历对象列表:解决for_each不支持列表的实现方案

解决Terraform遍历嵌套Zone变量生成Cloudflare记录的问题

要实现遍历嵌套结构的变量生成cloudflare_record资源,核心是把嵌套的zone->记录列表结构转换成Terraform的for_each支持的唯一键值映射,具体步骤如下:

1. 确保变量类型正确(可选,若已定义可跳过)

如果在Terraform中声明该变量,需指定对应类型匹配传入的结构:

variable "zones" {
  type = map(list(object({
    name  = string
    type  = string
    value = string
  })))
  description = "Cloudflare域名区域及下属DNS记录"
}

2. 扁平化嵌套结构

通过locals结合双层for表达式,把每个Zone下的记录转换成包含Zone ID的独立对象,同时生成全局唯一的键:

locals {
  flattened_records = {
    # 外层遍历每个Zone,内层遍历Zone下的每条记录
    for zone_id, records in var.zones :
    for record in records :
    # 用Zone ID+记录名生成唯一键,避免重复
    "${zone_id}-${record.name}" => merge(record, { zone_id = zone_id })
  }
}

若同一Zone下存在同名不同类型的记录,需把type也加入键中,比如"${zone_id}-${record.name}-${record.type}",保证键的唯一性。

3. 遍历生成Cloudflare记录资源

用for_each遍历扁平化后的映射,每条记录对应一个cloudflare_record资源:

resource "cloudflare_record" "record" {
  for_each = local.flattened_records

  zone_id = each.value.zone_id
  name    = each.value.name
  value   = each.value.value
  type    = each.value.type
}

这样就能自动为每个Zone下的每条记录生成对应的资源,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:05:20