在单个 terraform 资源中控制循环

Have controlled loops in a single terraform resource

我正在尝试根据用户输入创建子网,比方说 4(var.number_of_private_subnets)。我希望它们位于不同的可用区 (Az) 中。我观察到 Terraform 有时会使用所有可用的 Az,有时则不会。所以出于这个原因,我不想把它留给 terraform 来选择 AZ

data aws_availability_zones "azs"{
  state = "available"

}
resource "aws_subnet" "private_subnet" {
  count                = var.number_of_private_subnets
  cidr_block           = cidrsubnet(aws_vpc.main_vpc.cidr_block,8, count.index )
  vpc_id               = aws_vpc.main_vpc.id
  availability_zone    = data.aws_availability_zones.azs.names[count.index]


    tags   = {
      Name = "${var.env_name}-PrivateSubnet-${count.index+1}"
    }
}

如果特定 aws_region 的可用 az 为 3,此代码将失败,它将尝试访问列表中的第 4 个元素,因为用户输入为 4。

我是否可以创建 4 个子网来控制 availability_zone,使子网跨越所有可用区域?

您可以使用 modulo operator (%):

  availability_zone    = data.aws_availability_zones.azs.names[count.index % 3]

或更好,

  availability_zone    = data.aws_availability_zones.azs.names[count.index % len(data.aws_availability_zones.azs.names)]

此外,对于直接跳到答案的任何人,请务必阅读 Martin Atkins 对该问题的评论。