错误:尝试为每个可用区创建子网时计数参数无效

问题描述 投票:0回答:1

我正在尝试为 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]
}

低于错误

错误:计数参数无效

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

有什么想法吗?

amazon-web-services terraform subnet availability-zone
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,而不会如果您的帐户稍后出现新区域,则会重新分配。

© www.soinside.com 2019 - 2024. All rights reserved.