# Compute default service accounts locals { cloud_run_service_account = var.cloud_run_service_account != "" ? var.cloud_run_service_account : "${data.google_project.current.number}-compute@developer.gserviceaccount.com" cloud_function_service_account = var.cloud_function_service_account != "" ? var.cloud_function_service_account : "${data.google_project.current.number}-compute@developer.gserviceaccount.com" } # Pub/Sub topic for image processing tasks resource "google_pubsub_topic" "image_processing" { name = var.pubsub_topic_name labels = { environment = var.environment service = "sereact" component = "image-processing" } } # Dead letter queue for failed messages resource "google_pubsub_topic" "image_processing_dlq" { name = "${var.pubsub_topic_name}-dlq" labels = { environment = var.environment service = "sereact" component = "image-processing-dlq" } } # Dead letter subscription for monitoring failed messages resource "google_pubsub_subscription" "image_processing_dlq" { name = "${var.pubsub_topic_name}-dlq-subscription" topic = google_pubsub_topic.image_processing_dlq.name # Long retention for failed messages message_retention_duration = "2592000s" # 30 days retain_acked_messages = true labels = { environment = var.environment service = "sereact" component = "image-processing-dlq" } } # IAM binding for Cloud Run to publish to topic resource "google_pubsub_topic_iam_binding" "image_processing_publisher" { topic = google_pubsub_topic.image_processing.name role = "roles/pubsub.publisher" members = [ "serviceAccount:${local.cloud_run_service_account}", ] } # Output the topic and subscription names output "pubsub_topic_name" { description = "Name of the Pub/Sub topic for image processing" value = google_pubsub_topic.image_processing.name } output "pubsub_dlq_topic_name" { description = "Name of the dead letter queue topic" value = google_pubsub_topic.image_processing_dlq.name }