AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79590965
Accepted
Brian G
Brian G
Asked: 2025-04-24 23:18:10 +0800 CST2025-04-24 23:18:10 +0800 CST 2025-04-24 23:18:10 +0800 CST

Com Terraform como converter mapa de strings em mapa de objetos

  • 772

Tenho um Terraform variables.tf na raiz do módulo com conteúdo semelhante a este:

variable "parameters" {
  description = "Parameter Store key/values"
  type = map(string)
  default = {
    "/customer1/prod/keycloak/password" = "password123"
    "/customer1/prod/keycloak/realm" = "default"
    "/customer1/prod/keycloak/url" = "https://customer1-sso.app.something.cloud/auth"
    "/customer1/prod/keycloak/userid" = "f:48c1ce1f:monitoring"
    "/customer1/uat/keycloak/password" = "password123"
    "/customer1/uat/keycloak/realm" = "uat"
    "/customer1/uat/keycloak/url" = "https://customer1-sso.npr.app.something.cloud/auth"
    "/customer1/uat/keycloak/userid" = "f:d48d4452:monitoring"
    "/customer1/uat2/keycloak/password" = "password123"
    "/customer1/uat2/keycloak/realm" = "uat2"
    "/customer1/uat2/keycloak/url" = "https://customer1-sso.npr.app.something.cloud/auth"
    "/customer1/uat2/keycloak/userid" = "f:5fe762fd:monitoring"
    "/customer2/prod/keycloak/password" = "password123"
    "/customer2/prod/keycloak/realm" = "default"
    "/customer2/prod/keycloak/url" = "https://customer2-sso.app.something.cloud/auth"
    "/customer2/prod/keycloak/userid" = "f:a053a488:monitoring"
    "/customer2/uat/keycloak/password" = "password123"
    "/customer2/uat/keycloak/realm" = "uat"
    "/customer2/uat/keycloak/url" = "https://customer2-sso.npr.app.something.cloud/auth"
    "/customer2/uat/keycloak/userid" = "f:225118c6:monitoring"
    "/customer2/uat2/keycloak/password" = "password123"
    "/customer2/uat2/keycloak/realm" = "uat2"
    "/customer2/uat2/keycloak/url" = "https://customer2-sso.npr.app.something.cloud/auth"
    "/customer2/uat2/keycloak/userid" = "f:9d8b2d30:monitoring
 }
}

Gostaria de convertê-lo em um mapa de objetos parecido com este:

{
  "customer1_prod" = {
    customer = "customer1"
    password = "password123"
    realm    = "default"
    url      = "https://customer1-sso.app.something.cloud/auth"
    userid   = "f:48c1ce1f:monitoring"
  }
  ...
}

Eu tentei isso no código do módulo raiz (main.tf):

# Transform flat map of strings into a grouped map of customer-env -> { password, realm, url, userid }
locals {
  # Step 1: Flatten parameters to tuples of [group_key, key_in_object, value]
  parameter_tuples = [
    for full_key, value in var.parameters : {
      group_key = join("_", slice(split("/", full_key), 1, 3))     # e.g. customer1_prod
      key       = split("/", full_key)[3]                          # e.g. password
      value     = value
    }
  ]

  # Step 2: Group by environment and assemble objects with customer field
  customers = {
    for group_key in distinct([for p in local.parameter_tuples : p.group_key]) :
    group_key => merge(
      {
        customer = split("_", group_key)[0]
      },
      merge([
        for p in local.parameter_tuples : {
          for inner in [p] :
          inner.key => inner.value
        } if p.group_key == group_key
      ]...)
    )
  }
}

output "all_customers" {
  value = local.customers
}

module "dd_synthetic_browser" {
  source = "./modules/dd_synthetic_browser"
  customers = local.customers
}

Entretanto, a saída mostra isto:

+ all_customers             = {
      + customer1_prod = {
          + customer = "customer1"
          + keycloak = "f:48c1ce1f:monitoring"
        }
    ...
    ...

Como corrigir este mapa incorreto de objetos? Há dois erros:

  1. Deveria haver cinco itens no objeto (cliente, senha, domínio, url e id do usuário) e há apenas dois.
  2. o keycloak = "f:48c1ce1f:monitoring"item deve seruserid = "f:48c1ce1f:monitoring"

Além disso, estou aberto a sugestões de um código Terraform melhor para executar essa conversão, porque acho que meu código é muito complicado para essa tarefa e provavelmente poderia ser realizado de forma mais simples, com menos linhas de código.

terraform
  • 1 1 respostas
  • 45 Views

1 respostas

  • Voted
  1. Best Answer
    AD7six
    2025-04-25T03:43:46+08:002025-04-25T03:43:46+08:00

    Há um erro de um

    Vamos reduzir o volume de entradas ao mínimo para investigar:

    variable "parameters" {
      description = "Parameter Store key/values"
      type = map(string)
      default = {
        "/customer1/prod/keycloak/password" = "password123"
        "/customer1/prod/keycloak/realm" = "default"
        "/customer1/prod/keycloak/url" = "https://customer1-sso.app.something.cloud/auth"
        "/customer1/prod/keycloak/userid" = "f:48c1ce1f:monitoring"
     }
    }
    

    E observe a variável intermediária parameter_tuples:

    locals {
      parameter_tuples = [
        for full_key, value in var.parameters : {
          group_key = join("_", slice(split("/", full_key), 1, 3))     # e.g. customer1_prod
          key       = split("/", full_key)[3]                          # e.g. password
          value     = value
        }
      ]
    }
    
    output "parameter_tuples" {
      value = local.parameter_tuples
    }
    

    Temos o seguinte:

    $ terraform plan
    
    Changes to Outputs:
      + parameter_tuples = [
          + {
              + group_key = "customer1_prod"
              + key       = "keycloak"
              + value     = "password123"
            },
          + {
              + group_key = "customer1_prod"
              + key       = "keycloak"
              + value     = "default"
            },
          + {
              + group_key = "customer1_prod"
              + key       = "keycloak"
              + value     = "https://customer1-sso.app.something.cloud/auth"
            },
          + {
              + group_key = "customer1_prod"
              + key       = "keycloak"
              + value     = "f:48c1ce1f:monitoring"
            },
        ]
    

    A chave é 'keycloak' para todas as tuplas porque split("/", full_key), passado uma string como /customer1/prod/keycloak/realm, retornará dados do formato:

    [
        "",
        "customer1",
        "prod",
        "keycloak", # <- 3
        "realm",
    ]
    

    Consertado

    Então, apenas aumentando esse índice:

    locals {
      parameter_tuples = [
        for full_key, value in var.parameters : {
          group_key = join("_", slice(split("/", full_key), 1, 3))     # e.g. customer1_prod
          key       = split("/", full_key)[4]                          # 3->4
          value     = value
        }
      ]
      customers = {
        for group_key in distinct([for p in local.parameter_tuples : p.group_key]) :
        group_key => merge(
          {
            customer = split("_", group_key)[0]
          },
          merge([
            for p in local.parameter_tuples : {
              for inner in [p] :
              inner.key => inner.value
            } if p.group_key == group_key
          ]...)
        )
      }
    }
    
    output "all_customers" {
      value = local.customers
    }
    
    

    produz a saída desejada:

    $ terraform plan
    
    Changes to Outputs:
      + all_customers = {
          + customer1_prod = {
              + customer = "customer1"
              + password = "password123"
              + realm    = "default"
              + url      = "https://customer1-sso.app.something.cloud/auth"
              + userid   = "f:48c1ce1f:monitoring"
            }
        }
    
    • 1

relate perguntas

  • Gerar JSON dinamicamente no Terraform

  • Crie usuário se ele não existir com Terraform

  • Terraform: copie elementos específicos do mapa onde especificado pela lista

  • O modelo Terraform não substitui variáveis ​​por valor

  • Não é possível recuperar um único ID de instância do EC2 de vários IDs para o módulo ALB

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve