107 lines
3.1 KiB
HCL
107 lines
3.1 KiB
HCL
locals {
|
|
common_labels = merge({ managed_by = "terraform", workload = var.name }, var.labels)
|
|
services = toset([
|
|
"run.googleapis.com", "pubsub.googleapis.com", "storage.googleapis.com",
|
|
"firestore.googleapis.com", "artifactregistry.googleapis.com",
|
|
"logging.googleapis.com", "monitoring.googleapis.com", "vpcaccess.googleapis.com"
|
|
])
|
|
}
|
|
|
|
resource "google_project_service" "apis" {
|
|
for_each = local.services
|
|
project = var.project_id
|
|
service = each.value
|
|
disable_on_destroy = false
|
|
}
|
|
|
|
resource "google_compute_network" "app" {
|
|
name = "${var.name}-vpc"
|
|
auto_create_subnetworks = false
|
|
depends_on = [google_project_service.apis]
|
|
}
|
|
|
|
resource "google_compute_subnetwork" "app" {
|
|
name = "${var.name}-subnet"
|
|
ip_cidr_range = "10.10.0.0/24"
|
|
region = var.region
|
|
network = google_compute_network.app.id
|
|
}
|
|
|
|
resource "google_vpc_access_connector" "app" {
|
|
name = substr("${var.name}-connector", 0, 24)
|
|
region = var.region
|
|
network = google_compute_network.app.name
|
|
ip_cidr_range = "10.8.0.0/28"
|
|
depends_on = [google_project_service.apis]
|
|
}
|
|
|
|
resource "google_service_account" "runtime" {
|
|
account_id = substr("${var.name}-runtime", 0, 30)
|
|
display_name = "${var.name} runtime identity"
|
|
}
|
|
|
|
resource "google_storage_bucket" "objects" {
|
|
name = "${var.project_id}-${var.name}-objects"
|
|
location = var.region
|
|
uniform_bucket_level_access = true
|
|
public_access_prevention = "enforced"
|
|
labels = local.common_labels
|
|
lifecycle_rule {
|
|
condition { age = 365 }
|
|
action { type = "Delete" }
|
|
}
|
|
depends_on = [google_project_service.apis]
|
|
}
|
|
|
|
resource "google_firestore_database" "app" {
|
|
project = var.project_id
|
|
name = "(default)"
|
|
location_id = var.region
|
|
type = "FIRESTORE_NATIVE"
|
|
}
|
|
|
|
resource "google_pubsub_topic" "events" {
|
|
name = "${var.name}-events"
|
|
labels = local.common_labels
|
|
}
|
|
|
|
resource "google_pubsub_topic" "dead_letter" {
|
|
name = "${var.name}-events-dead-letter"
|
|
labels = local.common_labels
|
|
}
|
|
|
|
resource "google_artifact_registry_repository" "containers" {
|
|
location = var.region
|
|
repository_id = var.name
|
|
format = "DOCKER"
|
|
labels = local.common_labels
|
|
}
|
|
|
|
resource "google_cloud_run_v2_service" "app" {
|
|
name = var.name
|
|
location = var.region
|
|
ingress = "INGRESS_TRAFFIC_ALL"
|
|
labels = local.common_labels
|
|
template {
|
|
service_account = google_service_account.runtime.email
|
|
scaling { max_instance_count = 20 }
|
|
vpc_access {
|
|
connector = google_vpc_access_connector.app.id
|
|
egress = "PRIVATE_RANGES_ONLY"
|
|
}
|
|
containers {
|
|
image = var.container_image
|
|
ports { container_port = 8080 }
|
|
resources { limits = { cpu = "1", memory = "512Mi" } }
|
|
}
|
|
}
|
|
depends_on = [google_project_service.apis]
|
|
}
|
|
|
|
resource "google_cloud_run_v2_service_iam_member" "public_invoker" {
|
|
name = google_cloud_run_v2_service.app.name
|
|
location = var.region
|
|
role = "roles/run.invoker"
|
|
member = "allUsers"
|
|
}
|