map関数っぽい表現

Terraformでlistやmapのようなコレクションのそれぞれの要素を変換した新たなlistやmapを作るにはfor式を使う。

list → list の場合

list型の値をlist型に変換する場合は以下のように書く。

[for 要素が入る変数 in 変換元のリスト : 新たな要素]

locals {
  ids = [1, 2, 3]
}

output "names" {
  value = [for id in local.ids : "name-${id}"]
}

terraform planの結果は以下のようになる。

$ terraform plan
...
Changes to Outputs:
  + names = [
      + "name-1",
      + "name-2",
      + "name-3",
    ]

list → map の場合

結果がmapの場合は以下のように書く。

{ for 要素が入る変数 in 変換元のリスト : 新たな要素のキー => 新たな要素の値 }

locals {
  ids = [1, 2, 3]
}

output "names" {
  value = { for id in local.ids : "name-${id}" => id }
}

terraform planの結果は以下のようになる。

$ terraform plan
...
Changes to Outputs:
  + names = {
      + name-1 = 1
      + name-2 = 2
      + name-3 = 3
    }

map -> list の場合

map型の値をlist型に変換する場合は以下のように書く。

[for キーの変数, 値の変数 in 変換元のマップ : ]

locals {
  ids = {
    id1 = 1
    id2 = 2
  }
}

output "names" {
  value = [for key, value in local.ids : "${key}-${value}"]
}

terraform planの結果は以下のようになる。

$ terraform plan
...
Changes to Outputs:
  + names = [
      + "id1-1",
      + "id2-2",
    ]

map -> map の場合

map型の値をmap型に変換する場合は以下のように書く。

{ for キーの変数, 値の変数 in 変換元のマップ : 新たな要素のキー => 新たな要素の値 }

locals {
  ids = {
    id1 = 1
    id2 = 2
  }
}

output "names" {
  value = { for key, value in local.ids : "test-${key}" => "test-${value}" }
}

terraform planの結果は以下のようになる。

$ terraform plan
...
Changes to Outputs:
  + names = {
      + test-id1 = "test-1"
      + test-id2 = "test-2"
    }