2025-05-24 14:26:09 +02:00

104 lines
2.9 KiB
HCL

# 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
}