【问题标题】:Terraform - How to modify map keys?Terraform - 如何修改地图键?
【发布时间】:2020-08-05 07:59:32
【问题描述】:

在 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"
  }

本地函数应去除前缀 TASK_LOGGING_ 以构建用于 Fluentbit 配置的 JSON 对象。

最终结果应该是一个对象,类似于 terraform plan 中的 sn-p:

~ 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 = []
                    }
   

【问题讨论】:

    标签: terraform interpolation amazon-ecs


    【解决方案1】:

    不完全明白你想要达到什么目的,但你也可以使用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
          }   
    }
    

    这导致local.task_logging2 成为:

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

    【讨论】:

    • 我试过了。也许我忘了提,结果应该是一个对象。我将编辑我的问题。
    • @AlanKis 我更新了答案,现在给出了对象。
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 2018-12-27
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多