在 for_each 中访问映射的索引

CEa*_*onn 2 amazon-web-services terraform terraform-provider-aws

我有一张像这样的地图

variable "mysubnets" {
  type = map(string)
  default = {
    "subnet1" = "10.1.0.0/24"
    "subnet2" = "10.1.1.0/24"
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的模块中,我尝试将子网放置在同一 vpc 的不同可用区中

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 = data.aws_availability_zones.azs.names[index("${each.value}")]

  tags = {
    Name = "${each.key}"
  } 
}
Run Code Online (Sandbox Code Playgroud)

我可以从地图中获取键和值,没有问题,但是当尝试选择可用区域时,我找不到如何更改值。有没有办法获取地图的索引,或者为递增的数字创建一个计数器?

Mar*_*cin 5

你的数据源被称为azs,而不是available。所以应该是:

availability_zone = data.aws_availability_zones.azs.names[index("${each.value}")]
Run Code Online (Sandbox Code Playgroud)

更新:

index与您一起使用var.mysubnets,您可以执行以下操作:

resource "aws_subnet" "test-subnets" {

  for_each = {for idx, subnet in keys(var.mysubnets): 
                  idx => { 
                      name = subnet
                      cidr = var.mysubnets[subnet]
                  }
             }
             
  cidr_block = each.value.cidr
  vpc_id = aws_vpc.myvpc.id
  
  availability_zone = element(data.aws_availability_zones.azs.names, each.key)

  tags = {
    Name = each.value.name
  } 
}
Run Code Online (Sandbox Code Playgroud)