Terraform - 错误:不支持的属性,此对象没有名为"name"的属性



我对Terraform有点陌生,我正在尝试在Azure订阅中构建Azure私有DNS区域。

在Terraform中,我试图利用模块内的地图对象创建该资源。下面是我的代码:

<<p>根模块/strong>
dns_zone = {
"private.vaultcore.azure.net" = {
registration_enabled = false
vnet_link_name       = join("-", [data.azurerm_key_vault.existing-keyvault.name, "link"])
vnet_id              = data.azurerm_virtual_network.existing-vnet.id
a_record = [
{
name         = "test"
ttl          = 300
ip_addresses = ["10.10.10.10"]
}
]
}
}

子模块- main.tf

resource "azurerm_private_dns_zone" "zone" {
for_each = var.dns_zone
name                = each.key
resource_group_name = var.rsg_name
}
resource "azurerm_private_dns_zone_virtual_network_link" "link" {
for_each = var.dns_zone
name                  = each.value.vnet_link_name
resource_group_name   = var.rsg_name
private_dns_zone_name = azurerm_private_dns_zone.zone[each.key].name
virtual_network_id    = each.value.vnet_id
registration_enabled  = each.value.registration_enabled
}
resource "azurerm_private_dns_a_record" "records" {
for_each = { for a_record in var.dns_zone : a_record.name => a_record }
name                = each.value.name
zone_name           = azurerm_private_dns_zone.zone[each.key].name
resource_group_name = var.rsg_name
ttl                 = each.value.ttl
records             = split(",", replace(each.value.ip_addresses, " ", ""))
}

子模块- variable.tf

variable "dns_zone" {
type = map(object({
registration_enabled = bool
vnet_link_name       = string
vnet_id              = string
a_record = list(object({
name         = string,
ttl          = number,
ip_addresses = list(string)
}))
}))

子模块- output.tf

output "zone" {
value = azurerm_private_dns_zone.zone
}
output "records" {
value = azurerm_private_dns_a_record.records
}

当我运行terraform plan时,我得到以下消息:

│ Error: Unsupported attribute
│
│   on ..modulesvnetmain.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".

我的目标是能够创建一个dns_zone映射,该映射将为每个密钥创建私有DNS区域。在键内,我将能够调整特定的设置,并创建a记录的列表。

我已经在这方面工作了一段时间,但我似乎无法确定for_each循环中的问题。如果我注释掉Azure私有DNS A记录资源,只使用私有DNS区域和虚拟网络链接资源,它将正确显示地形计划。

如果将来有人读到这篇文章并想知道如何解决这个问题,我发现我必须使用flatten函数和嵌套的for表达式。下面是附加代码。这进入子模块- main。tf文件。其他一切都保持原样。一旦我运行了地形计划,它就成功地生成了计划信息。

locals {
dns_a_records = flatten([
for dns_zone_key, zone in var.dns_zone : [
for dns_record_key, record in zone.a_record : {
dns_zone_key   = dns_zone_key
dns_record_key = dns_record_key
dns_zone_name  = azurerm_private_dns_zone.zone[dns_zone_key].name
name           = record.name
ttl            = record.ttl
ip_addresses   = record.ip_addresses
}
]
])
}
resource "azurerm_private_dns_a_record" "records" {
for_each = { for record in local.dns_a_records : "${record.dns_zone_key}.${record.dns_record_key}" => record }
name                = each.value.name
zone_name           = each.value.dns_zone_name
resource_group_name = var.rsg_name
ttl                 = each.value.ttl
records             = each.value.ip_addresses
}

相关内容

最新更新