Terraform &引用;无法计算计数的值";当它依赖于AWS SSM参数数据源时

Terraform &引用;无法计算计数的值";当它依赖于AWS SSM参数数据源时,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个Terraform项目,我一直在使用它进行配置。设想一个具有以下变量的地形项目。tf: variable "stack_name" { type = "string" default = "stack" } variable "vpc_cidr_block" { type = "string" } variable "subnet_config_public_subnets" { type = "list" } variable "subnet_config_

我有一个Terraform项目,我一直在使用它进行配置。设想一个具有以下
变量的地形项目。tf

variable "stack_name" {
  type    = "string"
  default = "stack"
}

variable "vpc_cidr_block" {
  type = "string"
}

variable "subnet_config_public_subnets" {
  type = "list"
}

variable "subnet_config_private_subnets" {
  type = "list"
}
terraform.tfvars
可能如下所示:

vpc_cidr_block                = "10.1.0.0/16"
subnet_config_public_subnets  = ["10.1.2.0/24", "10.1.4.0/24", "10.1.6.0/24"]
subnet_config_private_subnets = ["10.1.1.0/24", "10.1.3.0/24", "10.1.5.0/24"]
相反,想象
变量。tf
包含以下内容:

variable "stack_name" {
  type    = "string"
  default = "stack"
}

data "aws_ssm_parameter" "vpc_cidr_block" {
  name = "/terraform/${var.stack_name}/vpc_cidr_block"
}

data "aws_ssm_parameter" "subnet_config_public_subnets" {
  name = "/terraform/${var.stack_name}/subnet_config_public_subnets"
}

data "aws_ssm_parameter" "subnet_config_private_subnets" {
  name = "/terraform/${var.stack_name}/subnet_config_private_subnets"
}

locals {
  vpc_cidr_block                = "${data.aws_ssm_parameter.vpc_cidr_block.value}"
  subnet_config_public_subnets  = "${split(",", data.aws_ssm_parameter.subnet_config_public_subnets.value)}"
  subnet_config_private_subnets = "${split(",", data.aws_ssm_parameter.subnet_config_private_subnets.value)}"
}
现在,只要我用正确的名称设置了SSM参数,我就可以在项目中的任何地方使用
${local.vpc\u cidr\u block}
而不是
${var.vpc\u cidr\u block}

只要我使用现有的资源和现有的状态文件,这就可以完美地工作。也就是说,如果我使用第一个变量/tfvars文件创建资源,然后切换到SSM数据源。但是如果我从零开始使用SSM版本,我会从依赖于
${length(local.subnet\u config\u private\u subnets)}
${length(local.subnet\u config\u public\u subnets)}的资源中得到一个
无法计算的'count'值

我不明白为什么会发生这种情况,尤其是当这些值不会对现有资源运行
刷新
计划
应用
造成任何问题时


如果您能提供帮助和/或建议,帮助我们弄清问题的真相,我们将不胜感激。

您是否也在Terraform中管理SSM参数?或者您是手动配置这些,然后使用数据查找?我个人一直使用输入变量来处理像CIDR块这样的事情,所以你不会遇到鸡和蛋的情况。您可以查看“dependens_on”标志:-但我认为这只是指资源,在您的情况下可能没有帮助。我不是在terraform中管理SSM参数。作为Terraform配置过程的一部分,它们是由不同的脚本创建的。请尝试包装split()函数:[“${split(“,”,var.CSV_STRING)}”]。文档中说,在某些情况下,您需要进行包装以列出一个列表。