Files
gcp_solution_architecture_a…/terraform/main.tf
2026-09-01 19:58:42 +00:00

111 lines
3.2 KiB
HCL

terraform {
required_version = ">= 1.6.0, < 2.0.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
}
}
provider "google" {
project = var.project_id
region = var.region
}
resource "google_project_service" "services" {
for_each = toset([
"run.googleapis.com", "sqladmin.googleapis.com", "pubsub.googleapis.com",
"artifactregistry.googleapis.com", "secretmanager.googleapis.com",
"logging.googleapis.com", "monitoring.googleapis.com", "cloudtrace.googleapis.com"
])
project = var.project_id
service = each.value
disable_on_destroy = false
}
resource "google_artifact_registry_repository" "images" {
location = var.region
repository_id = "${var.name}-images"
format = "DOCKER"
depends_on = [google_project_service.services]
}
resource "google_sql_database_instance" "primary" {
name = "${var.name}-sql"
database_version = "POSTGRES_15"
region = var.region
settings {
tier = var.sql_tier
availability_type = var.sql_ha ? "REGIONAL" : "ZONAL"
disk_type = "PD_SSD"
disk_autoresize = true
backup_configuration { enabled = true }
ip_configuration { ipv4_enabled = true }
}
deletion_protection = var.deletion_protection
depends_on = [google_project_service.services]
}
resource "google_sql_database" "app" {
name = var.name
instance = google_sql_database_instance.primary.name
}
resource "google_pubsub_topic" "events" { name = "${var.name}-events" }
resource "google_pubsub_topic" "dead_letter" { name = "${var.name}-dead-letter" }
resource "google_pubsub_subscription" "worker" {
name = "${var.name}-worker"
topic = google_pubsub_topic.events.name
dead_letter_policy {
dead_letter_topic = google_pubsub_topic.dead_letter.id
max_delivery_attempts = 10
}
ack_deadline_seconds = 30
}
resource "google_secret_manager_secret" "database_url" {
secret_id = "${var.name}-database-url"
replication { auto {} }
depends_on = [google_project_service.services]
}
resource "google_service_account" "runtime" {
account_id = "${var.name}-runtime"
display_name = "${var.name} runtime identity"
}
resource "google_project_iam_member" "runtime_log_writer" {
project = var.project_id
role = "roles/logging.logWriter"
member = "serviceAccount:${google_service_account.runtime.email}"
}
resource "google_cloud_run_v2_service" "api" {
name = "${var.name}-api"
location = var.region
template {
service_account = google_service_account.runtime.email
containers {
image = var.api_image
env { name = "PUBSUB_TOPIC" value = google_pubsub_topic.events.name }
env { name = "DATABASE_SECRET" value = google_secret_manager_secret.database_url.secret_id }
}
}
depends_on = [google_project_service.services]
}
resource "google_cloud_run_v2_service" "worker" {
name = "${var.name}-worker"
location = var.region
template {
service_account = google_service_account.runtime.email
containers {
image = var.worker_image
env { name = "DATABASE_SECRET" value = google_secret_manager_secret.database_url.secret_id }
}
}
depends_on = [google_project_service.services]
}