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

如何在Terraform中通过子网名称获取对应ID以配置OCI节点池

实现方案

你当前写法的核心问题是无法直接用each.value["subnet_name"]作为资源索引名匹配子网资源,可按以下两种场景选择实现方式:

场景1:子网资源在当前Terraform代码中直接管理

  1. 先调整子网资源为批量创建模式,用子网配置作为for_each索引:
resource "oci_core_subnet" "worker_subnets" {
  for_each                   = var.subnets
  cidr_block                 = each.value.subnet_cidr
  compartment_id             = var.compartment_id
  vcn_id                     = oci_core_virtual_network.base_vcn.id
  display_name               = each.value.display_name
  dns_label                  = each.value.dns_label
  prohibit_public_ip_on_vnic = true
  security_list_ids          = [oci_core_security_list.private_worker_nodes.id]
  route_table_id             = oci_core_route_table.rt-nat.id
}
  1. 新增本地变量构造子网名称到资源对象的映射:
locals {
  # key为子网display_name,value为对应子网资源对象
  subnet_map = { for subnet in oci_core_subnet.worker_subnets : subnet.display_name => subnet }
}
  1. 修改node_pool资源中subnet_id的取值逻辑:
placement_configs {
  availability_domain = var.availability_domain
  subnet_id           = local.subnet_map[each.value.subnet_name].id
}

如果要避免子网名称不存在时报错,可配合try函数做兜底:

subnet_id = try(local.subnet_map[each.value.subnet_name].id, var.default_subnet_id)

场景2:子网为OCI上已有的存量资源,不在当前代码中管理

用数据源批量拉取符合条件的子网,再构造映射即可:

  1. 定义子网数据源,拉取所有用到的worker子网:
data "oci_core_subnets" "target_workers" {
  compartment_id = var.compartment_id
  vcn_id         = oci_core_virtual_network.base_vcn.id
  
  # 过滤只拉取nodepools中用到的子网
  filter {
    name   = "display_name"
    values = distinct([for np in var.nodepools : np.subnet_name])
  }
}
  1. 构造本地映射:
locals {
  subnet_map = { for subnet in data.oci_core_subnets.target_workers.subnets : subnet.display_name => subnet }
}
  1. 后续subnet_id的取值逻辑和场景1完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:54:05