network.tf (184 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.
*/
resource "google_compute_global_address" "default" {
name = var.random_suffix ? "global-crmint-default-${random_id.suffix.hex}" : "global-crmint-default"
description = "Managed by ${local.managed_by_desc}"
address_type = "EXTERNAL"
# Create a network only if the compute.googleapis.com API has been activated.
depends_on = [google_project_service.apis]
}
resource "google_compute_region_network_endpoint_group" "frontend_neg" {
name = var.random_suffix ? "frontend-neg-${random_id.suffix.hex}" : "frontend-neg"
description = "Managed by ${local.managed_by_desc}"
network_endpoint_type = "SERVERLESS"
region = var.region
cloud_run {
service = google_cloud_run_service.frontend_run.name
}
}
resource "google_compute_region_network_endpoint_group" "controller_neg" {
name = var.random_suffix ? "controller-neg-${random_id.suffix.hex}" : "controller-neg"
description = "Managed by ${local.managed_by_desc}"
network_endpoint_type = "SERVERLESS"
region = var.region
cloud_run {
service = google_cloud_run_service.controller_run.name
}
}
resource "google_compute_region_network_endpoint_group" "jobs_neg" {
name = var.random_suffix ? "jobs-neg-${random_id.suffix.hex}" : "jobs-neg"
description = "Managed by ${local.managed_by_desc}"
network_endpoint_type = "SERVERLESS"
region = var.region
cloud_run {
service = google_cloud_run_service.jobs_run.name
}
}
resource "google_compute_backend_service" "frontend_backend" {
name = var.random_suffix ? "crmint-frontend-backend-service-${random_id.suffix.hex}" : "crmint-frontend-backend-service"
description = "Managed by ${local.managed_by_desc}"
enable_cdn = false
connection_draining_timeout_sec = 10
backend {
group = google_compute_region_network_endpoint_group.frontend_neg.id
}
iap {
oauth2_client_id = google_iap_client.default.client_id
oauth2_client_secret = google_iap_client.default.secret
}
load_balancing_scheme = "EXTERNAL"
protocol = "HTTP"
}
resource "google_compute_backend_service" "controller_backend" {
name = var.random_suffix ? "crmint-controller-backend-service-${random_id.suffix.hex}" : "crmint-controller-backend-service"
description = "Managed by ${local.managed_by_desc}"
enable_cdn = false
connection_draining_timeout_sec = 10
backend {
group = google_compute_region_network_endpoint_group.controller_neg.id
}
iap {
oauth2_client_id = google_iap_client.default.client_id
oauth2_client_secret = google_iap_client.default.secret
}
load_balancing_scheme = "EXTERNAL"
protocol = "HTTP"
}
resource "google_compute_backend_service" "jobs_backend" {
name = var.random_suffix ? "crmint-jobs-backend-service-${random_id.suffix.hex}" : "crmint-jobs-backend-service"
description = "Managed by ${local.managed_by_desc}"
enable_cdn = false
connection_draining_timeout_sec = 10
backend {
group = google_compute_region_network_endpoint_group.jobs_neg.id
}
iap {
oauth2_client_id = google_iap_client.default.client_id
oauth2_client_secret = google_iap_client.default.secret
}
load_balancing_scheme = "EXTERNAL"
protocol = "HTTP"
}
resource "google_compute_url_map" "default" {
name = var.random_suffix ? "crmint-http-lb-${random_id.suffix.hex}" : "crmint-http-lb"
description = "Managed by ${local.managed_by_desc}"
default_service = google_compute_backend_service.frontend_backend.id
host_rule {
hosts = ["*"]
path_matcher = "allpaths"
}
path_matcher {
name = "allpaths"
default_service = google_compute_backend_service.frontend_backend.id
path_rule {
service = google_compute_backend_service.jobs_backend.id
paths = ["/api/workers", "/api/workers/*", "/push/start-task"]
}
path_rule {
service = google_compute_backend_service.controller_backend.id
paths = ["/api/*", "/push/task-finished", "/push/start-pipeline"]
}
}
}
resource "google_compute_target_https_proxy" "default" {
name = var.random_suffix ? "crmint-default-https-lb-proxy-${random_id.suffix.hex}" : "crmint-default-https-lb-proxy"
description = "Managed by ${local.managed_by_desc}"
url_map = google_compute_url_map.default.id
ssl_certificates = [
google_compute_managed_ssl_certificate.default.id,
]
}
resource "google_compute_global_forwarding_rule" "default" {
name = var.random_suffix ? "crmint-default-https-lb-forwarding-rule-${random_id.suffix.hex}" : "crmint-default-https-lb-forwarding-rule"
description = "Managed by ${local.managed_by_desc}"
ip_protocol = "TCP"
load_balancing_scheme = "EXTERNAL"
port_range = "443"
target = google_compute_target_https_proxy.default.id
ip_address = google_compute_global_address.default.id
}
##
# Virtual Private Cloud
resource "google_compute_network" "private" {
provider = google-beta
count = var.use_vpc ? 1 : 0
name = var.random_suffix ? "crmint-private-network-${random_id.suffix.hex}" : "crmint-private-network"
description = "Managed by ${local.managed_by_desc}"
project = var.network_project_id != null ? var.network_project_id : var.project_id
routing_mode = "REGIONAL"
mtu = 1460
auto_create_subnetworks = false # Custom Subnet Mode
# Create a network only if the compute.googleapis.com API has been activated.
depends_on = [google_project_service.apis]
}
resource "google_compute_global_address" "db_private_ip_address" {
provider = google-beta
count = var.use_vpc ? 1 : 0
name = var.random_suffix ? "crmint-db-private-ip-address-${random_id.suffix.hex}" : "crmint-db-private-ip-address"
description = "Managed by ${local.managed_by_desc}"
project = var.network_project_id != null ? var.network_project_id : var.project_id
purpose = "VPC_PEERING"
address_type = "INTERNAL"
address = "192.168.0.0"
prefix_length = 16
network = google_compute_network.private[count.index].id
}
resource "google_service_networking_connection" "private_vpc_connection" {
provider = google-beta
count = var.use_vpc ? 1 : 0
network = google_compute_network.private[count.index].id
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.db_private_ip_address[count.index].name]
}
resource "google_compute_subnetwork" "private" {
count = var.use_vpc ? 1 : 0
name = var.random_suffix ? "crmint-private-subnetwork-${random_id.suffix.hex}" : "crmint-private-subnetwork"
description = "Managed by ${local.managed_by_desc}"
ip_cidr_range = "10.8.0.0/28"
region = var.network_region != null ? var.network_region : var.region
network = google_compute_network.private[count.index].id
}
resource "google_vpc_access_connector" "connector" {
provider = google-beta
count = var.use_vpc ? 1 : 0
name = var.random_suffix ? "crmint-vpc-conn-${random_id.suffix.hex}" : "crmint-vpc-conn"
machine_type = "e2-micro"
max_instances = 3
min_instances = 2
project = var.network_project_id != null ? var.network_project_id : var.project_id
region = var.network_region != null ? var.network_region : var.region
subnet {
name = google_compute_subnetwork.private[count.index].name
project_id = var.network_project_id != null ? var.network_project_id : var.project_id
}
depends_on = [google_project_service.vpcaccess]
}