Terraform: setproduct

参考: https://docs.hashicorp.com/terraform/language/functions/setproduct

「全組み合わせ」を作る関数。数学でいう直積(デカルト積)。

たとえば環境リスト × アプリリストで全パターンを生成する:

setproduct(["dev", "stg", "prod"], ["app1", "app2"])
# => [["dev","app1"], ["dev","app2"], ["stg","app1"], ["stg","app2"], ["prod","app1"], ["prod","app2"]]

なぜ必要か

Terraformにはネストしたforループがない。「環境 × リージョン」のように2つの軸の全組み合わせでリソースを作りたいとき、setproductで一発で全パターンを生成し、for_eachに渡す。

locals {
  network_subnets = [
    for pair in setproduct(keys(var.networks), keys(var.subnets)) : {
      network_key = pair[0]
      subnet_key  = pair[1]
    }
  ]
}

resource "aws_subnet" "example" {
  for_each = {
    for s in local.network_subnets : "${s.network_key}.${s.subnet_key}" => s
  }
  # ...
}

networks = {a, b} × subnets = {a, b, c} → 6つのサブネットが宣言的に作られる。