我有一个使用AWS Systems Manager Parameters配置的Terraform项目。想象一个具有以下crypto_secretstream...
的Terraform项目:
variables.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"]
包含以下内容:
variables.tf
现在,只要我为SSM参数设置了正确的名称,我就可以在项目的任何地方使用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)}"
}
而不是${local.vpc_cidr_block}
。
只要我正在使用现有资源和现有状态文件,这将完全有效。也就是说,如果我使用第一个变量/ tfvars文件创建我的资源,然后切换到SSM数据源。但是,如果我从头开始使用SSM版本,则会从依赖于${var.vpc_cidr_block}
和value of 'count' cannot be computed
的资源中得到${length(local.subnet_config_private_subnets)}
错误。
我不知道为什么会发生这种情况,尤其是当值对现有资源运行${length(local.subnet_config_public_subnets)}
,refresh
或plan
不会造成任何麻烦时。
非常感谢提供有关如何深入研究的帮助和/或建议。