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
相关产品推荐
相关产品推荐

