OCI中用Terraform创建带Reserved IP的NLB无响应问题排查
问题排查原因
核心问题:预留公网IP未绑定到NLB所在子网
你的Terraform代码中,oci_core_public_ip资源未指定subnet_id参数。OCI的预留公网IP如果要关联到Network Load Balancer,必须与NLB处于同一个子网——因为NLB是子网级别的资源,预留IP需要绑定到该子网才能被NLB使用。
当你创建预留IP时不指定subnet_id,OCI会默认将其分配到租户的默认子网(或随机子网),这大概率和NLB所在子网不一致,导致绑定后NLB无法正常关联该IP,进而无响应。
其他可能的排查点
- 预留IP状态检查:确认预留IP的生命周期状态为
AVAILABLE,且未被其他资源(如计算实例、其他负载均衡器)占用。 - 显式依赖关系配置:虽然Terraform的for_each可能隐含依赖,但可以在NLB资源中添加
depends_on = [oci_core_public_ip.ip[each.value.subnet]],确保预留IP完全创建完成后再部署NLB。 - 安全规则验证:虽然临时IP正常,但可以额外确认预留IP的入站/出站流量是否被NLB子网的安全列表、网络安全组(NSG)允许(不过临时IP和预留IP同属公网IP,规则应该通用,但可排除特殊配置)。
修复代码示例
修改oci_core_public_ip资源,添加subnet_id参数,确保和NLB在同一子网:
resource "oci_core_public_ip" "ip" { for_each = { for lb in var.load_balancers: lb.subnet => lb if ! lb.private } compartment_id = local.compartment_ocid display_name = "${var.name}-public-ip" lifetime = "RESERVED" subnet_id = oci_core_subnet.s[each.value.subnet].id # 新增:绑定到NLB所在子网 lifecycle { prevent_destroy = true } } resource "oci_network_load_balancer_network_load_balancer" "nlb" { for_each = { for lb in var.load_balancers: lb.subnet => lb if lb.type == "network" } compartment_id = local.compartment_ocid display_name = "${var.name}-network-load-balancer" subnet_id = oci_core_subnet.s[each.value.subnet].id is_private = each.value.private reserved_ips { id = oci_core_public_ip.ip[each.value.subnet].id } depends_on = [oci_core_public_ip.ip[each.value.subnet]] # 可选:显式依赖 }
内容的提问来源于stack exchange,提问作者starfry
相关产品推荐
相关产品推荐

