terraform の Google Cloud プロバイダーの google_compute_subnetwork
リソースを定義している module で、
- 1つのサブネットで1つ以上のセカンダリ IP レンジを持つことができる
- Production 環境と Staging 環境など似た構成で複数のサブネットを作りたい
- ただし、あるネットワークではセカンダリ IP レンジを持たないサブネットもある
というようなことが想定される場合はこんなふうに書いておくと良さそう。
# modules/foo/variables.tf variable "subnets" { type = map(object({ ip_cidr_range = string })) } variable "secondary_ip_ranges" { type = map(list(object({ range_name = string ip_cidr_range = string }))) default = {} }
サブネットそのもの情報と、サブネット内でオプショナルとなるセカンダリ IP レンジの情報を別の変数として定義しておく。ミソは map として作っているところ。また、secondary_ip_ranges
は存在しない場合があるので default = {}
として空の map をデフォルト値としている。
# moduels/foo/main.tf resource "google_compute_subnetwork" "ubnetwork" { for_each = var.subnets ... ip_cidr_range = each.value.ip_cidr_range dynamic secondary_ip_range { for_each = contains(keys(var.secondary_ip_ranges), each.key) ? var.secondary_ip_ranges[each.key] : [] content { range_name = lookup(secondary_ip_range.value, "range_name", null) ip_cidr_range = lookup(secondary_ip_range.value, "ip_cidr_range", null) } } }
dynamic secodary_ip_range
の中で var.secondary_ip_ranges
のキーと var.subnet
のキーを突き合わせて存在する場合は secondary_ip_range を設定するようにしている。
実際に使う時は以下のようにする。
# main.tf # セカンダリ IP レンジが存在するサブネット module "hoge" { source = "./modules/foo" ... subnets = { "production" = { ip_cidr_range = "10.244.0.0/20" } "staging" = { ip_cidr_range = "10.244.16.0/20" } } secondary_ip_ranges = { "production" = [ { range_name = "subnet-01" ip_cidr_range = "10.244.192.0/20" } { range_name = "subnet-02" ip_cidr_range = "10.244.208.0/20" } ] "staging" = [ { range_name = "subnet-01" ip_cidr_range = "10.244.224.0/20" } { range_name = "subnet-02" ip_cidr_range = "10.244.240.0/20" } ] } } # セカンダリ IP レンジが存在しないサブネット module "fuga" { source = "./modules/foo" ... subnets = { "production" = { ip_cidr_range = "10.245.0.0/20" } "staging" = { ip_cidr_range = "10.245.16.0/20" } } }