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

OCI环境下Terraform通过子网名获取subnet_id报无效索引错误如何解决

报错原因

你的oci_core_subnet.snet-workers是单实例资源,没有通过for_each批量创建,不属于可按key索引的集合类型,因此无法用[each.value.subnet_name]的方式索引获取指定子网的ID,这是报错的核心原因。
同时你原有的子网资源代码写死了只读取var.subnets["snet-workers"]的配置,只会生成一个子网,也无法匹配你节点池中snet-worker1、snet-worker2两个子网的使用需求。

解决方法

方案一:批量创建子网(推荐)

通过for_each遍历var.subnets变量批量生成所有子网,让子网资源变成可按名称索引的集合:

  1. 修改子网资源配置
resource "oci_core_subnet" "snet-workers" {
  # 新增for_each,遍历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. 补全tfvars中的subnets变量配置,和节点池的subnet_name取值对应:
subnets = {
  snet-worker1 = {
    subnet_cidr  = "替换为你实际的worker1子网网段,比如10.0.1.0/24"
    display_name = "snet-worker1"
    dns_label    = "snetworker1"
  }
  snet-worker2 = {
    subnet_cidr  = "替换为你实际的worker2子网网段,比如10.0.2.0/24"
    display_name = "snet-worker2"
    dns_label    = "snetworker2"
  }
}

修改完成后原有节点池中的subnet_id = oci_core_subnet.snet-workers[each.value.subnet_name].id逻辑即可正常运行。

方案二:手动构造子网映射(适合子网数量少、不需要批量创建的场景)

如果你不想批量创建子网,已经单独定义了每个子网的资源,可以通过本地值构造子网名称到ID的映射:

# 新增本地值映射
locals {
  subnet_id_map = {
    snet-worker1 = oci_core_subnet.snet-worker1.id # 替换为你实际的worker1子网资源名
    snet-worker2 = oci_core_subnet.snet-worker2.id # 替换为你实际的worker2子网资源名
  }
}

# 修改节点池中的subnet_id配置
subnet_id = local.subnet_id_map[each.value.subnet_name]

内容的提问来源于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 15:24:03