如果 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 或
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
输出值来说是多余的。