是否可以使用terraform对变量进行别名变换?

时间:2016-09-25 13:55:59

标签: terraform

要获取当前的AWS ID:

data "aws_caller_identity" "current" { }

使其在data.aws_caller_identity.current.account_id中可用。有没有办法让它只用account_id?我试过了:

variable "account_id" {
  default = "${data.aws_caller_identity.current.account_id}"
}

但它说我不能在变量中进行字符串插值。

1 个答案:

答案 0 :(得分:4)

0.10.3以来,您可以使用locals来解决缺少变量插值的问题。

这允许您定义一个友好的"可能需要插值的各种事物的名称。

在您的情况下,您只需使用:

locals {
  account_id = "${data.aws_caller_identity.current.account_id}"
}

但是你可以组合任意数量的插值和函数:

variable "foo" {}
variable "bar" {}

locals {
  account_id = "${data.aws_caller_identity.current.account_id}"
  foo_BAR    = "${var.foo}_${upper(var.bar)}"
}

旧答案

正如Terraform在你的错误中指出的那样,你不能直接进行变量插值,尽管当你需要某种形式的变量插值时有known hacky workarounds

不幸的是,所有这些都涉及对模块,模板或null_resourcenull_data_source进行稍微复杂的使用,这样仍会让您以尴尬的方式访问变量。

可能更适合您的一个选项是将一堆数据源包装到这样的模块中:

data "aws_caller_identity" "current" {}
output "account_id" { value = "data.aws_caller_identity.current.account_id" }

data "aws_availability_zones" "zones" {}
output "zones" { value = "data.aws_availability_zones.zones.names }

然后像这样访问这些:

module "data_sources" {
    source = "path/to/data-sources-module.tf"
}

...
    account_id = "${module.data_sources.account_id}"
...
    availability_zone = "${module.data_sources.zones[0]}"

但遗憾的是,这并不能使这些值容易暴露为中间变量。