tools/terraform/networking.tf (198 lines of code) (raw):
// Copyright 2022 Google Inc. All Rights Reserved.
//
// 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 {
managed_domains = var.domain_alias_flag ? [
"www.${var.domain}",
"global.${var.domain}",
"${var.domain}",
"www.${var.domain_alias}",
"${var.domain_alias}",
] : [
"www.${var.domain}",
"global.${var.domain}",
"${var.domain}",
]
}
// Enable Compute Engine API.
resource "google_project_service" "compute" {
service = "compute.googleapis.com"
}
// Reserve a global static IP address.
resource "google_compute_global_address" "global" {
name = "address"
depends_on = [
google_project_service.compute
]
}
resource "google_compute_global_forwarding_rule" "global" {
name = "global"
target = google_compute_target_https_proxy.global.id
port_range = "443"
ip_address = google_compute_global_address.global.address
depends_on = [
google_project_service.compute
]
}
resource "google_compute_target_https_proxy" "global" {
provider = google-beta
name = "global"
url_map = google_compute_url_map.global.id
ssl_certificates = [google_compute_managed_ssl_certificate.global.id]
}
resource "google_compute_url_map" "global" {
provider = google-beta
name = "global"
description = "a description"
default_service = google_compute_backend_service.global.id
// Create a host rule to match traffic to alias (gcpping.com)
host_rule {
hosts = ["*"]
path_matcher = "endpoints-config-bucket"
}
dynamic "host_rule" {
for_each = var.domain_alias_flag ? [1] : []
content {
hosts = [
var.domain_alias,
"*.${var.domain_alias}",
]
path_matcher = "alt-redirect"
}
}
path_matcher {
name = "endpoints-config-bucket"
default_service = google_compute_backend_service.global.self_link
path_rule {
paths = ["/api/endpoints"]
service = google_compute_backend_bucket.endpoints_backend.id
}
}
// 301 redirect traffic from gcpping.com to gcping.com
dynamic "path_matcher" {
for_each = var.domain_alias_flag ? [1] : []
content {
name = "alt-redirect"
default_url_redirect {
host_redirect = var.domain
https_redirect = false
redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
strip_query = false
}
}
}
test {
service = google_compute_backend_bucket.endpoints_backend.id
host = var.domain
path = "/api/endpoints"
}
test {
service = google_compute_backend_bucket.endpoints_backend.id
host = "www.${var.domain}"
path = "/api/endpoints"
}
test {
service = google_compute_backend_bucket.endpoints_backend.id
host = "global.${var.domain}"
path = "/api/endpoints"
}
test {
service = google_compute_backend_service.global.id
host = var.domain
path = "/api/ping"
}
test {
service = google_compute_backend_service.global.id
host = "www.${var.domain}"
path = "/api/ping"
}
test {
service = google_compute_backend_service.global.id
host = "global.${var.domain}"
path = "/api/ping"
}
test {
service = google_compute_backend_service.global.id
host = var.domain
path = ""
}
test {
service = google_compute_backend_service.global.id
host = "www.${var.domain}"
path = ""
}
test {
service = google_compute_backend_service.global.id
host = "global.${var.domain}"
path = ""
}
depends_on = [
google_project_service.compute
]
}
// Create a global backend service with a backend for each regional NEG.
resource "google_compute_backend_service" "global" {
name = "global"
enable_cdn = true
// Add a backend for each regional NEG.
dynamic "backend" {
for_each = google_compute_region_network_endpoint_group.regions
content {
group = backend.value["id"]
}
}
}
// Create an HTTP->HTTPS upgrade rule.
resource "google_compute_url_map" "https_redirect" {
name = "https-redirect"
default_url_redirect {
https_redirect = true
redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
strip_query = false
}
depends_on = [
google_project_service.compute
]
}
resource "google_compute_target_http_proxy" "https_redirect" {
name = "https-redirect"
url_map = google_compute_url_map.https_redirect.id
}
resource "google_compute_global_forwarding_rule" "https_redirect" {
name = "https-redirect"
target = google_compute_target_http_proxy.https_redirect.id
port_range = "80"
ip_address = google_compute_global_address.global.address
}
// create a reandom id for the SSL cert
resource "random_id" "certificate" {
byte_length = 2
prefix = "global-"
keepers = {
domains = join(",", local.managed_domains)
}
}
// create a managed SSL cert
resource "google_compute_managed_ssl_certificate" "global" {
provider = google-beta
name = random_id.certificate.hex
managed {
domains = local.managed_domains
}
lifecycle {
create_before_destroy = true
}
depends_on = [
google_project_service.compute
]
}