要获取当前的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}"
}
但它说我不能在变量中进行字符串插值。
答案 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_resource
或null_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]}"
但遗憾的是,这并不能使这些值容易暴露为中间变量。