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

Terraform报错:Unsupported attribute,对象无name属性求助

Terraform Azure专用DNS区域A记录创建报错解决

问题场景

使用Terraform模块通过map对象定义Azure专用DNS区域及关联A记录,运行terraform plan时,azurerm_private_dns_a_record资源的for_each循环触发以下错误:

│ Error: Unsupported attribute
│
│   on ..\modules\vnet\main.tf line 176, in resource "azurerm_private_dns_a_record" "records":
│  176:   for_each = { for a_record in var.dns_zone : a_record.name => a_record }
│
│ This object does not have an attribute named "name".

注释该资源后计划可正常执行,需修复循环逻辑以创建包含A记录的专用DNS区域。

错误原因

var.dns_zone是map类型,键为DNS区域名称,值是包含a_record列表的配置对象。原for_each遍历的是var.dns_zone的元素(即区域配置对象),这些对象本身没有name属性——name属性存在于每个区域配置的a_record列表子对象中。同时,一个DNS区域可能对应多个A记录,需要将所有区域的A记录扁平化处理,生成唯一标识用于for_each。

修正方案

使用嵌套for表达式,遍历每个DNS区域及其下的A记录,生成以"{DNS区域名}-{A记录名}"为唯一键的map,确保每个A记录实例唯一;同时修正records字段的处理逻辑(ip_addresses已是list类型,无需额外转换)。

修正后代码

子模块main.tf中azurerm_private_dns_a_record部分

resource "azurerm_private_dns_a_record" "records" {
  # 扁平化所有DNS区域下的A记录,生成唯一键
  for_each = {
    for zone_name, zone_config in var.dns_zone :
    for a_rec in zone_config.a_record :
    "${zone_name}-${a_rec.name}" => merge(a_rec, { zone_name = zone_name })
  }

  name                = each.value.name
  zone_name           = azurerm_private_dns_zone.zone[each.value.zone_name].name
  resource_group_name = var.rsg_name
  ttl                 = each.value.ttl
  records             = each.value.ip_addresses # 直接使用list类型的ip_addresses
}

其他代码说明

  • 根模块、子模块variable.tf、output.tf无需修改,保持原定义即可。
  • 嵌套for表达式中,通过merge(a_rec, { zone_name = zone_name })将DNS区域名注入到A记录对象中,方便后续关联对应的DNS区域资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:20:37