Terraform动态变量

3

我正在创建子网,作为一个单独的 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}" 
}

我希望能够将环境变量作为查找子网ID的一部分来传递,例如:
subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-${var.environment}"

然而,我知道变量插值不受支持。我尝试在第一个terraform模板中使用映射将它们全部导出到“subnet”,然后再从第二个模板中查找。但是由于无法在映射内输出变量,因此这种方法行不通。

我之前在CloudFormation中使用过这种设计模式,但是我对terraform的了解要少得多。我是否遗漏了一些明显的东西?


你试过不用${}包裹var.environment吗?不确定你能否实现你想要的,但是使用插值,你只需要一次 - 而且它已经在那个父级的"${}"中了。 - TJ Biddle
很遗憾,当我将其指定为 subnet_id = "${data.terraform_remote_state.env-shared.subnet-aza-var.environment}" 时,它并没有展开变量,而是尝试读取一个在 env-shared 资源中不存在的 subnet-aza-var.environment 属性。 - PhilH
1个回答

0
找到了一种使用数据源来完成这个任务的方法。
variable "environment" {
    description = "Environment name"
    default     = "dev"
}

module "sql-1-ec2" {
  source     = "../modules/ec2winserver_sql"
  ...
  subnet_id  = "${data.aws_subnet.subnet-aza.id}" 
}

data "aws_subnet" "subnet-aza" {
  filter {
    name   = "tag:Name"
    values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-aza"]
  }
}
data "aws_subnet" "subnet-azb" {
  filter {
    name   = "tag:Name"
    values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-azb"]
  }
}

虽然这样可以工作并满足我最初的需求,但我想通过将data块移动到模块内部来改进它,以减少重复。不过,这还在进行中...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接