从内联定义中提取 Azure 子网 ID

问题描述 投票:0回答:1

如果 Azure 子网是作为 vnet 定义的一部分内联创建的,是否可以直接提取子网 ID?还是需要一些“按摩”?

我有以下内容:

module "vnet" {
  source  = "Azure/avm-res-network-virtualnetwork/azurerm"
  version = "0.7.1"

  address_space       = ["10.10.0.0/16"]
  location            = uksouth
  name                = vnet01
  resource_group_name = rg-temp

  subnets = {
    one = {
      name             = "subnet01"
      address_prefixes = ["10.10.1.0/24"]
    }

    two = {
      name             = "subnet02"
      address_prefixes = ["10.10.2.0/24"]
    }

  }
}

然后我尝试在第二个子网中创建专用端点

resource "azurerm_private_endpoint" "acr" {
  name                = "endpoint-acr01"
  location            = uksouth
  resource_group_name = rg-temp
  subnet_id           = module.vnet.subnets["subnet02"].id

  private_service_connection {
    name                           = "psconn-acr01"
    private_connection_resource_id = module.acr.acr_id.id
    is_manual_connection           = false
    subresource_names              = ["registry"]
  }
}

但这会引发错误:

module.vnet.subnets["subnet02"] is object with 4 attributes

This object does not have an attribute named "id".

这样可以直接获取子网id吗?或者我需要做一些“时髦”的事情来提取它?

terraform terraform-provider-azure subnet
1个回答
0
投票

您正在使用一个包装提供程序资源类型的模块,因此这实际上是一个关于该模块的问题,而不是关于 Terraform 或

hashicorp/azurerm
提供程序的问题。

在撰写本文时模块的

subnets
输出值定义如下:

output "subnets" {
  description = <<DESCRIPTION
Information about the subnets created in the module.

Please refer to the subnet module documentation for details of the outputs.
DESCRIPTION
  value       = module.subnet
}

...所以它实际上只是逐字传递嵌套模块调用产生的值。

该模块调用是,在撰写本文时,使用

./modules/subnet
调用
for_each
目录,因此我们至少可以得出结论,顶级
subnets
输出值是与与传入
subnets
输入变量相同的键:
subnet01
subnet02

该映射的元素也绝对是对象,因为模块调用总是生成一个对象。但这些对象具有哪些属性取决于嵌套模块的定义方式。

在撰写本文时,嵌套模块定义了以下输出值:

output "application_gateway_ip_configuration_resource_id" {
  description = "The application gateway ip configurations resource id."
  value       = try(azapi_resource.subnet.body.properties.applicationGatewayIPConfigurations.id, null)
}

output "name" {
  description = "The resource name of the subnet."
  value       = azapi_resource.subnet.name
}

output "resource" {
  description = "All attributes of the subnet"
  value       = azapi_resource.subnet
}

output "resource_id" {
  description = "The resource ID of the subnet."
  value       = azapi_resource.subnet.id
}

因此,这些是您可以使用此模块的当前版本在

module.vnet.subnets["subnet02"]
之后编写的唯一有效属性名称。

看起来

resource_id
保存了您想要的值——子网的 ID——所以您可以将其写为
module.vnet.subnets["subnet02"].resource_id

该模块还将表示子网的整个对象导出为

resource
属性,因此您可以访问作为
azapi_resource
结果记录的任何内容,作为该属性下的嵌套属性。例如,该资源类型的
id
属性导出为
module.vnet.subnets["subnet02"].resource.id
,尽管这对于我在上一段中提到的
resource_id
输出值来说是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.