Terraform中不为所有子网关联路由表的报错解决咨询
解决Terraform子网无需全部关联路由表的问题
当使用Terraform批量创建虚拟网络及子网时,若部分子网无需关联路由表(如示例中的subnet2),直接省略route_table配置会触发azurerm_subnet_route_table_association资源的必填参数错误,报错信息如下:
│ Missing required argument │ │ with module.virtual_network["test-vnet"].azurerm_subnet_route_table_association.route-link-subnet["subnet2"], │ on modules\virtualNetwork\main.tf line 30, in resource "azurerm_subnet_route_table_association" "route-link-subnet": │ 30: route_table_id = each.value.route_table │ │ The argument "route_table_id" is required, but no definition was found.
现有配置信息
变量定义
variable "networks" { type = map(object({ resource_group_name = string location = string addressSpace = list(string) dnsServers = optional(list(string)) subnets = map(object({ addressPrefix = string privateEndpointNetworkPolicies = optional(bool) privateLinkServiceNetworkPolicies = optional(bool) service_endpoints = optional(list(string)) route_table = optional(string) })) })) }
配置示例
networks = { test-vnet = { resource_group_name = "testrg" location = "eastus" addressSpace = ["10.229.192.0/20"] dnsServers = ["10.231.18.4"] subnets = { subnet1 = { addressPrefix = "10.229.199.0/24" networkSecurityGroups = { subnet1-nsg = { security_rules = [] } } route_table = "/subscriptions//resourceGroups/test-rg/providers/Microsoft.Network/routeTables/test-rt" } subnet2 = { addressPrefix = "10.229.198.0/24" privateEndpointNetworkPolicies = true privateLinkServiceNetworkPolicies = true service_endpoints = [ "Microsoft.Storage" ] networkSecurityGroups = { subnet2-nsg = { security_rules = [] } } } } } }
资源配置(原错误版本)
resource "azurerm_subnet_route_table_association" "route-link-subnet" { for_each = var.subnets subnet_id = module.subnets[each.key].subnet_id route_table_id = each.value.route_table depends_on = [ module.subnets, azurerm_virtual_network.Virtual_Network ] }
解决方案
核心思路是只对存在route_table配置的子网创建路由表关联资源,通过修改for_each的迭代范围,过滤掉未配置route_table的子网:
修改后的azurerm_subnet_route_table_association资源配置如下:
resource "azurerm_subnet_route_table_association" "route-link-subnet" { # 仅迭代包含route_table配置的子网 for_each = { for k, v in var.subnets : k => v if v.route_table != null } subnet_id = module.subnets[each.key].subnet_id route_table_id = each.value.route_table depends_on = [ module.subnets, azurerm_virtual_network.Virtual_Network ] }
这样配置后,Terraform只会为指定了route_table的子网(如subnet1)创建路由表关联资源,未指定的子网(如subnet2)会跳过该资源的创建,避免必填参数错误。
内容的提问来源于stack exchange,提问作者Mr.cool
相关产品推荐
相关产品推荐

