0

I have this variable:

applications = {
  "app-name" = {
    more_stuff = "x"
    environments = ["dev", "stg"]
  }
  "workload" = {
    random_thing = "y"
    environments = ["dev"]
  }
}

I want to create this map from it:

application_envs = {
  "app-name-dev" = { more_stuff = "x" }
  "app-name-stg" = { more_stuff = "x" }
  "workload-dev" = { random_thing = "y" }
}

I've tried using flatten but I didn't have any success:

application_envs = flatten([
  for application_key, application in var.applications : [
    for env in application.environments : [
      {"${application_key}-${env}" = workspace}
    ]
  ]
])

The problem is that it creates a list of objects:

result = [
  { "app-name-dev" = { ... } },
  { "app-name-stg" = { ... } },
  ...
]

How can I achieve the desired result?

1 Answer 1

3

You are headed in the correct direction, but for this kind of data transformation the algorithm requires two steps. Your first step is completely correct, but now you need the second step:

result = { for app_env in application_envs : keys(app_env)[0] => values(app_env)[0] }

This transforms the list(object) by iteratively mapping the key of each object element to the value of each object element. Testing the output produces:

result = {
  app-name-dev = {
    more_stuff = "x"
  }
  app-name-stg = {
    more_stuff = "x"
  }
}

as desired. Since the namespaces of the variables have been omitted from the question, I have likewise omitted them from the answer, but you may need to re-add them yourself when converting between the question code and the actual code.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.