我正在尝试为 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 参数首先仅应用 计数所依赖的资源。
有什么想法吗?
在您的
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,而不会如果您的帐户稍后出现新区域,则会重新分配。