modules/net-vpc-factory/factory-vpn.tf (104 lines of code) (raw):
/**
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# tfdoc:file:description VPN factory.
locals {
routers = merge(flatten([
for factory_key, factory_config in local.network_projects : [
for vpc_key, vpc_config in try(factory_config.vpc_config, {}) : [
for router_key, router_config in try(vpc_config.routers, {}) : {
"${factory_key}/${vpc_key}/${router_key}" = merge(router_config, {
vpc_self_link = module.vpc["${factory_key}/${vpc_key}"].self_link
project_id = module.projects[factory_key].id
custom_advertise = try(router_config.custom_advertise, {})
advertise_mode = try(router_config.custom_advertise != null, false) ? "CUSTOM" : "DEFAULT"
advertised_groups = try(router_config.custom_advertise.all_subnets, false) ? ["ALL_SUBNETS"] : []
keepalive = try(router_config.keepalive, null)
asn = try(router_config.asn, null)
})
}
]
]
])...)
vpns = merge(flatten([
for factory_key, factory_config in local.network_projects : [
for vpc_key, vpc_config in try(factory_config.vpc_config, {}) : [
for k, v in try(vpc_config.vpn_config, {}) : {
"${factory_key}/${vpc_key}/${k}" = merge(v, {
vpc_name = module.vpc["${factory_key}/${vpc_key}"].name
vpn_name = replace("${factory_key}/${vpc_key}/${k}", "/", "-")
project_id = module.projects[factory_key].id
},
{
router_config = merge(v.router_config,
try(v.router_config.create, false) == false && can(v.router_config.name) ? {
name = try(google_compute_router.default[v.router_config.name].name, v.router_config.name)
} : {}
)
}
)
}
]
]
])...)
}
resource "google_compute_router" "default" {
for_each = local.routers
name = replace(each.key, "/", "-")
project = each.value.project_id
region = each.value.region
network = each.value.vpc_self_link
bgp {
advertise_mode = each.value.advertise_mode
advertised_groups = each.value.advertised_groups
dynamic "advertised_ip_ranges" {
for_each = try(each.value.custom_advertise.ip_ranges, {})
iterator = range
content {
range = range.key
description = range.value
}
}
keepalive_interval = each.value.keepalive
asn = each.value.asn
}
}
resource "google_compute_ha_vpn_gateway" "default" {
for_each = local.vpns
project = each.value.project_id
region = each.value.region
name = replace(each.key, "/", "-")
network = each.value.vpc_name
stack_type = try(each.value.stack_type, null)
depends_on = [module.vpc]
}
module "vpn-ha" {
source = "../net-vpn-ha"
for_each = local.vpns
project_id = each.value.project_id
name = replace(each.key, "/", "-")
network = each.value.vpc_name
region = each.value.region
router_config = each.value.router_config
tunnels = each.value.tunnels
vpn_gateway = google_compute_ha_vpn_gateway.default[each.key].id
vpn_gateway_create = null
peer_gateways = {
for k, gw in each.value.peer_gateways : k => {
for gw_type, value in gw : gw_type => (
gw_type == "gcp" ? try(google_compute_ha_vpn_gateway.default[value].id, value) : value
)
}
}
}