3-networks-dual-svpc/modules/base_shared_vpc/main.tf (132 lines of code) (raw):

/** * Copyright 2021 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. */ locals { vpc_name = "${var.environment_code}-shared-base" network_name = "vpc-${local.vpc_name}" private_googleapis_cidr = module.private_service_connect.private_service_connect_ip } /****************************************** Shared VPC configuration *****************************************/ module "main" { source = "terraform-google-modules/network/google" version = "~> 8.0" project_id = var.project_id network_name = local.network_name shared_vpc_host = "true" delete_default_internet_gateway_routes = "true" subnets = var.subnets secondary_ranges = var.secondary_ranges routes = concat( var.nat_enabled ? [ { name = "rt-${local.vpc_name}-1000-egress-internet-default" description = "Tag based route through IGW to access internet" destination_range = "0.0.0.0/0" tags = "egress-internet" next_hop_internet = "true" priority = "1000" } ] : [], var.windows_activation_enabled ? [{ name = "rt-${local.vpc_name}-1000-all-default-windows-kms" description = "Route through IGW to allow Windows KMS activation for GCP." destination_range = "35.190.247.13/32" next_hop_internet = "true" priority = "1000" } ] : [] ) } /*************************************************************** Configure Service Networking for Cloud SQL & future services. **************************************************************/ resource "google_compute_global_address" "private_service_access_address" { count = var.private_service_cidr != null ? 1 : 0 name = "ga-${local.vpc_name}-vpc-peering-internal" project = var.project_id purpose = "VPC_PEERING" address_type = "INTERNAL" address = element(split("/", var.private_service_cidr), 0) prefix_length = element(split("/", var.private_service_cidr), 1) network = module.main.network_self_link } resource "google_service_networking_connection" "private_vpc_connection" { count = var.private_service_cidr != null ? 1 : 0 network = module.main.network_self_link service = "servicenetworking.googleapis.com" reserved_peering_ranges = [google_compute_global_address.private_service_access_address[0].name] } /************************************ Router to advertise shared VPC subnetworks and Google Private API ************************************/ module "region1_router1" { source = "terraform-google-modules/cloud-router/google" version = "~> 4.0" name = "cr-${local.vpc_name}-${var.default_region1}-cr1" project = var.project_id network = module.main.network_name region = var.default_region1 bgp = { asn = var.bgp_asn_subnet advertised_groups = ["ALL_SUBNETS"] advertised_ip_ranges = [{ range = local.private_googleapis_cidr }] } } module "region1_router2" { source = "terraform-google-modules/cloud-router/google" version = "~> 4.0" name = "cr-${local.vpc_name}-${var.default_region1}-cr2" project = var.project_id network = module.main.network_name region = var.default_region1 bgp = { asn = var.bgp_asn_subnet advertised_groups = ["ALL_SUBNETS"] advertised_ip_ranges = [{ range = local.private_googleapis_cidr }] } } module "region2_router1" { source = "terraform-google-modules/cloud-router/google" version = "~> 4.0" name = "cr-${local.vpc_name}-${var.default_region2}-cr3" project = var.project_id network = module.main.network_name region = var.default_region2 bgp = { asn = var.bgp_asn_subnet advertised_groups = ["ALL_SUBNETS"] advertised_ip_ranges = [{ range = local.private_googleapis_cidr }] } } module "region2_router2" { source = "terraform-google-modules/cloud-router/google" version = "~> 4.0" name = "cr-${local.vpc_name}-${var.default_region2}-cr4" project = var.project_id network = module.main.network_name region = var.default_region2 bgp = { asn = var.bgp_asn_subnet advertised_groups = ["ALL_SUBNETS"] advertised_ip_ranges = [{ range = local.private_googleapis_cidr }] } }