我在模块根目录中有一个 Terraform Variables.tf,其内容类似于以下内容:
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
}
}
我想将其转换为如下所示的对象图:
{
"customer1_prod" = {
customer = "customer1"
password = "password123"
realm = "default"
url = "https://customer1-sso.app.something.cloud/auth"
userid = "f:48c1ce1f:monitoring"
}
...
}
我已经在根模块(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
}
然而,输出显示如下:
+ all_customers = {
+ customer1_prod = {
+ customer = "customer1"
+ keycloak = "f:48c1ce1f:monitoring"
}
...
...
如何修复这个错误的对象映射?有两个错误:
- 对象中应该有五项(客户、密码、领域、url 和用户 ID),但实际上只有两项。
- 该
keycloak = "f:48c1ce1f:monitoring"
项目应该是userid = "f:48c1ce1f:monitoring"
此外,我愿意接受有关更好的 Terraform 代码的建议来执行此转换,因为我认为我的代码对于其任务来说太复杂了,并且可能可以用更少的代码行以更简单的方式完成。