# 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" } } # Pub/Sub subscription with retry policy resource "google_pubsub_subscription" "image_processing" { name = "${var.pubsub_topic_name}-subscription" topic = google_pubsub_topic.image_processing.name # Retry policy configuration retry_policy { minimum_backoff = "10s" maximum_backoff = "600s" } # Dead letter policy after 3 failed attempts dead_letter_policy { dead_letter_topic = google_pubsub_topic.image_processing_dlq.id max_delivery_attempts = 3 } # Message retention message_retention_duration = "604800s" # 7 days retain_acked_messages = false # Acknowledgment deadline ack_deadline_seconds = 600 # 10 minutes 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 Function 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:${var.cloud_run_service_account}", ] } # IAM binding for Cloud Function to subscribe resource "google_pubsub_subscription_iam_binding" "image_processing_subscriber" { subscription = google_pubsub_subscription.image_processing.name role = "roles/pubsub.subscriber" members = [ "serviceAccount:${var.cloud_function_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_subscription_name" { description = "Name of the Pub/Sub subscription for image processing" value = google_pubsub_subscription.image_processing.name } output "pubsub_dlq_topic_name" { description = "Name of the dead letter queue topic" value = google_pubsub_topic.image_processing_dlq.name }