0

伙计们,

我正在尝试为 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 参数首先仅应用计数所依赖的资源。

有任何想法吗 ?

4

1 回答 1

0

在您data "aws_availability-zones" "azs"编写的块内depends_on = [aws_vpc.k3s_vpc],这意味着 Terraform 在创建 VPC 之前无法查找可用区,但在规划期间 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 范围直接分配给 AZ,如果出现新区域,则不会重新分配稍后在您的帐户中。

于 2021-06-02T02:12:49.410 回答