FAQ | This is a LIVE service | Changelog

Skip to content
Snippets Groups Projects
static_egress_ip.tf 2.21 KiB
Newer Older
Monty Dawson's avatar
Monty Dawson committed
# Create a subnet, vpc access connector, router and nat to allow a cloud run instance
# to be assigned a static ip.
# The VPC connector is assigned to the cloud run's annotations.
# This follows the steps detailed here: https://cloud.google.com/run/docs/configuring/static-outbound-ip

resource "google_compute_subnetwork" "isolated-subnet" {
  count         = var.enable_static_egress_ip ? 1 : 0
  name          = "${var.name}-isolated-subnet-for-static-ip"
  ip_cidr_range = var.static_egress_ip_cidr_range
  network       = "default"
  region        = var.cloud_run_region
}

resource "google_vpc_access_connector" "static-ip-connector" {
  count = var.enable_static_egress_ip ? 1 : 0
  name  = "${var.name}-connector"
  subnet {
    name = google_compute_subnetwork.isolated-subnet[0].name
  }
  region = var.cloud_run_region

  lifecycle {
    ignore_changes = [
      network,
    ]
  }

Monty Dawson's avatar
Monty Dawson committed
  provider = google-beta
}

resource "google_compute_router" "static-ip-router" {
  count   = var.enable_static_egress_ip ? 1 : 0
  name    = "${var.name}-ip-router"
  network = "default"
  region  = var.cloud_run_region
}

resource "google_compute_address" "static-ip" {
  count  = var.enable_static_egress_ip ? 1 : 0
  name   = "${var.name}-static-ip"
  region = var.cloud_run_region

  # We do not expect that static IPs should be regularly removed and recreated,
  # as it's likely that they will be used within firewall configuration outside
  # of our GCP deployment. So we make them difficult to destroy, guarding against
  # an accidentally removal.
  lifecycle {
    prevent_destroy = true
  }
Monty Dawson's avatar
Monty Dawson committed
}

resource "google_compute_router_nat" "static-ip-nat" {
  count                  = var.enable_static_egress_ip ? 1 : 0
  name                   = "${var.name}-static-ip-nat"
  router                 = google_compute_router.static-ip-router[0].name
  nat_ips                = [google_compute_address.static-ip[0].self_link]
  nat_ip_allocate_option = "MANUAL_ONLY"
  region                 = var.cloud_run_region
  min_ports_per_vm       = var.min_ports_per_vm
Monty Dawson's avatar
Monty Dawson committed

  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
  subnetwork {
    name                    = google_compute_subnetwork.isolated-subnet[0].id
    source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
  }
}