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:
- Deveria haver cinco itens no objeto (cliente, senha, domínio, url e id do usuário) e há apenas dois.
- 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.