terraform/modules/nw-db2-ha/main.tf (303 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. */ data "google_compute_subnetwork" "subnetwork" { name = var.subnetwork region = local.region project = local.subnetwork_project_id } module "ascs" { source = "../vm" boot_disk_auto_delete = var.auto_delete_disk_boot boot_disk_size = var.disk_size_boot boot_disk_type = var.disk_type_boot additional_disks = local.additional_disks instance_name = var.instance_name_ascs instance_type = var.instance_type_ascs metadata = local.metadata network_tags = var.network_tags project_id = var.project_id service_account_email = var.service_account_email service_account_scopes = var.service_account_scopes source_image = var.source_image source_image_family = var.source_image_family source_image_project_id = var.source_image_project_id subnetwork = var.subnetwork subnetwork_project_id = local.subnetwork_project_id zone = var.zone_primary } module "ers" { source = "../vm" boot_disk_auto_delete = var.auto_delete_disk_boot boot_disk_size = var.disk_size_boot boot_disk_type = var.disk_type_boot additional_disks = local.additional_disks instance_name = var.instance_name_ers instance_type = var.instance_type_ers metadata = local.metadata network_tags = var.network_tags project_id = var.project_id service_account_email = var.service_account_email service_account_scopes = var.service_account_scopes source_image = var.source_image source_image_family = var.source_image_family source_image_project_id = var.source_image_project_id subnetwork = var.subnetwork subnetwork_project_id = local.subnetwork_project_id zone = var.zone_secondary } module "db2_primary" { source = "../vm" boot_disk_auto_delete = var.auto_delete_disk_boot boot_disk_size = var.disk_size_boot boot_disk_type = var.disk_type_boot additional_disks = local.additional_disks_db2 instance_name = var.instance_name_db2_primary instance_type = var.instance_type_db2 metadata = local.metadata network_tags = var.network_tags project_id = var.project_id service_account_email = var.service_account_email service_account_scopes = var.service_account_scopes source_image = var.source_image source_image_family = var.source_image_family source_image_project_id = var.source_image_project_id subnetwork = var.subnetwork subnetwork_project_id = local.subnetwork_project_id zone = var.zone_primary } module "db2_secondary" { source = "../vm" boot_disk_auto_delete = var.auto_delete_disk_boot boot_disk_size = var.disk_size_boot boot_disk_type = var.disk_type_boot additional_disks = local.additional_disks_db2 instance_name = var.instance_name_db2_secondary instance_type = var.instance_type_db2 metadata = local.metadata network_tags = var.network_tags project_id = var.project_id service_account_email = var.service_account_email service_account_scopes = var.service_account_scopes source_image = var.source_image source_image_family = var.source_image_family source_image_project_id = var.source_image_project_id subnetwork = var.subnetwork subnetwork_project_id = local.subnetwork_project_id zone = var.zone_secondary } module "as" { source = "../vm" for_each = toset(local.instance_names_as) boot_disk_auto_delete = var.auto_delete_disk_boot boot_disk_size = var.disk_size_boot boot_disk_type = var.disk_type_boot additional_disks = local.additional_disks instance_name = each.key instance_type = var.instance_type_as metadata = local.metadata network_tags = var.network_tags project_id = var.project_id service_account_email = var.service_account_email service_account_scopes = var.service_account_scopes source_image = var.source_image source_image_family = var.source_image_family source_image_project_id = var.source_image_project_id subnetwork = var.subnetwork subnetwork_project_id = local.subnetwork_project_id # Alternate zones between primary and secondary. zone = local.zones[index(local.instance_names_as, each.value) % 2] } module "umig_ascs" { source = "../umig" instances_self_links = [module.ascs.instance_self_link] name = var.instance_name_ascs project_id = var.project_id zones = [var.zone_primary] } module "umig_ers" { source = "../umig" instances_self_links = [module.ers.instance_self_link] name = var.instance_name_ers project_id = var.project_id zones = [var.zone_secondary] } module "umig_db2" { source = "../umig" instances_self_links = [module.db2_primary.instance_self_link, module.db2_secondary.instance_self_link] name = "${var.instance_name_db2_primary}-${var.instance_name_db2_secondary}" project_id = var.project_id zones = [var.zone_primary, var.zone_secondary] } module "ilb_ascs" { source = "../terraform-google-lb-internal" all_ports = true backends = [ { group = module.umig_ascs.instance_groups[var.zone_primary].self_link description = "" failover = false }, { group = module.umig_ers.instance_groups[var.zone_secondary].self_link description = "" failover = true }, ] failover_policy = { disable_connection_drain_on_failover = true drop_traffic_if_unhealthy = true failover_ratio = 1 } health_check = { check_interval_sec = null healthy_threshold = 1 host = null port = var.health_check_port_ascs port_name = "ascs" proxy_header = null request = null request_path = null response = null timeout_sec = null type = "tcp" unhealthy_threshold = 3 } name = var.instance_name_ascs network = local.network network_project = var.subnetwork_project_id ports = [] project = var.project_id region = local.region source_tags = [] subnetwork = var.subnetwork target_tags = var.network_tags } module "ilb_db2" { source = "../terraform-google-lb-internal" all_ports = true backends = [ { group = module.umig_db2.instance_groups[var.zone_primary].self_link description = "" failover = false }, { group = module.umig_db2.instance_groups[var.zone_secondary].self_link description = "" failover = true }, ] failover_policy = { disable_connection_drain_on_failover = true drop_traffic_if_unhealthy = true failover_ratio = 1 } health_check = { check_interval_sec = null healthy_threshold = 1 host = null port = var.health_check_port_db2 port_name = "db2" proxy_header = null request = null request_path = null response = null timeout_sec = null type = "tcp" unhealthy_threshold = 3 } name = "${var.instance_name_db2_primary}-${var.instance_name_db2_secondary}" network = local.network network_project = var.subnetwork_project_id ports = [] project = var.project_id region = local.region source_tags = [] subnetwork = var.subnetwork target_tags = var.network_tags } module "ilb_ers" { source = "../terraform-google-lb-internal" count = var.ers_ilb_required ? 1 : 0 all_ports = true backends = [ { group = module.umig_ers.instance_groups[var.zone_secondary].self_link description = "" failover = false }, { group = module.umig_ascs.instance_groups[var.zone_primary].self_link description = "" failover = true }, ] failover_policy = { disable_connection_drain_on_failover = true drop_traffic_if_unhealthy = true failover_ratio = 1 } health_check = { check_interval_sec = null healthy_threshold = 1 host = null port = var.health_check_port_ers port_name = "ers" proxy_header = null request = null request_path = null response = null timeout_sec = null type = "tcp" unhealthy_threshold = 3 } name = var.instance_name_ers network = local.network network_project = var.subnetwork_project_id ports = [] project = var.project_id region = local.region source_tags = [] subnetwork = var.subnetwork target_tags = var.network_tags } module "filestore" { source = "../filestore" count = var.filestore_name == "" ? 0 : 1 clients = concat( [ module.ascs.internal_ip, module.ers.internal_ip, module.db2_primary.internal_ip, module.db2_secondary.internal_ip, ], [for as in module.as : as.internal_ip]) name = var.filestore_name network = local.network project_id = local.subnetwork_project_id share = "sap" size = var.filestore_size tier = var.filestore_tier zone = var.zone_primary } resource "google_compute_address" "ers_vip" { count = var.ers_ilb_required ? 0 : 1 name = "${var.instance_name_ers}-vip" address_type = "INTERNAL" subnetwork = var.subnetwork region = local.region project = var.project_id purpose = "GCE_ENDPOINT" }