For_each with item list in list of map

Hello,

I try to create pagerduty ressources with input variable format :

users_admin = [
  {
    name  = "User1"
    email = "User1@domain.com"
    teams = [
      "TEAM1"
    ]
  },
  {
    name  = "User2"
    email = "User2@domain.com"
    teams = [
      "TEAM1"
    ]
  }
]

Actually it’s work if teams is string with 1 item :

Exemple :

users_admin = [
  {
    name  = "User1"
    email = "User1@domain.com"
    teams = "TEAM1"
  },
  {
    name  = "User2"
    email = "User2@domain.com"
    teams ="TEAM2"
  }
]

resource "pagerduty_user" "users_admin" {
  for_each = {
    for user in var.users_admin : user.name => user
  }
  name        = each.key
  email       = each.value.email
  role        = lookup(each.value, "role", "admin")
  description = lookup(each.value, "description", "Managed by Terraform")
  job_title   = lookup(each.value, "job_title", "")
  license     = data.pagerduty_license.business.id
}

resource "pagerduty_team_membership" "users_admin" {
  for_each = {
    for user in var.users_admin : user.name => user
  }
  user_id = pagerduty_user.users_admin[each.value.name].id
  team_id = pagerduty_team.teams[each.value.team].id
}

I don’t find how to replace teams string to list and iterate pagerduty_team_membership :confused:

Have you idea why ?

Thx

To understand what is going on here, you must focus on exactly what the pagerduty_team_membership resource creates. That is, the membership of exactly one user in exactly one team.

Meaning if you want user Bob to be a member of teams Red and Green, you need a Bob-Red and a Bob-Green pagerduty_team_membership instance.

  for_each = {
    for membership in flatten([
      for user in var.users_admin : [
        for team in user.teams :
        { user = user, team = team }
    ]]) :
    "${membership.user.name} ${membership.team}" => membership
  }

  # and now refer to each.value.user.name and each.value.team
  # in the other attributes
1 Like

It’s work !
Thx for your help :slight_smile: