7-fortigate/shared/loadbalance.tf (319 lines of code) (raw):

#### External Load Balancer ### ### Forwarding Rule ### resource "google_compute_forwarding_rule" "external" { name = "external-lb-${random_string.random_name_post.result}" region = local.default_region ip_address = google_compute_address.static.address load_balancing_scheme = "EXTERNAL" target = google_compute_target_pool.external.self_link } ### Target Pools ### resource "google_compute_target_pool" "external" { name = "fgt-instancepool-${random_string.random_name_post.result}" region = local.default_region session_affinity = "CLIENT_IP" instances = [google_compute_instance_from_template.active_fgt_instance.self_link, google_compute_instance_from_template.passive_fgt_instance.self_link] health_checks = [ google_compute_http_health_check.external.name ] } ### Health Check ### resource "google_compute_http_health_check" "external" { name = "health-check-backend-${random_string.random_name_post.result}" check_interval_sec = 3 timeout_sec = 2 unhealthy_threshold = 3 port = "8008" } ### Internal ### resource "google_compute_address" "internal_address" { name = "internal-ilb-address-${random_string.random_name_post.result}" subnetwork = local.vpc_primary_subnet_self_link address_type = "INTERNAL" address = local.internal_ilb_address region = local.default_region } resource "google_compute_forwarding_rule" "internal_load_balancer" { name = "internal-slb-${random_string.random_name_post.result}" region = local.default_region ip_address = google_compute_address.internal_address.address load_balancing_scheme = "INTERNAL" backend_service = google_compute_region_backend_service.internal_load_balancer_backend.self_link all_ports = true network = local.vpc_private_network_self_link subnetwork = local.vpc_subnets_self_links[local.primary_subnet_idx] } resource "google_compute_region_backend_service" "internal_load_balancer_backend" { name = "internal-slb-backend-${random_string.random_name_post.result}" region = local.default_region connection_draining_timeout_sec = 10 session_affinity = "CLIENT_IP" network = local.vpc_private_network_self_link backend { group = google_compute_instance_group.umig_active.self_link balancing_mode = "CONNECTION" } backend { group = google_compute_instance_group.umig_passive.self_link balancing_mode = "CONNECTION" } health_checks = [ google_compute_health_check.hc.self_link ] } resource "google_compute_health_check" "hc" { name = "internal-slb-healthcheck-${random_string.random_name_post.result}" check_interval_sec = 3 timeout_sec = 2 tcp_health_check { port = "8008" } } resource "google_compute_image" "fgtvmgvnic" { count = var.nictype == "GVNIC" ? 1 : 0 name = "fgtvmgvnic-image" source_image = var.image guest_os_features { type = var.nictype } } # Active FGT Instance template resource "google_compute_instance_template" "active" { name = "active-fgt-template-${random_string.random_name_post.result}" description = "FGT-Active Instance Template" instance_description = "FGT-Active Instance Template" machine_type = var.machine can_ip_forward = true tags = ["allow-fgt", "allow-internal", "allow-sync", "allow-mgmt"] scheduling { automatic_restart = true on_host_maintenance = "MIGRATE" } # Create a new boot disk from an image disk { #source_image = var.nictype == "GVNIC" ? google_compute_image.fgtvmgvnic[0].self_link : var.image source_image = var.nictype == "GVNIC" ? local.fortigate_image : var.image auto_delete = true boot = true } # Log Disk disk { auto_delete = true boot = false disk_size_gb = 30 } # Public Network network_interface { subnetwork = google_compute_subnetwork.public_subnet.name nic_type = var.nictype network_ip = var.active_port1_ip } # Private Network network_interface { subnetwork = local.vpc_subnets_names[0] nic_type = var.nictype network_ip = local.private_active_address } # HA Sync Network network_interface { subnetwork = google_compute_subnetwork.sync_subnet.name nic_type = var.nictype network_ip = var.active_port3_ip } # Mgmt Network network_interface { subnetwork = google_compute_subnetwork.mgmt_subnet.name nic_type = var.nictype network_ip = var.active_port4_ip } # Metadata to bootstrap FGT metadata = { user-data = templatefile("${path.module}/active", { PROD_PUB_SNET_RANGE = local.prod_pub_snet_range PROD_APP_SNET_RANGE = local.prod_pub_snet_range PROD_DATA_SNET_RANGE = local.prod_data_snet_range NPROD_PUB_SNET_RANGE = local.nprod_pub_snet_range NPROD_APP_SNET_RANGE = local.nprod_app_snet_range NPROD_DATA_SNET_RANGE = local.nprod_data_snet_range DEV_PUB_SNET_RANGE = local.dev_pub_snet_range DEV_APP_SNET_RANGE = local.dev_app_snet_range DEV_DATA_SNET_RANGE = local.dev_data_snet_range MGMT_SNET_RANGE = local.mgmt_pri_snet_range IDEN_SNET_RANGE = local.iden_pri_snet_range FG_MGMT_SNET_RANGE = var.mgmt_subnet FG_PRIV_SNET_RANGE = local.vpc_primary_subnet FG_PUB_SNET_RANGE = var.public_subnet hub_base_subnet_for_route = var.hub_base_subnet_for_route hub_base_subnet_for_port2 = var.hub_base_subnet_for_port2 public_subnet_for_port1 = var.public_subnet_for_port1 active_port1_ip = var.active_port1_ip active_port1_mask = var.active_port1_mask # This overrides the port2 setting in vars.tf active_port2_ip = local.private_active_address active_port2_mask = var.active_port2_mask active_port3_ip = var.active_port3_ip active_port3_mask = var.active_port3_mask active_port4_ip = var.active_port4_ip active_port4_mask = var.active_port4_mask mgmt_gateway_ip = var.mgmt_gateway // mgmt gateway ip passive_hb_ip = var.passive_port3_ip // passive hb ip hb_netmask = var.mgmt_mask // mgmt netmask port1_gateway = google_compute_subnetwork.public_subnet.gateway_address port2_gateway = local.private_network_gateway clusterip = "cluster-ip-${random_string.random_name_post.result}" internalroute = "internal-route-${random_string.random_name_post.result}" internal_loadbalancer_ip = google_compute_address.internal_address.address public_subnet = var.public_subnet private_subnet = local.vpc_primary_subnet # fgt_public_ip = "${google_compute_address.static.address}" primary_region_subnet = local.vpc_primary_subnet }) license = fileexists("${path.module}/${var.licenseFile}") ? "${file(var.licenseFile)}" : null block-project-ssh-keys = "TRUE" } # Email will be the service account service_account { scopes = ["userinfo-email", "compute-rw", "storage-ro", "cloud-platform"] } } # Compute template for passive node # resource "google_compute_instance_template" "passive" { name = "passive-fgt-template-${random_string.random_name_post.result}" description = "FGT-Passive Instance Template" instance_description = "FGT-Passive Instance Template" machine_type = var.machine can_ip_forward = true tags = ["allow-fgt", "allow-internal", "allow-sync", "allow-mgmt"] scheduling { automatic_restart = true on_host_maintenance = "MIGRATE" } # Create a new boot disk from an image disk { source_image = var.nictype == "GVNIC" ? google_compute_image.fgtvmgvnic[0].self_link : var.image auto_delete = true boot = true } # Log Disk disk { auto_delete = true boot = false disk_size_gb = 30 } # Public Network network_interface { subnetwork = google_compute_subnetwork.public_subnet.name nic_type = var.nictype network_ip = var.passive_port1_ip } # Private Network network_interface { subnetwork = local.vpc_subnets_names[0] nic_type = var.nictype network_ip = local.private_passive_address } # HA Sync Network network_interface { subnetwork = google_compute_subnetwork.sync_subnet.name nic_type = var.nictype network_ip = var.passive_port3_ip } # Mgmt Network network_interface { subnetwork = google_compute_subnetwork.mgmt_subnet.name nic_type = var.nictype network_ip = var.passive_port4_ip } metadata = { user-data = templatefile("${path.module}/passive", { PROD_PUB_SNET_RANGE = local.prod_pub_snet_range PROD_APP_SNET_RANGE = local.prod_pub_snet_range PROD_DATA_SNET_RANGE = local.prod_data_snet_range NPROD_PUB_SNET_RANGE = local.nprod_pub_snet_range NPROD_APP_SNET_RANGE = local.nprod_app_snet_range NPROD_DATA_SNET_RANGE = local.nprod_data_snet_range DEV_PUB_SNET_RANGE = local.dev_pub_snet_range DEV_APP_SNET_RANGE = local.dev_app_snet_range DEV_DATA_SNET_RANGE = local.dev_data_snet_range MGMT_SNET_RANGE = local.mgmt_pri_snet_range IDEN_SNET_RANGE = local.iden_pri_snet_range FG_MGMT_SNET_RANGE = var.mgmt_subnet FG_PRIV_SNET_RANGE = local.vpc_primary_subnet FG_PUB_SNET_RANGE = var.public_subnet hub_base_subnet_for_route = var.hub_base_subnet_for_route hub_base_subnet_for_port2 = var.hub_base_subnet_for_port2 public_subnet_for_port1 = var.public_subnet_for_port1 passive_port1_ip = var.passive_port1_ip passive_port1_mask = var.passive_port1_mask # This overrides the port2 setting in vars.tf passive_port2_ip = local.private_passive_address passive_port2_mask = var.passive_port2_mask passive_port3_ip = var.passive_port3_ip passive_port3_mask = var.passive_port3_mask passive_port4_ip = var.passive_port4_ip passive_port4_mask = var.passive_port4_mask mgmt_gateway_ip = var.mgmt_gateway // mgmt gateway ip active_hb_ip = var.active_port3_ip // active hb ip hb_netmask = var.mgmt_mask // mgmt netmask port1_gateway = google_compute_subnetwork.public_subnet.gateway_address port2_gateway = local.private_network_gateway clusterip = "cluster-ip-${random_string.random_name_post.result}" internalroute = "internal-route-${random_string.random_name_post.result}" internal_loadbalancer_ip = google_compute_address.internal_address.address public_subnet = var.public_subnet private_subnet = local.vpc_primary_subnet # fgt_public_ip = "${google_compute_address.static.address}" primary_region_subnet = local.vpc_primary_subnet }) license = fileexists("${path.module}/${var.licenseFile2}") ? "${file(var.licenseFile2)}" : null block-project-ssh-keys = "TRUE" } service_account { scopes = ["userinfo-email", "compute-rw", "storage-ro", "cloud-platform"] } } # # FGT Active FGT # resource "google_compute_instance_from_template" "active_fgt_instance" { name = "firstfgt-${random_string.random_name_post.result}" zone = var.zone source_instance_template = google_compute_instance_template.active.self_link network_interface { subnetwork = google_compute_subnetwork.public_subnet.name nic_type = var.nictype network_ip = var.active_port1_ip } network_interface { subnetwork = local.vpc_subnets_names[local.primary_subnet_idx] nic_type = var.nictype network_ip = local.private_active_address } network_interface { subnetwork = google_compute_subnetwork.sync_subnet.name nic_type = var.nictype network_ip = var.active_port3_ip } network_interface { subnetwork = google_compute_subnetwork.mgmt_subnet.name nic_type = var.nictype network_ip = var.active_port4_ip # external IP address # access_config { # nat_ip = google_compute_address.static2.address #} } } # # FGT Passive FGT # resource "google_compute_instance_from_template" "passive_fgt_instance" { depends_on = [google_compute_instance_from_template.active_fgt_instance] name = "secondfgt-${random_string.random_name_post.result}" zone = var.zone source_instance_template = google_compute_instance_template.passive.self_link network_interface { subnetwork = google_compute_subnetwork.public_subnet.name nic_type = var.nictype network_ip = var.passive_port1_ip } network_interface { subnetwork = local.vpc_subnets_names[local.primary_subnet_idx] nic_type = var.nictype network_ip = local.private_passive_address } network_interface { subnetwork = google_compute_subnetwork.sync_subnet.name nic_type = var.nictype network_ip = var.passive_port3_ip } network_interface { subnetwork = google_compute_subnetwork.mgmt_subnet.name nic_type = var.nictype network_ip = var.passive_port4_ip # external ip address #access_config { #nat_ip = google_compute_address.static3.address #} } } ########################### # UnManaged Instance Group ########################### resource "google_compute_instance_group" "umig_active" { name = "unmanage-active-${random_string.random_name_post.result}" project = local.vpc_private_network_project_id zone = var.zone instances = matchkeys( google_compute_instance_from_template.active_fgt_instance.*.self_link, google_compute_instance_from_template.active_fgt_instance.*.zone, [var.zone], ) } resource "google_compute_instance_group" "umig_passive" { name = "unmanage-passive-${random_string.random_name_post.result}" project = local.vpc_private_network_project_id zone = var.zone instances = matchkeys( google_compute_instance_from_template.passive_fgt_instance.*.self_link, google_compute_instance_from_template.passive_fgt_instance.*.zone, [var.zone], ) }