地形动态变量

地形动态变量

我正在创建子网作为单独的 Terraform 模板的一部分,并按如下方式导出 ID。

output "subnet-aza-dev" {
  value = "${aws_subnet.subnet-aza-dev.id}"
}
output "subnet-azb-dev" {
  value = "${aws_subnet.subnet-azb-dev.id}"
}
output "subnet-aza-test" {
  value = "${aws_subnet.subnet-aza-test.id}"
}
output "subnet-azb-test" {
  value = "${aws_subnet.subnet-azb-test.id}"
}
...

然后,我打算在另一个模板中查找这些 ID,该模板可重复使用以配置多个环境。下面的示例显示我的第二个模板正在调用一个模块来配置 EC2 实例,并传递 subnet_id。

variable "environment" {
    description = "Environment name"
    default     = "dev"
}

module "sql-1-ec2" {
  source     = "../modules/ec2winserver_sql"
  ...
  subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-dev}" 
}

我想要做的是将环境变量作为 subnet_id 查找的一部分传递,例如

subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-${var.environment}"

但是我知道不支持变量插值。我尝试使用第一个地形模板内的地图将它们全部导出到“子网”,然后我可以使用它从第二个模板中查找。这没有用,因为我无法输出地图内的变量。

这种设计模式是我以前在 CloudFormation 中使用过的,但我对 Terraform 还不太熟悉。我是否忽略了某些显而易见的东西?

答案1

我认为输出图是正确的方法。我不确定你尝试时出了什么问题,但可以尝试以下方法:

output "subnets_map" {
  dev = "${aws_subnet.subnet_aza_dev.id}"
  test = "${aws_subnet.subnet_aza_test.id}"
}

然后

subnet_id = "${data.terraform_remote_state.env_shared.subnets_map[var.environment]}"

顺便说一句,我认为在 HCL 中最好使用下划线而不是连字符

相关内容