3-ilb-keepalived/main.tf (191 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.
*/
provider "google" {
project = var.project_id
region = var.region
zone = var.zone
}
locals {
image = "debian-cloud/debian-11"
machine_type = "e2-small"
}
resource "google_project_service" "required_api" {
for_each = toset(["compute.googleapis.com", "cloudresourcemanager.googleapis.com"])
service = each.key
disable_on_destroy = false
}
resource "google_compute_network" "failover_vpc" {
depends_on = [google_project_service.required_api]
name = "ip-failover"
auto_create_subnetworks = false
}
resource "google_compute_subnetwork" "failover_subnet" {
name = "ip-failover-subnet"
ip_cidr_range = var.subnet_range
network = google_compute_network.failover_vpc.id
}
resource "google_compute_firewall" "failover_firewall_http" {
name = "failover-ilb-http-traffic"
allow {
protocol = "tcp"
ports = [80]
}
network = google_compute_network.failover_vpc.id
source_tags = ["client"]
target_tags = ["backend"]
}
resource "google_compute_firewall" "failover_firewall_ssh_iap" {
name = "failover-ssh-iap"
allow {
protocol = "tcp"
ports = ["22"]
}
network = google_compute_network.failover_vpc.id
#IP range used by Identity-Aware-Proxy
#See https://cloud.google.com/iap/docs/using-tcp-forwarding#create-firewall-rule
source_ranges = ["35.235.240.0/20"]
}
resource "google_compute_firewall" "failover_firewall_hc" {
name = "failover-hc"
allow {
protocol = "tcp"
ports = [var.health_check_port]
}
network = google_compute_network.failover_vpc.id
#IP ranges used for health checks
#See https://cloud.google.com/load-balancing/docs/health-check-concepts#ip-ranges
source_ranges = ["35.191.0.0/16", "130.211.0.0/22"]
}
resource "google_compute_firewall" "failover_firewall_vrrp" {
name = "failover-vrrp"
allow {
#112 is VRRP IP protocol number required for keepalived communication
protocol = "112"
}
network = google_compute_network.failover_vpc.id
source_tags = ["backend"]
target_tags = ["backend"]
}
resource "google_compute_instance_template" "nginx_primary_instance_template" {
name_prefix = "nginx-primary-"
machine_type = local.machine_type
disk {
source_image = local.image
auto_delete = true
boot = true
}
metadata_startup_script = templatefile("startup-script.tmpl", {
server_number = 1
health_check_port = var.health_check_port
ip = var.primary_ip
peer_ip = var.secondary_ip
state = "MASTER"
priority = 100
vrrp_password = var.vrrp_password
})
tags = ["backend"]
network_interface {
subnetwork = google_compute_subnetwork.failover_subnet.id
network_ip = var.primary_ip
access_config {}
}
lifecycle {
create_before_destroy = true
}
}
resource "google_compute_instance_template" "nginx_secondary_instance_template" {
name_prefix = "nginx-secondary-"
machine_type = local.machine_type
disk {
source_image = local.image
auto_delete = true
boot = true
}
metadata_startup_script = templatefile("startup-script.tmpl", {
server_number = 2
health_check_port = var.health_check_port
ip = var.secondary_ip
peer_ip = var.primary_ip
state = "BACKUP"
priority = 50
vrrp_password = var.vrrp_password
})
tags = ["backend"]
network_interface {
subnetwork = google_compute_subnetwork.failover_subnet.id
network_ip = var.secondary_ip
access_config {}
}
lifecycle {
create_before_destroy = true
}
}
resource "google_compute_instance_group_manager" "nginx_instance_group_primary" {
name = "nginx-primary"
base_instance_name = "nginx-primary"
target_size = 1
version {
instance_template = google_compute_instance_template.nginx_primary_instance_template.id
}
}
resource "google_compute_instance_group_manager" "nginx_instance_group_secondary" {
name = "nginx-secondary"
base_instance_name = "nginx-secondary"
target_size = 1
version {
instance_template = google_compute_instance_template.nginx_secondary_instance_template.id
}
}
resource "google_compute_health_check" "tcp_health_check" {
depends_on = [google_project_service.required_api]
name = "tcp-health-check"
tcp_health_check {
port = var.health_check_port
}
}
resource "google_compute_region_backend_service" "www_bes" {
name = "nginx-bes"
load_balancing_scheme = "INTERNAL"
backend {
group = google_compute_instance_group_manager.nginx_instance_group_primary.instance_group
description = "primary MIG"
failover = false
}
backend {
group = google_compute_instance_group_manager.nginx_instance_group_secondary.instance_group
description = "secondary MIG"
failover = true
}
health_checks = [google_compute_health_check.tcp_health_check.id]
protocol = "TCP"
}
resource "google_compute_forwarding_rule" "www_rule" {
name = "nginx-lb"
ports = [80]
load_balancing_scheme = "INTERNAL"
backend_service = google_compute_region_backend_service.www_bes.id
network = google_compute_network.failover_vpc.id
subnetwork = google_compute_subnetwork.failover_subnet.id
ip_address = var.floating_ip
}
resource "google_compute_instance" "client-vm" {
name = "client"
machine_type = local.machine_type
tags = ["client"]
boot_disk {
initialize_params {
image = local.image
}
}
network_interface {
subnetwork = google_compute_subnetwork.failover_subnet.name
}
}