Terraform,获取数据源长度的计数

问题描述

各位,

我正在尝试为每个 AWS 区域中可用的 aws 可用区创建一个子网。

data "aws_availability_zones" "azs" {
  depends_on = [aws_vpc.k3s_vpc]
  state = "available"
}

locals {
  azs= "${data.aws_availability_zones.azs.names}"
}

resource "aws_subnet" "private_subnets" {
  count             = length(data.aws_availability_zones.azs.names)
  vpc_id            = aws_vpc.k3s_vpc.id
  cidr_block        = var.private_subnets_cidr[count.index]
  availability_zone       = local.azs[count.index]
}

低于错误

错误:计数参数无效

“计数”值取决于无法确定的资源属性 直到应用,因​​此 terraform 无法预测将创建多少个实例。 要解决此问题,请使用 -target 参数首先仅应用 计数所依赖的资源。

有什么想法吗?

解决方法

在您的 data "aws_availability-zones" "azs" 块中您写了 depends_on = [aws_vpc.k3s_vpc],这意味着在 VPC 已经创建之前,Terraform 无法查找可用区,但在规划期间 VPC 尚不存在所以你会看到这个错误。

您帐户的特定区域的可用区不会因 VPC 的创建而异,因此我不清楚您为何包含该依赖项。如果您删除它,Terraform 应该会看到它能够在规划阶段解析该数据源,从而确定要创建多少个子网。

但是,我仍然建议谨慎使用这种方法:如果该查找的结果将来会以在列表末尾以外的任何地方引入可用区的方式发生变化,那么您现有的子网将被重新分配给新的可用区,因此提供商将计划更换它们。相反,最好使用可用区名称本身作为子网的标识符,这样它们在结果列表中的出现顺序就无关紧要:

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

locals {
  azs = toset(data.aws_availability_zones.azs.names)
}

resource "aws_subnet" "private_subnets" {
  for_each = local.azs

  vpc_id            = aws_vpc.k3s_vpc.id
  cidr_block        = var.private_subnets_cidr[each.value]
  availability_zone = each.value
}

请注意,在这种方法下,您还需要将 variable "public_subnets_cidr" 更改为映射而不是列表,以可用区域名称作为键,以便 CIDR 范围也是 直接分配给可用区,如果您的帐户稍后出现新区域,则不会重新分配。