在 terraform 中启用/禁用资源而不使用 count

问题描述 投票:0回答:1
我正在尝试使用

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 的情况下解决这个问题?任何有关如何重构逻辑的建议都将受到赞赏。先谢谢你了

amazon-web-services terraform amazon-vpc
1个回答
1
投票
这里的问题不是你专门使用了

count

 ,而是关于要声明该模块的多少个实例的决定是基于 Terraform 在应用计划之前无法知道的结果,所以它无法为此资源制定可行的计划。对于动态决定声明多少实例的
any机制也是如此。

要实现此目的,您需要确保声明多少实例的决定仅基于在配置中直接声明的值,而不是基于需要首先对远程系统应用更改的任何内容。

在您的情况下,原因和结果之间存在一些间接关系,但根本问题似乎是

data aws_ssm_parameter" "vpc_type"

 本身的配置包含未知值,因此 Terraform 在应用阶段之前无法读取该数据源。 

您没有在示例中包含该块,所以我无法猜测为什么在规划期间不知道该值,但如果您确保在规划期间知道该

data

 块中的所有参数,那么Terraform 将能够在计划阶段读取该数据源,因此它将知道 
data.aws_ssm_parameter.vpc_type.value
 的值,并将其与 
"none"
 进行比较,从而决定有多少个实例
module "vpc"
 正在宣布。

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