参考: 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つのサブネットが宣言的に作られる。