reference-architectures/cloud_deploy_flow/main.tf (93 lines of code) (raw):

# Configure the Google Cloud provider terraform { required_providers { google = { source = "hashicorp/google" version = ">= 6.0" } } provider_meta "google" { module_name = "cloud-solutions/platform-engineering-cloud-deploy-pipeline-deploy-v1" } required_version = ">= 1.5.7" } # Ensure the project is created data "google_project" "project" { project_id = var.project_id } # Enable Services resource "google_project_service" "project" { for_each = toset(local.gcp_service_list) project = data.google_project.project.project_id service = each.key timeouts { create = "30m" update = "40m" } disable_on_destroy = false depends_on = [data.google_project.project] } # Create Pub/Sub topics using a for_each loop resource "google_pubsub_topic" "topics" { for_each = local.pubsub_config name = each.key project = data.google_project.project.project_id } # Create Pub/Sub subscriptions using a for_each loop, referencing the topics resource "google_pubsub_subscription" "subscriptions" { for_each = local.pubsub_config name = each.value topic = google_pubsub_topic.topics[each.key].id project = data.google_project.project.project_id } # Create a repo inside Artifact Registry to store container images resource "google_artifact_registry_repository" "random-date-app" { location = var.region repository_id = "random-date-app" description = "Docker repo for random-date-app" format = "DOCKER" } # Create a Cloud Run service (Random Date Service) resource "google_cloud_run_v2_service" "main" { name = "random-date-service" project = data.google_project.project.project_id location = var.region ingress = "INGRESS_TRAFFIC_ALL" deletion_protection = false template { containers { # We add a dummy image here to get the service created image = "us-docker.pkg.dev/cloudrun/container/hello" } } } //Create CloudBuild SA resource "google_service_account" "cloudbuild_service_account" { account_id = "cloudbuild-sa" display_name = "cloudbuild-sa" description = "Cloud build service account" } resource "google_project_iam_member" "act_as" { for_each = toset(local.sa_roles_list) project = data.google_project.project.project_id role = each.key member = "serviceAccount:${google_service_account.cloudbuild_service_account.email}" } # Data source to get the default compute engine service account data "google_compute_default_service_account" "default" { project = data.google_project.project.project_id } #This isn't perfect because you have to connect the repo first #Not sure how to do this in terraform yet TODO: @Ghaun # Create a Cloud Build trigger resource "google_cloudbuild_trigger" "build-cloudrun-deploy" { name = "random-date-build-trigger" location = "global" service_account = google_service_account.cloudbuild_service_account.id github { owner = var.github_owner name = var.github_repo push { branch = "main" } } filename = "CloudBuild/buildCloudRun.yaml" # Path to your Cloud Build configuration file substitutions = { "_DEPLOY_GCS" = google_storage_bucket.deploy_resources_bucket.url } depends_on = [google_project_iam_member.act_as] } resource "google_storage_bucket" "deploy_resources_bucket" { name = "${data.google_project.project.project_id}-deploy-resources-bucket" location = "US" uniform_bucket_level_access = true force_destroy = true }