Azure Terraform:azurerm_network_interface的public_ip_address_id配置求助
问题分析与解决方法
你的代码核心问题在于public_ip_address_id字段赋值错误:当前写法返回的是一个map类型,但该字段需要的是单个公网IP的ID字符串,或者null,类型不匹配导致配置失败。
解决方案
要实现“前3个网络接口绑定公网IP,其余设为null”,可以通过以下步骤调整:
- 调整
for_each为带索引的映射:把var.interfaces转成包含索引的map,方便判断是否为前3个接口 - 用三元表达式直接赋值:根据索引判断,前3个接口绑定对应公网IP,其余设为null
修改后的完整代码示例:
resource "azurerm_network_interface" "virtual_network_interfaces" { # 将接口列表转为带索引的map,索引从0开始 for_each = { for idx, iface in var.interfaces : idx => iface } location = var.location resource_group_name = var.resource_group_name name = "${var.device_name}_${var.instance_type}_${var.site_name}_${each.value.name}_Interface" enable_ip_forwarding = true enable_accelerated_networking = true ip_configuration { name = "${var.device_name}_${var.instance_type}_${var.site_name}_${each.value.name}_IP_Config" private_ip_address = each.value.address_prefixes[0] private_ip_address_allocation = "Static" primary = each.value.name == "Management" ? true : false subnet_id = lookup( { for k, v in var.subnets : v.name => v.id }, each.value.name, null ) # 前3个接口(索引0、1、2)绑定对应公网IP,其余设为null # 假设var.public_ips是按顺序匹配的公网IP列表 public_ip_address_id = each.key < 3 ? var.public_ips[each.key].id : null } }
补充说明
- 如果你的
var.public_ips是按接口名称匹配的map,而非列表,可以修改public_ip_address_id的赋值逻辑:public_ip_address_id = each.key < 3 ? lookup( { for ip in var.public_ips : ip.name => ip.id }, # 替换为你的公网IP命名规则,确保能匹配对应接口 "${var.device_name}_${var.instance_type}_${var.site_name}_${each.value.name}_PublicIP", null ) : null - 原代码中的
try函数多余,lookup本身已经支持默认值null,可以直接移除
内容的提问来源于stack exchange,提问作者mtnbkr
相关产品推荐
相关产品推荐

