← All Articles

Terraformでmapのkeyとvalueを入れ替える

Posted on

はじめに

Terraform を使ってユーザーの管理で利用しようとしています。

Terraform の locals でユーザーが key になっているのですが、ユーザーは複数のグループに所属します。

このままだとグループごとに for の loop が回せない状態です。

そこで key と value を入れ得られるようにする方法を考えたので、こちらにメモしておきます。

localsの定義

taro がグループ A,B,C に所属し、hanako がグループ A,D に所属している状態です。 グループ A には taro,hanako グループ B には taro …というような形に変更がしたいです。

locals {
  user ={
    taro = {
      group = [
        "A",
        "B",
        "C"
      ]
    }
    hanako = {
      group = [
        "A",
        "D"
      ]
    }
  }
}

入れ替えの表現方法

output で記載しますが group の種類を全て抽出して各ユーザーの所属する group を判定します。

output "key-value-reverse" {
  value = {
    ## 定義されているグループを全て抽出してforを回す
    for group in distinct(flatten(values(local.user)[*].group)) :  
      # ユーザーが所属するグループかどうかを判断して所属する場合は、user_nameを配列に追加する
      group =>[
        for user_name,user_groups in local.user: user_name
        if contains( flatten(values(user_groups)),group)
        ]
  } 
}

出力結果

意図通りにグループのAには hanako,taro, Bにはtaro .. と出力されました。

Changes to Outputs:
  + key-value-reverse = {
      + A = [
          + "hanako",
          + "taro",
        ]
      + B = [
          + "taro",
        ]
      + C = [
          + "taro",
        ]
      + D = [
          + "hanako",
        ]
    }

参考サイト

IAM Identity Center(AWS SSO)のグループとユーザーをTerraformでDRYに書く

How to do a Terraform Nested for loop for Resources

技術Terraform