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

Terraform模块中azurerm_dns_txt_record的record块重构优化问题

问题根因

你当前的问题核心是两点:

  1. 原有dynamic块写法逻辑本身没有语法错误,出现记录覆盖是因为你传入的TxtRecords参数没有做去重,或者你混淆了TXT记录与MX记录的资源定义(你描述中提到生成了MX记录,但给出的代码全是TXT记录的配置,属于逻辑错位)
  2. 单个azurerm_dns_txt_record资源对应同一主机名(如你配置的@)下的所有TXT值集合,如果你需要每个值对应独立的DNS记录,需要把记录值展开为独立的资源实例。
优化方案

方案1:单资源多record块(同一主机名下所有TXT值放在同一个资源里,和你最初硬编码的效果一致)

首先优化冗余的local定义,去掉无用的flatten,给记录值做去重处理:

locals {
  txt_records = [
    for i in var.DnsZones : {
      zone_name           = i.ZoneName
      resource_group_name = i.ResourceGroup
      name                = "@"
      ttl                 = i.Ttl
      records             = toset(i.TxtRecords) # 转set去重,避免重复值导致的覆盖
    }
  ]
}

resource "azurerm_dns_zone" "zone" {
  count               = length(var.DnsZones)
  name                = var.DnsZones[count.index].ZoneName
  resource_group_name = var.DnsZones[count.index].ResourceGroup
}

resource "azurerm_dns_txt_record" "record-txt" {
  count               = length(local.txt_records)
  resource_group_name = local.txt_records[count.index].resource_group_name
  zone_name           = local.txt_records[count.index].zone_name
  ttl                 = local.txt_records[count.index].ttl
  name                = local.txt_records[count.index].name

  dynamic "record" {
    for_each = local.txt_records[count.index].records
    content {
      value = record.value
    }
  }

  depends_on = [azurerm_dns_zone.zone]
}

执行terraform plan即可看到每个资源下的record块数量和你传入的TxtRecords长度一致,不会出现覆盖。

方案2:每个TXT值对应独立资源

如果你需要每个TXT值对应独立的DNS记录(支持不同主机名),则需要把记录值展开到local的外层,用for_each管理资源实例:

locals {
  txt_records = flatten([
    for zone_idx, zone in var.DnsZones : [
      for record_idx, txt_val in zone.TxtRecords : {
        zone_name           = zone.ZoneName
        resource_group_name = zone.ResourceGroup
        name                = "@" # 如需不同主机名可在此修改
        ttl                 = zone.Ttl
        record_value        = txt_val
        unique_key          = "${zone_idx}-${record_idx}" # 全局唯一标识避免资源冲突
      }
    ]
  ])
}

resource "azurerm_dns_zone" "zone" {
  count               = length(var.DnsZones)
  name                = var.DnsZones[count.index].ZoneName
  resource_group_name = var.DnsZones[count.index].ResourceGroup
}

resource "azurerm_dns_txt_record" "record-txt" {
  for_each            = { for r in local.txt_records : r.unique_key => r }
  resource_group_name = each.value.resource_group_name
  zone_name           = each.value.zone_name
  ttl                 = each.value.ttl
  name                = each.value.name

  record {
    value = each.value.record_value
  }

  depends_on = [azurerm_dns_zone.zone]
}
MX记录适配

如果你实际需要创建的是MX记录,只需要将资源类型替换为azurerm_dns_mx_record,调整record块的字段即可,逻辑和上述TXT记录完全一致:

# MX记录示例
dynamic "record" {
  for_each = local.mx_records
  content {
    preference = record.value.priority
    exchange   = record.value.domain
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 10:54:03