Terraform-如何修改地图键



在Terraform 0.12.xx中,是否可以修改映射中的键,而不是它们各自的值?让我们假设我们在模块定义中有以下内容:

locals {
task_logging = [
for k, v in var.task_logging_options : {
name = trimprefix(k,"TASK_LOGGING_")
value = v
}
]
}

但是,这里的trimprefix仅适用于值。

下面我为ECS服务创建一个任务定义:

{...}
"logConfiguration": {
"logDriver": "awsfirelens",
"secretOptions": [],
"options": ${jsonencode(local.task_logging_options)}
},
{...}

最后,在模块实例化中,我传递task_logging_options如下:

task_logging_options = {
TASK_LOGGING_Name = "es"
TASK_LOGGING_Host = "some.host"
}

Where本地函数应该去掉前缀TASK_LOGGING_,为Fluentbit配置构建一个JSON对象。

最终结果应该是一个对象,类似于地形图中的片段:

~ logConfiguration = {
logDriver     = "awsfirelens"
~ options       = {
- Buffer_Size       = "False" -> null
- HTTP_Passwd       = "READACTED" -> null
- HTTP_User         = "READACTED" -> null
- Host              = "READACTEDd" -> null
- Index             = "READACTED" -> null
- Name              = "es" -> null
- Port              = "READACTED" -> null
+ TASK_LOGGING_Host = "some.host"
+ TASK_LOGGING_Name = "es"
- Tls               = "On" -> null
- Trace_Output      = "On" -> null
}
secretOptions = []
}

不完全理解您想要实现什么,但您也可以使用trimprefix(k,"TASK_LOGGING_")作为密钥。

例如:


locals { 
task_logging2 = [
for k, v in var.task_logging_options : {
trimprefix(k,"TASK_LOGGING_") = v
}
]  
}

将导致local.task_logging2为:

[
{
"Host" = "some.host"
},
{
"Name" = "es"
},
]

更新

如果需要对象,可以使用以下内容:

locals {

task_logging2 = {
for k, v in var.task_logging_options : 
trimprefix(k,"TASK_LOGGING_") => v
}   
}

导致CCD_ 6为

{
"Host" = "some.host"
"Name" = "es"
}