You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform其他资源块中引用指定Azure子网的名称?

解决方案

方法一:通过for表达式筛选目标子网

可以用Terraform的for表达式从虚拟网络的子网列表中过滤出名称为subnet2的条目,这种方式不依赖子网的索引位置,避免因子网顺序变动导致引用错误:

resource "azurerm_application_gateway" "myagw" {
  # 补充应用网关其他必要配置
  mysubnet = one([for s in azurerm_virtual_network.example.subnet : s.name if s.name == "subnet2"])
}

其中one()函数用于确保筛选结果仅返回单个匹配项,避免返回列表类型。

方法二:单独定义子网资源(推荐)

更规范的做法是将子网从虚拟网络的嵌套块中抽离,单独创建azurerm_subnet资源,这样引用更直接清晰,也便于后续单独管理子网配置:

调整虚拟网络代码(移除嵌套subnet块)

resource "azurerm_virtual_network" "example" {
  name                = "example-network"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space       = ["10.0.0.0/16"]
  dns_servers         = ["10.0.0.4", "10.0.0.5"]

  tags = {
    environment = "Demo"
  }
}

单独创建子网资源

resource "azurerm_subnet" "subnet1" {
  name                 = "subnet1"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_subnet" "subnet2" {
  name                     = "subnet2"
  resource_group_name      = azurerm_resource_group.example.name
  virtual_network_name     = azurerm_virtual_network.example.name
  address_prefixes         = ["10.0.2.0/24"]
  network_security_group_id = azurerm_network_security_group.example.id
}

引用子网名称

在应用网关中直接引用即可:

resource "azurerm_application_gateway" "myagw" {
  # 补充应用网关其他必要配置
  mysubnet = azurerm_subnet.subnet2.name
}

注意:应用网关实际部署时通常需要子网ID(对应subnet_id参数)而非名称,若为测试引用名称可按上述方式,生产环境需使用正确参数。

内容的提问来源于stack exchange,提问作者Sreehari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:32:47