更新
接受的答案描述了如何在现有地图中进行动态查找。对于使用动态键构建映射,在 HCL2 (0.12) 中,您可以在键中使用带引号的插值表达式:
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
ami = "${var.base_ami}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = {
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
"${var.app_role}" = "${var.env}" # <------ like this
}
}
一旦问题 #21566得到修复,您可以替换"${var.app_role}"
为(var.app_role)
,这是文档中描述的方法。
(以下同样的警告也适用于此处:如果var.app_role
包含这些文字键之一作为其值,则它将替换它。)
旧答案
接受的答案描述了如何在现有地图中进行动态查找。对于使用动态键构建映射,在 HCL2 (0.12) 中,您有两种方法:
您可以使用for 表达式从您的键的一个或多个变量动态构建映射,然后将其与merge
函数结合使用来构建具有静态和动态键组合的新映射:
variable "app_role" {
type = string
}
locals {
tags = merge(
{
Name = "${var.role} ${var.env}"
role = "${var.app_role}"
},
{
for k in [var.app_role]: k => "${var.env}"
}
)
}
或者,您可以使用zipmap
一次性构建它:
locals {
tags = zipmap(
[
"Name",
"role",
var.app_role
],
[
"${var.role} ${var.env}",
var.app_role,
var.env
]
)
}
然后,您可以在资源中使用此地图:
resource "aws_instance" "web" {
count = "${var.ec2_instance_count}"
ami = "${var.base_ami}"
availability_zone = "${var.region_a}"
instance_type = "${var.ec2_instance_size}"
security_groups = ["sec1"]
tags = local.tags // or inline the above here
}
一个警告是,如果var.app_role
等于"Name"
or "role"
,那么它将覆盖您的静态值。merge
您可以通过在 中交换参数或重新排序列表来避免这种情况zipmap
,尽管这种冲突更可能是配置错误,应该在应用之前捕获并修复。