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
相关产品推荐
相关产品推荐

