通过terraform中地图的地图在循环中获取键名



给定以下两个terraform变量:

variable "db_alarm_metrics" {
type = map(any)
description = "Database metrics to create alarms for"
default = {
"ReadIOPS" = {
"threshold" = "20",
"period" = "60000"
},
"WriteIOPS" = {
"threshold" = "20",
"period" = "60000"
}
}
}
variable "aggregation_db_primary_db_instance_id" {
type        = string
description = ""
default = "mysql-aggregation"
}

我想为它们两个循环遍历一种嵌套的for_each,所以我创建了下面的本地资源来创建两个组合的列表供我循环。

locals {
instance_metrics = flatten([
for instance_type in [ var.aggregation_db_primary_db_instance_id, "${var.aggregation_db_primary_db_instance_id}-replica" ] : [
for metric in var.db_alarm_metrics : {
instance_type = instance_type
metric = metric
}
]
])
}

terraform console中,如果我运行local.instance_metrics来测试它的输出,我得到

{
"instance_type" = "mysql-aggregation"
"metric" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation"
"metric" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation-replica"
"metric" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation-replica"
"metric" = {
"period" = "60000"
"threshold" = "20"
}
},

代替"metric"作为这些内部地图的关键,我想要从var.db_alarm_metrics的关键名称。预期的输出:

{
"instance_type" = "mysql-aggregation"
"ReadIOPS" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation"
"WriteIOPS" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation-replica"
"ReadIOPS" = {
"period" = "60000"
"threshold" = "20"
}
},
{
"instance_type" = "mysql-aggregation-replica"
"WriteIOPS" = {
"period" = "60000"
"threshold" = "20"
}
},

我做错了什么?蒂娅!

您可以通过稍微调整来实现这一点:

instance_metrics = flatten([
for instance_type in [var.aggregation_db_primary_db_instance_id, "${var.aggregation_db_primary_db_instance_id}-replica"] : [
for type, metric in var.db_alarm_metrics : {
instance_type = instance_type
"${type}"     = metric
}
]
])

注意,您可以引用度量类型,因为变量db_alarm_metrics也是一个映射。这会在terraform控制台中给出以下输出:

> local.instance_metrics
[
{
"ReadIOPS" = {
"period" = "60000"
"threshold" = "20"
}
"instance_type" = "mysql-aggregation"
},
{
"WriteIOPS" = {
"period" = "60000"
"threshold" = "20"
}
"instance_type" = "mysql-aggregation"
},
{
"ReadIOPS" = {
"period" = "60000"
"threshold" = "20"
}
"instance_type" = "mysql-aggregation-replica"
},
{
"WriteIOPS" = {
"period" = "60000"
"threshold" = "20"
}
"instance_type" = "mysql-aggregation-replica"
},
]

最新更新