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变量批量生成所有子网,让子网资源变成可按名称索引的集合:
- 修改子网资源配置
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 }
- 补全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
相关产品推荐
相关产品推荐

