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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:30:50