From a34c4122657ae17465b90d8b5557b45d3a911670 Mon Sep 17 00:00:00 2001 From: 41w1 <111567743+Dawacode@users.noreply.github.com> Date: Sat, 10 Oct 2026 21:04:33 +0200 Subject: [PATCH] feat(infra): provision cloud run and artifact registry via terraform --- .gitignore | 14 +++++++++ terraform/.terraform.lock.hcl | 22 ++++++++++++++ terraform/main.tf | 57 +++++++++++++++++++++++++++++++++++ terraform/outputs.tf | 9 ++++++ terraform/variables.tf | 23 ++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 terraform/.terraform.lock.hcl create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/variables.tf diff --git a/.gitignore b/.gitignore index 6f596e1..061ac2a 100644 --- a/.gitignore +++ b/.gitignore @@ -218,3 +218,17 @@ __marimo__/ # Streamlit .streamlit/secrets.toml + +# Terraform +**/.terraform/* +*.tfstate +*.tfstate.* +crash.log +crash.*.log +*.tfvars +*.tfvars.json +override.tf +override.tf.json +*_override.tf +*_override.tf.json +!.terraform.lock.hcl \ No newline at end of file diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..3acc57c --- /dev/null +++ b/terraform/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/google" { + version = "5.45.2" + constraints = "~> 5.0" + hashes = [ + "h1:iy2Q9VcnMu4z/bH3v/NmI/nEpgYY7bXgJmT/hVTAUS4=", + "zh:0d09c8f20b556305192cdbe0efa6d333ceebba963a8ba91f9f1714b5a20c4b7a", + "zh:117143fc91be407874568df416b938a6896f94cb873f26bba279cedab646a804", + "zh:16ccf77d18dd2c5ef9c0625f9cf546ebdf3213c0a452f432204c69feed55081e", + "zh:3e555cf22a570a4bd247964671f421ed7517970cd9765ceb46f335edc2c6f392", + "zh:688bd5b05a75124da7ae6e885b2b92bd29f4261808b2b78bd5f51f525c1052ca", + "zh:6db3ef37a05010d82900bfffb3261c59a0c247e0692049cb3eb8c2ef16c9d7bf", + "zh:70316fde75f6a15d72749f66d994ccbdde5f5ed4311b6d06b99850f698c9bbf9", + "zh:84b8e583771a4f2bd514e519d98ed7fd28dce5efe0634e973170e1cfb5556fb4", + "zh:9d4b8ef0a9b6677935c604d94495042e68ff5489932cfd1ec41052e094a279d3", + "zh:a2089dd9bd825c107b148dd12d6b286f71aa37dfd4ca9c35157f2dcba7bc19d8", + "zh:f03d795c0fd9721e59839255ee7ba7414173017dc530b4ce566daf3802a0d6dd", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..830379b --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,57 @@ +terraform { + + required_version = ">= 1.5.0" + required_providers { + google={ + source = "hashicorp/google" + version = "~> 5.0" + } + } +} + +provider "google" { + project = var.project_id + region = var.region +} + +resource "google_artifact_registry_repository" "repo" { + location = var.region + repository_id = "devops-repo" + description = "Docker repository for DevOps application" + format = "DOCKER" +} + +resource "google_cloud_run_v2_service_iam_member" "public_access" { + + project = var.project_id + location = google_cloud_run_v2_service.app.location + name = google_cloud_run_v2_service.app.name + role = "roles/run.invoker" + member = "allUsers" + +} + + +resource "google_cloud_run_v2_service" "app" { + name = var.service_name + location = var.region + ingress = "INGRESS_TRAFFIC_ALL" + + template { + containers { + image = var.image + + ports { + container_port = 8000 + } + + + resources { + limits = { + cpu = "1" + memory = "512Mi" + } + } + } + } +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..f21c9a0 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,9 @@ +output "service_url" { + description = "Public URL of the deployed Cloud Run service" + value = google_cloud_run_v2_service.app.uri +} + +output "artifact_registry_repo" { + description = "Artifact Registry Docker repository URL" + value = "${var.region}-docker.pkg.dev/${var.project_id}/${google_artifact_registry_repository.repo.repository_id}" +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..8d123fe --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,23 @@ +variable "project_id" { + description = "The Google Cloud project ID" + type = string + default = "project-452e74c0-919a-47bd-903" +} + +variable "region" { + description = "GCP region for resources" + type = string + default = "europe-north1" # Stockholm region +} + +variable "service_name" { + description = "Name of the Cloud Run service" + type = string + default = "devops-app" +} + +variable "image" { + description = "Container image to deploy initially" + type = string + default = "europe-north1-docker.pkg.dev/project-452e74c0-919a-47bd-903/devops-repo/app:v1" +} \ No newline at end of file