count
有条件地创建 VPC 模块,但是当我使用 count 时,terraform 失败并显示
The Count value depends on resource attributes that cannot be determined until apply, but resource attributes are already applied.
背景:我想根据用户输入有条件地创建一个 VPC,如果用户传递 CIDR 块,vpc 模块就会使用它,否则它必须从 IPAM 获取下一个可用的 CIDR。我有以下代码
data "aws_vpc_ipam_pool" "ipv4_ipam_pool" {
filter {
name = "tag:Name"
values = [var.ipam_pool_name[data.aws_region.current.name]]
}
}
# Preview next CIDR from pool if
resource "aws_vpc_ipam_preview_next_cidr" "previewed_cidr" {
count = data.aws_ssm_parameter.vpc_type.value =="existing" ? 0 : 1 # If the vpc_type value in SSM is existing it won't create the IPAM CIDR
ipam_pool_id = data.aws_vpc_ipam_pool.ipv4_ipam_pool.id
netmask_length = var.vpc_mask_length[data.aws_ssm_parameter.vpc_size.value]
}
locals {
partition = cidrsubnets(aws_vpc_ipam_preview_next_cidr.previewed_cidr[0].cidr, 1, 1)
private_subnets = cidrsubnets(local.partition[0], 2, 2, 2)
disconnected_vpc_cidr = "10.150.0.0/22"
disconnected_vpc_private_subnets = ["10.150.0.0/25","10.150.0.128/25","10.150.1.0/25"]
}
module "vpc" {
count = data.aws_ssm_parameter.vpc_type.value == "none" ? 0 : 1
source = "terraform-aws-modules/vpc/aws"
version = "3.19.0"
name = "${data.aws_ssm_parameter.account_alias.value}-vpc"
cidr = data.aws_ssm_parameter.vpc_type.value == "existing" ?local.disconnected_vpc_cidr : aws_vpc_ipam_preview_next_cidr.previewed_cidr[count.index].cidr # Fetch CIDR value from locals or IPAM based on the SSM param value
azs = formatlist("${data.aws_region.current.name}%s", ["a", "b", "c"])
private_subnets = data.aws_ssm_parameter.vpc_type.value == "disconnected" ? local.disconnected_vpc_private_subnets : local.private_subnets
enable_nat_gateway = false
enable_vpn_gateway = false
enable_dns_hostnames = true
tags = merge({ environment = data.aws_ssm_parameter.environment.value })
}
terraform 中是否有任何选项可以帮助我在不使用 usinf count 的情况下解决这个问题?任何有关如何重构逻辑的建议都将受到赞赏。先谢谢你了
count
,而是关于要声明该模块的多少个实例的决定是基于 Terraform 在应用计划之前无法知道的结果,所以它无法为此资源制定可行的计划。对于动态决定声明多少实例的any机制也是如此。 要实现此目的,您需要确保声明多少实例的决定仅基于在配置中直接声明的值,而不是基于需要首先对远程系统应用更改的任何内容。
在您的情况下,原因和结果之间存在一些间接关系,但根本问题似乎是
data aws_ssm_parameter" "vpc_type"
本身的配置包含未知值,因此 Terraform 在应用阶段之前无法读取该数据源。您没有在示例中包含该块,所以我无法猜测为什么在规划期间不知道该值,但如果您确保在规划期间知道该
data
块中的所有参数,那么Terraform 将能够在计划阶段读取该数据源,因此它将知道
data.aws_ssm_parameter.vpc_type.value
的值,并将其与
"none"
进行比较,从而决定有多少个实例
module "vpc"
正在宣布。