如何通过Terraform为GCP Pub/Sub触发的Cloud Function配置死信队列
实现方案
google_cloudfunctions_function 内置的event_trigger块不支持自定义死信策略,需手动创建带死信配置的Pub/Sub推送订阅,将订阅端点指向Cloud Function的调用地址即可实现需求。
完整实现步骤
- 步骤1:创建死信主题,用于接收处理失败的消息
- 步骤2:移除Cloud Function资源中原有的
event_trigger块,避免重复创建订阅 - 步骤3:创建带死信策略的Pub/Sub推送订阅,绑定Cloud Function的调用端点
- 步骤4:为Pub/Sub官方服务账号授予Cloud Function的调用权限,确保消息可以正常触发函数运行
完整Terraform配置示例
# 获取当前项目信息,用于填充Pub/Sub服务账号 data "google_project" "project" {} # 1. 创建死信主题 resource "google_pubsub_topic" "dlq_topic" { name = "brw-messages-dlq" } # 2. Cloud Function 配置,移除内置event_trigger块 resource "google_cloudfunctions_function" "brw-user-function-item-registered" { name = "brw-user-function-item-registered" runtime = "python311" # 替换为你的实际运行时版本 entry_point = "your_handler" # 替换为你的函数入口方法名 # 其他原有配置保持不变,比如代码包配置、环境变量、内存配置等 } # 3. 创建带死信策略的Pub/Sub推送订阅,绑定Cloud Function端点 resource "google_pubsub_subscription" "function_sub" { name = "brw-messages-function-sub" topic = "brw-messages" # 你的业务消息主题名 # 推送配置,端点为Cloud Function的调用地址 push_config { push_endpoint = google_cloudfunctions_function.brw-user-function-item-registered.https_trigger_url } # 死信策略配置 dead_letter_policy { dead_letter_topic = google_pubsub_topic.dlq_topic.id max_delivery_attempts = 5 # 最多重试次数,超过后投递到死信,GCP要求最小值为5 } # 其他配置按需调整 ack_deadline_seconds = 30 # 函数处理超时时间,建议和Cloud Function超时时间保持一致 message_retention_duration = "86400s" # 未确认消息留存最长时间 } # 4. 授予Pub/Sub服务账号调用Cloud Function的权限 resource "google_cloudfunctions_function_iam_binding" "invoker" { project = google_cloudfunctions_function.brw-user-function-item-registered.project region = google_cloudfunctions_function.brw-user-function-item-registered.region cloud_function = google_cloudfunctions_function.brw-user-function-item-registered.name role = "roles/cloudfunctions.invoker" members = [ "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com" ] }
注意事项
- 不要同时保留原Cloud Function中的
event_trigger块和手动创建的订阅,否则会导致同一条消息触发两次函数运行 - 若不需要重试直接投递死信,受GCP平台限制最小也要设置
max_delivery_attempts = 5 - 你可以为死信主题单独创建订阅,用于后续消费排查失败的消息
内容的提问来源于stack exchange,提问作者tmp dev
相关产品推荐
相关产品推荐

