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

如何用Terraform管控Azure容器环境创建时的额外网络资源?

问题描述

使用以下Terraform代码创建Azure容器应用环境(Container App Environment)及相关资源时,发现系统自动在随机命名的新资源组中创建了额外的网络资源(如负载均衡器、公共IP等):

##################### Resource Group #####################

resource "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
  location = var.location
  tags     = var.tags
}


##################### Workspace #####################

resource "azurerm_log_analytics_workspace" "law" {
  name                = var.workspace_name
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  sku                 = "PerGB2018"
  retention_in_days   = 90
  tags                = var.tags
}


##################### Network #####################

resource "azurerm_virtual_network" "network" {
  name                = var.virtual_network_name
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  address_space       = ["10.0.0.0/16"]
  tags                = var.tags

  depends_on = [
    azurerm_resource_group.rg
  ]
}


##################### Subnet #####################

resource "azurerm_subnet" "subnet" {
  name                 = var.subnet_name
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = var.virtual_network_name

  address_prefixes = ["10.0.0.0/23"]

  service_endpoints = ["Microsoft.AzureCosmosDB", "Microsoft.Storage"]

  depends_on = [
    azurerm_resource_group.rg,
    azurerm_virtual_network.network
  ]
}


##################### Container App Environment #####################

resource "azurerm_container_app_environment" "cae" {
  name                           = var.cae_name
  location                       = var.location
  resource_group_name            = var.resource_group_name
  log_analytics_workspace_id     = azurerm_log_analytics_workspace.law.id
  infrastructure_subnet_id       = azurerm_subnet.subnet.id
  internal_load_balancer_enabled = false
  tags                           = var.tags

  depends_on = [
    azurerm_resource_group.rg,
    azurerm_log_analytics_workspace.law,
    azurerm_subnet.subnet
  ]
}

需要解决的问题:

  • 如何管控这些自动新增的网络资源?
  • 能否自行通过Terraform创建这些资源,将其放入指定的同一资源组,并管控名称、标签等属性?
解决方案

Azure容器应用环境在使用自定义子网时,默认会自动创建托管网络资源并放入系统生成的随机资源组。要实现完全管控,需采用自定义网络模式,手动创建所需网络资源并关联到容器应用环境。

1. 手动创建所需网络资源

提前在指定资源组内创建以下资源,可自定义名称、标签等属性:

# 公共IP地址(容器应用环境入口流量用)
resource "azurerm_public_ip" "cae_pip" {
  name                = "cae-public-ip"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  allocation_method   = "Static"
  sku                 = "Standard"
  tags                = var.tags
}

# 标准负载均衡器
resource "azurerm_lb" "cae_lb" {
  name                = "cae-lb"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  sku                 = "Standard"
  tags                = var.tags

  frontend_ip_configuration {
    name                 = "frontend-ip"
    public_ip_address_id = azurerm_public_ip.cae_pip.id
  }
}

# NAT网关(容器应用出站流量用)
resource "azurerm_nat_gateway" "cae_nat" {
  name                = "cae-nat-gateway"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  sku_name            = "Standard"
  tags                = var.tags
}

# 路由表(关联子网,指向NAT网关)
resource "azurerm_route_table" "cae_route" {
  name                = "cae-route-table"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  tags                = var.tags

  route {
    name                   = "default-nat"
    address_prefix         = "0.0.0.0/0"
    next_hop_type          = "NatGateway"
    next_hop_in_ip_address = azurerm_nat_gateway.cae_nat.id
  }
}

# 更新子网,关联路由表
resource "azurerm_subnet" "subnet" {
  name                 = var.subnet_name
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = var.virtual_network_name
  address_prefixes     = ["10.0.0.0/23"]
  service_endpoints    = ["Microsoft.AzureCosmosDB", "Microsoft.Storage"]
  route_table_id       = azurerm_route_table.cae_route.id
  tags                 = var.tags
}

2. 修改容器应用环境配置,关联自定义资源

在azurerm_container_app_environment中添加参数,指定手动创建的网络资源:

resource "azurerm_container_app_environment" "cae" {
  name                           = var.cae_name
  location                       = var.location
  resource_group_name            = var.resource_group_name
  log_analytics_workspace_id     = azurerm_log_analytics_workspace.law.id
  infrastructure_subnet_id       = azurerm_subnet.subnet.id
  internal_load_balancer_enabled = false
  tags                           = var.tags

  # 关联自定义网络资源
  load_balancer_id       = azurerm_lb.cae_lb.id
  public_ip_address_id   = azurerm_public_ip.cae_pip.id
  nat_gateway_id         = azurerm_nat_gateway.cae_nat.id

  depends_on = [
    azurerm_resource_group.rg,
    azurerm_log_analytics_workspace.law,
    azurerm_subnet.subnet,
    azurerm_lb.cae_lb,
    azurerm_public_ip.cae_pip,
    azurerm_nat_gateway.cae_nat
  ]
}

3. 关键注意事项

  • 配置完成后,Azure不会再自动创建随机资源组和托管网络资源,所有资源均由Terraform管控。
  • 确保所有网络资源的SKU与容器应用环境要求匹配(如均为Standard级)。
  • 子网需满足容器应用环境的最低要求:地址空间至少/23,且未被其他资源占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:48:13