Terraform:对象列表值没有属性

Terraform: Object List Value Has No Attributes

在 Terraform Plan 上收到一条错误消息,指出我的对象没有名称值的属性。我们正在部署大约 7 个私有 dns 区域,其中许多位于同一个资源组中。有些人可能住在其他地方,但大多数人住在同一个地方。

Error: Unsupported attribute
on Modules/privatednszone/main.tf line 4, in data "azurerm_resource_group" "this":
  name     = each.value.name
This value does not have any attributes.

主要

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "2.83.0"
    }
  }
}

provider "azurerm" {
  features {}
}

variable "private_dns_zones" {
  type = map(object({
    dns_zone_name       = string
    resource_group_name = string
    tags                = map(string)
    vnet_links = list(object({
      zone_to_vnet_link_name    = string
      vnet_name                 = string
      networking_resource_group = string
      zone_to_vnet_link_exists  = bool
      vnet_link_rg_name         = string
    }))
    zone_exists          = bool
    registration_enabled = bool
  }))
  description = "Map containing Private DNS Zone Objects"
  default     = {}
}

data "azurerm_resource_group" "this" {
  # read from local variable, index is resource_group_name
  for_each = local.rgs_map
  name     = each.value.name
}

locals {
  rgs_map = {
    for n in var.private_dns_zones :
    n.resource_group_name => {
      name = n.resource_group_name
    }
  }
}

output "rgs_map" {
  value = local.rgs_map
}

output "rg_data" {
  value = data.azurerm_resource_group.this
}

TFVARS 下面的代码是两个 dns 区域的示例,但还有其他区域。

private_dns_zones = {
  zone1 = {
    dns_zone_name       = "privatelink.vaultcore.azure.net"
    resource_group_name = "Terraform1"
    tags = {
      iac    = "Terraform"
      syntax = "zone1"
    }
    zone_exists = false
    vnet_links = [
      {
        zone_to_vnet_link_name    = "vaultcore-vnet-eastus2-01"
        vnet_name                 = "vnet-eastus2-01"
        networking_resource_group = "Terraform1"
        zone_to_vnet_link_exists  = false
        vnet_link_rg_name         = "Terraform1"
      }
    ]
    registration_enabled = false
  },
  zone2 = {
    dns_zone_name       = "privatelink.monitor.azure.com"
    resource_group_name = "Terraform1"
    tags = {
      iac    = "Terraform"
      syntax = "zone2"
    }
    zone_exists = false
    vnet_links = [
      {
        zone_to_vnet_link_name    = "monitor-vnet-eastus2-01"
        vnet_name                 = "vnet-eastus2-01"
        networking_resource_group = "Terraform1"
        zone_to_vnet_link_exists  = false
        vnet_link_rg_name         = "Terraform1"
      }
    ]
    registration_enabled = false
  }
}

你的代码似乎只有在我使用不同的资源组名称时才能正常工作。当您使用资源组名称的重复值时,这是您的要求,因此无法使用您的代码创建地图 "rgs_map",因为它会出现以下错误:

所以,为了解决上述错误,我使用了如下内容:

locals {
  rgs_map = {
    for i,n in var.private_dns_zones : "${i}" =>{
      name = n.resource_group_name
    }
  }
}

完整代码:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "2.83.0"
    }
  }
}

provider "azurerm" {
  features {}
}

variable "private_dns_zones" {
  type = map(object({
    dns_zone_name       = string
    resource_group_name = string
    tags                = map(string)
    vnet_links = list(object({
      zone_to_vnet_link_name    = string
      vnet_name                 = string
      networking_resource_group = string
      zone_to_vnet_link_exists  = bool
      vnet_link_rg_name         = string
    }))
    zone_exists          = bool
    registration_enabled = bool
  }))
  description = "Map containing Private DNS Zone Objects"
  default = {}
}

data "azurerm_resource_group" "this" {
  # read from local variable, index is resource_group_name
  for_each = local.rgs_map
  name     = each.value.name
}

locals {
  rgs_map = {
    for i,n in var.private_dns_zones : "${i}" =>{
      name = n.resource_group_name
    }
  }
}

output "rgs_map" {
  value = local.rgs_map
}

output "rg_data" {
  value = data.azurerm_resource_group.this
}

输出: