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

Terraform使用for_each遍历map时如何获取索引分配AWS可用区

解决方法

Terraform中for_each遍历map时没有内置的数字索引(map本身属于无序结构),可通过以下方式获取当前遍历项的自增序号来匹配可用区:

核心逻辑

先获取var.mysubnets所有键的有序列表,再通过index()函数找到当前each.key在列表中的位置,即可得到从0开始的自增序号。推荐搭配element()函数访问可用区列表,避免索引越界报错(element会自动循环使用可用区,适配子网数量多于可用区的场景)。

修正后的代码

variable "mysubnets" {
  type = map(string)
  default = {
    "subnet1" = "10.1.0.0/24"
    "subnet2" = "10.1.1.0/24"
  }
}

data "aws_availability_zones" "azs" {
  state = "available"
}

resource "aws_subnet" "test-subnets" {
  for_each = var.mysubnets
  cidr_block = each.value
  vpc_id = aws_vpc.myvpc.id
  # 核心修改:计算当前子网的索引,匹配对应可用区
  availability_zone = element(data.aws_availability_zones.azs.names, index(keys(var.mysubnets), each.key))

  tags = {
    Name = each.key
  } 
}

补充说明

  • 如果需要严格要求子网和可用区一一对应、不允许循环复用可用区,可以替换为直接索引写法,子网数量多于可用区时会直接抛出错误:
    availability_zone = data.aws_availability_zones.azs.names[index(keys(var.mysubnets), each.key)]
    
  • keys()返回的列表默认按字符串字典序排序,如果需要自定义子网和可用区的对应顺序,可以提前给key按顺序命名(比如subnet-01、subnet-02),或者将变量改为list(object)类型实现更灵活的顺序控制。
  • Terraform 0.12+版本中不需要额外加${}包裹变量,直接写each.value、each.key即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:12:03