首页 > 解决方案 > 在单个 terraform 资源中具有受控循环

问题描述

我正在尝试根据用户输入创建子网,比如说 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}"
    }
}

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

无论如何,我可以在哪里创建 4 个子网来控制子网availability_zone,从而使子网跨越所有可用区域?

标签: amazon-web-servicesterraformnested-loopsterraform-provider-aws

解决方案


您可以使用模运算符( %):

  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 对此问题的评论。


推荐阅读