128 lines
3.6 KiB
HCL
128 lines
3.6 KiB
HCL
terraform {
|
|
required_version = ">= 1.6.0"
|
|
required_providers {
|
|
google = {
|
|
source = "hashicorp/google"
|
|
version = "~> 6.0"
|
|
}
|
|
}
|
|
}
|
|
|
|
provider "google" {
|
|
project = var.project_id
|
|
region = var.region
|
|
}
|
|
|
|
resource "google_project_service" "required" {
|
|
for_each = toset([
|
|
"run.googleapis.com",
|
|
"pubsub.googleapis.com",
|
|
"sqladmin.googleapis.com",
|
|
"secretmanager.googleapis.com",
|
|
"artifactregistry.googleapis.com",
|
|
"vpcaccess.googleapis.com",
|
|
])
|
|
project = var.project_id
|
|
service = each.value
|
|
disable_on_destroy = false
|
|
}
|
|
|
|
resource "google_compute_network" "app" {
|
|
name = "${var.name}-network"
|
|
auto_create_subnetworks = false
|
|
}
|
|
|
|
resource "google_vpc_access_connector" "app" {
|
|
name = "${var.name}-vpc"
|
|
region = var.region
|
|
network = google_compute_network.app.name
|
|
ip_cidr_range = var.connector_cidr
|
|
depends_on = [google_project_service.required]
|
|
}
|
|
|
|
resource "google_sql_database_instance" "orders" {
|
|
name = "${var.name}-postgres"
|
|
database_version = "POSTGRES_15"
|
|
region = var.region
|
|
settings {
|
|
tier = var.sql_tier
|
|
availability_type = "ZONAL"
|
|
ip_configuration { ipv4_enabled = false }
|
|
backup_configuration { enabled = true }
|
|
}
|
|
deletion_protection = false
|
|
depends_on = [google_project_service.required]
|
|
}
|
|
|
|
resource "google_sql_database" "orders" {
|
|
name = "orders"
|
|
instance = google_sql_database_instance.orders.name
|
|
}
|
|
|
|
resource "google_sql_user" "orders" {
|
|
name = var.db_user
|
|
instance = google_sql_database_instance.orders.name
|
|
password = var.db_password
|
|
}
|
|
|
|
resource "google_pubsub_topic" "orders" {
|
|
name = "${var.name}-orders"
|
|
}
|
|
|
|
resource "google_pubsub_topic" "dead_letter" {
|
|
name = "${var.name}-orders-dead-letter"
|
|
}
|
|
|
|
resource "google_pubsub_subscription" "worker" {
|
|
name = "${var.name}-worker"
|
|
topic = google_pubsub_topic.orders.name
|
|
dead_letter_policy { dead_letter_topic = google_pubsub_topic.dead_letter.id max_delivery_attempts = 5 }
|
|
ack_deadline_seconds = 60
|
|
}
|
|
|
|
resource "google_service_account" "runtime" {
|
|
account_id = "${var.name}-runtime"
|
|
display_name = "Order service runtime identity"
|
|
}
|
|
|
|
resource "google_project_iam_member" "publisher" {
|
|
project = var.project_id
|
|
role = "roles/pubsub.publisher"
|
|
member = "serviceAccount:${google_service_account.runtime.email}"
|
|
}
|
|
|
|
resource "google_secret_manager_secret" "db_password" {
|
|
secret_id = "${var.name}-db-password"
|
|
replication { auto {} }
|
|
}
|
|
|
|
resource "google_secret_manager_secret_version" "db_password" {
|
|
secret = google_secret_manager_secret.db_password.id
|
|
secret_data = var.db_password
|
|
}
|
|
|
|
resource "google_cloud_run_v2_service" "api" {
|
|
name = "${var.name}-api"
|
|
location = var.region
|
|
ingress = "INGRESS_TRAFFIC_ALL"
|
|
template {
|
|
service_account = google_service_account.runtime.email
|
|
scaling { max_instance_count = var.api_max_instances }
|
|
vpc_access { connector = google_vpc_access_connector.app.id egress = "PRIVATE_RANGES_ONLY" }
|
|
containers { image = var.api_image env { name = "ORDERS_TOPIC" value = google_pubsub_topic.orders.id } }
|
|
}
|
|
depends_on = [google_project_service.required]
|
|
}
|
|
|
|
resource "google_cloud_run_v2_service" "worker" {
|
|
name = "${var.name}-worker"
|
|
location = var.region
|
|
template {
|
|
service_account = google_service_account.runtime.email
|
|
scaling { max_instance_count = var.worker_max_instances }
|
|
vpc_access { connector = google_vpc_access_connector.app.id egress = "PRIVATE_RANGES_ONLY" }
|
|
containers { image = var.worker_image }
|
|
}
|
|
depends_on = [google_project_service.required]
|
|
}
|