3-networks-hub-and-spoke/modules/base_env/main.tf (288 lines of code) (raw):

/** * Copyright 2022 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 { bgp_asn_number = var.enable_partner_interconnect ? "16550" : "64514" supported_restricted_service = [ "accessapproval.googleapis.com", "adsdatahub.googleapis.com", "aiplatform.googleapis.com", "alloydb.googleapis.com", "alpha-documentai.googleapis.com", "analyticshub.googleapis.com", "apigee.googleapis.com", "apigeeconnect.googleapis.com", "artifactregistry.googleapis.com", "assuredworkloads.googleapis.com", "automl.googleapis.com", "baremetalsolution.googleapis.com", "batch.googleapis.com", "bigquery.googleapis.com", "bigquerydatapolicy.googleapis.com", "bigquerydatatransfer.googleapis.com", "bigquerymigration.googleapis.com", "bigqueryreservation.googleapis.com", "bigtable.googleapis.com", "binaryauthorization.googleapis.com", "cloud.googleapis.com", "cloudasset.googleapis.com", "cloudbuild.googleapis.com", "clouddebugger.googleapis.com", "clouddeploy.googleapis.com", "clouderrorreporting.googleapis.com", "cloudfunctions.googleapis.com", "cloudkms.googleapis.com", "cloudprofiler.googleapis.com", "cloudresourcemanager.googleapis.com", "cloudscheduler.googleapis.com", "cloudsearch.googleapis.com", "cloudtrace.googleapis.com", "composer.googleapis.com", "compute.googleapis.com", "connectgateway.googleapis.com", "contactcenterinsights.googleapis.com", "container.googleapis.com", "containeranalysis.googleapis.com", "containerfilesystem.googleapis.com", "containerregistry.googleapis.com", "containerthreatdetection.googleapis.com", "datacatalog.googleapis.com", "dataflow.googleapis.com", "datafusion.googleapis.com", "datamigration.googleapis.com", "dataplex.googleapis.com", "dataproc.googleapis.com", "datastream.googleapis.com", "dialogflow.googleapis.com", "dlp.googleapis.com", "dns.googleapis.com", "documentai.googleapis.com", "domains.googleapis.com", "eventarc.googleapis.com", "file.googleapis.com", "firebaseappcheck.googleapis.com", "firebaserules.googleapis.com", "firestore.googleapis.com", "gameservices.googleapis.com", "gkebackup.googleapis.com", "gkeconnect.googleapis.com", "gkehub.googleapis.com", "healthcare.googleapis.com", "iam.googleapis.com", "iamcredentials.googleapis.com", "iaptunnel.googleapis.com", "ids.googleapis.com", "integrations.googleapis.com", "kmsinventory.googleapis.com", "krmapihosting.googleapis.com", "language.googleapis.com", "lifesciences.googleapis.com", "logging.googleapis.com", "managedidentities.googleapis.com", "memcache.googleapis.com", "meshca.googleapis.com", "meshconfig.googleapis.com", "metastore.googleapis.com", "ml.googleapis.com", "monitoring.googleapis.com", "networkconnectivity.googleapis.com", "networkmanagement.googleapis.com", "networksecurity.googleapis.com", "networkservices.googleapis.com", "notebooks.googleapis.com", "opsconfigmonitoring.googleapis.com", "orgpolicy.googleapis.com", "osconfig.googleapis.com", "oslogin.googleapis.com", "privateca.googleapis.com", "pubsub.googleapis.com", "pubsublite.googleapis.com", "recaptchaenterprise.googleapis.com", "recommender.googleapis.com", "redis.googleapis.com", "retail.googleapis.com", "run.googleapis.com", "secretmanager.googleapis.com", "servicecontrol.googleapis.com", "servicedirectory.googleapis.com", "spanner.googleapis.com", "speakerid.googleapis.com", "speech.googleapis.com", "sqladmin.googleapis.com", "storage.googleapis.com", "storagetransfer.googleapis.com", "sts.googleapis.com", "texttospeech.googleapis.com", "timeseriesinsights.googleapis.com", "tpu.googleapis.com", "trafficdirector.googleapis.com", "transcoder.googleapis.com", "translate.googleapis.com", "videointelligence.googleapis.com", "vision.googleapis.com", "visionai.googleapis.com", "vmmigration.googleapis.com", "vpcaccess.googleapis.com", "webrisk.googleapis.com", "workflows.googleapis.com", "workstations.googleapis.com", ] // restricted_enabled = try(data.terraform_remote_state.bootstrap.outputs.common_config.restricted_enabled,false) restricted_enabled = module.env_enabled.restricted_enabled restricted_services = length(var.custom_restricted_services) != 0 ? var.custom_restricted_services : local.supported_restricted_service spoke_config = module.vpc_config.spoke_config environment_code = local.spoke_config.vpc_config.env_code mode = local.spoke_config.vpc_config.mode default_region1 = local.spoke_config.regions.region1.default default_region2 = local.spoke_config.regions.region2.default region1_enabled = local.spoke_config.regions.region1.enabled region2_enabled = local.spoke_config.regions.region2.enabled subnet_base = local.spoke_config.base.subnets filtered_subnet_base = local.spoke_config.base.filtered_subnets base_private_service_cidr = try(local.spoke_config.base.private_service_cidr, null) base_private_service_connect_ip = try(local.spoke_config.base.private_service_connect_ip, null) base_vpc_routes = try(local.spoke_config.base.vpc_routes, null) secondary_base_subnets = try(local.spoke_config.base.secondary_ranges, null) filtered_base_subnets_names = local.spoke_config.base.filtered_subnets_names filtered_base_subnets_ips = local.spoke_config.base.filtered_subnets_ips subnet_restricted = try(local.restricted_enabled ? local.spoke_config.restricted.subnets : [], []) filtered_subnet_restricted = try(local.restricted_enabled ? local.spoke_config.restricted.filtered_subnets : [], []) restricted_private_service_cidr = try(local.restricted_enabled ? local.spoke_config.restricted.private_service_cidr : null, null) restricted_private_service_connect_ip = try(local.restricted_enabled ? local.spoke_config.restricted.private_service_connect_ip : null, null) restricted_vpc_routes = try(local.restricted_enabled ? local.spoke_config.restricted.vpc_routes : [], []) secondary_restricted_subnets = try(local.restricted_enabled ? local.spoke_config.restricted.secondary_ranges : [], []) filtered_restricted_subnets_names = try(local.restricted_enabled ? local.spoke_config.restricted.filtered_subnets_names : [], []) filtered_restricted_subnets_ips = try(local.restricted_enabled ? local.spoke_config.restricted.filtered_subnets_ips : [], []) nat_enabled = local.spoke_config.nat_enabled router_ha_enabled = local.spoke_config.router_ha_enabled base_subnet_self_links = module.base_shared_vpc[0].subnets_self_links restricted_subnet_self_links = try(local.restricted_enabled ? module.restricted_shared_vpc[0].subnets_self_links : [], []) sl_base_subnets_split = { for one_subnet_selflink in local.base_subnet_self_links : one_subnet_selflink => { project_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "projects", ) + 1, ) region_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "regions") + 1, ) subnet_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "subnetworks") + 1, ) } } sl_restricted_subnets_split = try(local.restricted_enabled ? { for one_subnet_selflink in local.restricted_subnet_self_links : one_subnet_selflink => { project_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "projects", ) + 1, ) region_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "regions") + 1, ) subnet_name = element(split("/", one_subnet_selflink), index(split("/", one_subnet_selflink), "subnetworks") + 1, ) } } : {}, {}) sl_base_subnets_by_srvprj = { for one_subnet_selflink in local.base_subnet_self_links : one_subnet_selflink => flatten([ for one_subnet in local.subnet_base : { for one_srv_project in(contains(keys(one_subnet), "service_projects") ? one_subnet.service_projects : []) : one_srv_project.id => { srv_project_id = one_srv_project.id srv_project_mode = one_srv_project.mode srv_host_project = local.sl_base_subnets_split[one_subnet_selflink].project_name snet_region_id = one_subnet.region_id } if(one_subnet.subnet_name == local.sl_base_subnets_split[one_subnet_selflink].subnet_name && one_subnet.subnet_region == local.sl_base_subnets_split[one_subnet_selflink].region_name) } ]) } sl_restricted_subnets_by_srvprj = try(local.restricted_enabled ? { for one_subnet_selflink in local.restricted_subnet_self_links : one_subnet_selflink => flatten([ for one_subnet in local.subnet_restricted : { for one_srv_project in(contains(keys(one_subnet), "service_projects") ? one_subnet.service_projects : []) : one_srv_project.id => { srv_project_id = one_srv_project.id srv_project_mode = one_srv_project.mode srv_host_project = local.sl_restricted_subnets_split[one_subnet_selflink].project_name snet_region_id = one_subnet.region_id } if(one_subnet.subnet_name == local.sl_restricted_subnets_split[one_subnet_selflink].subnet_name && one_subnet.subnet_region == local.sl_restricted_subnets_split[one_subnet_selflink].region_name) } ]) } : {}, {}) } module "env_enabled" { source = "../../modules/env_enabled" remote_state_bucket = var.remote_state_bucket } module "vpc_config" { source = "../../modules/nhas_config/vpc_config" env = var.env config_file = "../../vpc_config.yaml" restricted_enabled = local.restricted_enabled } /****************************************** Restricted shared VPC *****************************************/ module "restricted_shared_vpc" { source = "../restricted_shared_vpc" count = length(local.subnet_restricted) > 0 && local.restricted_enabled ? 1 : 0 project_id = local.restricted_project_id project_number = local.restricted_project_number dns_hub_project_id = local.dns_hub_project_id restricted_net_hub_project_id = local.restricted_net_hub_project_id restricted_net_hub_project_number = local.restricted_net_hub_project_number environment_code = var.environment_code access_context_manager_policy_id = var.access_context_manager_policy_id restricted_services = local.restricted_services members = distinct(concat([ "serviceAccount:${local.networks_service_account}", "serviceAccount:${local.projects_service_account}", "serviceAccount:${local.organization_service_account}", ], var.perimeter_additional_members)) ingress_policies = var.ingress_policies egress_policies = var.egress_policies bgp_asn_subnet = local.bgp_asn_number domain = var.domain mode = local.mode subnets = local.filtered_subnet_restricted secondary_ranges = local.secondary_restricted_subnets default_region1 = local.default_region1 default_region2 = local.default_region2 region1_enabled = local.region1_enabled region2_enabled = local.region2_enabled private_service_cidr = local.restricted_private_service_cidr private_service_connect_ip = local.restricted_private_service_connect_ip nat_enabled = local.nat_enabled router_ha_enabled = local.router_ha_enabled vpc_routes = local.restricted_vpc_routes } /****************************************** Base shared VPC *****************************************/ module "base_shared_vpc" { source = "../base_shared_vpc" count = length(local.subnet_base) > 0 ? 1 : 0 project_id = local.base_project_id dns_hub_project_id = local.dns_hub_project_id base_net_hub_project_id = local.base_net_hub_project_id environment_code = var.environment_code domain = var.domain bgp_asn_subnet = local.bgp_asn_number mode = local.mode subnets = local.filtered_subnet_base secondary_ranges = local.secondary_base_subnets default_region1 = local.default_region1 default_region2 = local.default_region2 region1_enabled = local.region1_enabled region2_enabled = local.region2_enabled private_service_cidr = local.base_private_service_cidr private_service_connect_ip = local.base_private_service_connect_ip nat_enabled = local.nat_enabled router_ha_enabled = local.router_ha_enabled vpc_routes = local.base_vpc_routes depends_on = [module.restricted_shared_vpc] }