Terraform - 如何获取在 for_each 块中创建的资源的引用

cri*_*iss 4 terraform terraform-provider-azure

我有下面的代码,在 for_each 块中创建 vnet:

provider "azurerm" {
  features {}
}

variable "vnets" {
  type = map(object({
    name          = string
    address_space = list(string)
  }))
  default = {
    "vnet1" = {
      "name"          = "vnet1",
      "address_space" = ["10.0.0.0/16"]
    },
    "vnet2" = {
      "name"          = "vnet2",
      "address_space" = ["10.1.0.0/16"]
    }
  }
}

resource "azurerm_resource_group" "vnets" {
  name     = "vnets"
  location = "WestEurope"
}

resource "azurerm_virtual_network" "virtual_network" {
  for_each = var.vnets
    name                =       each.value.name
    location            =       "West Europe"
    resource_group_name =       azurerm_resource_group.vnets.name
    address_space       =       each.value.address_space
}

Run Code Online (Sandbox Code Playgroud)

一切都按计划进行,将创建虚拟网络,但问题是如何从 for_each 块获取创建的资源?

当我键入命令返回资源列表时:

terraform state list
Run Code Online (Sandbox Code Playgroud)

然后我从控制台得到以下输出:

azurerm_resource_group.vnets
azurerm_virtual_network.virtual_network["vnet1"]
azurerm_virtual_network.virtual_network["vnet2"]
Run Code Online (Sandbox Code Playgroud)

当我想使用引用 azurerm_virtual_network.virtual_network["vnet1"] 在代码中的任何位置使用 vnet1 时,我会收到错误。

例如我想查看资源vnet1:

terraform state show azurerm_virtual_network.virtual_network["vnet1"]
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误:

Error parsing instance address: azurerm_virtual_network.virtual_network[vnet1]

This command requires that the address references one specific instance.
To view the available instances, use "terraform state list". Please modify
the address to reference a specific instance.
Run Code Online (Sandbox Code Playgroud)

我尝试了以下命令来访问资源,但它们不起作用:

terraform state show azurerm_virtual_network.virtual_network["vnet1"]
terraform state show 'azurerm_virtual_network.virtual_network["vnet1"]'
terraform state show azurerm_virtual_network.virtual_network[vnet1]
terraform state show azurerm_virtual_network.virtual_network[0]
terraform state show azurerm_virtual_network.virtual_network.vnet1
Run Code Online (Sandbox Code Playgroud)

你知道如何解决吗?

小智 8

另外,如果要在状态文件中显示特定实例,可以使用 terraform state show 'azurerm_virtual_network.virtual_network[\"vnet1\"]'

我在使用模块时遇到了同样的问题。上面引用的是正确答案,以下是如何使用模块执行它:

terraform state show 'module.module_name[\"module_instance\"].resource.resource_name[\"resource_instance\"]
Run Code Online (Sandbox Code Playgroud)

例子:

state show 'module.rsm_keyvault_solution_module_resource[\"development\"].azurerm_key_vault.keyvault_module_resource[\"rsm-playground-dev\"]'
Run Code Online (Sandbox Code Playgroud)