Eventarc:事件路由与排障
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本页覆盖 Eventarc Standard → Cloud Run。
推荐做法#
- 先确认 Provider、event type、Region 与 filter,再建 Trigger。
相同 CloudEvent 外层格式不代表相同业务 payload。 本例
/push读取 Pub/Sub 的message.data;Storage 对象事件需要按 Bucket/object 字段另写处理逻辑。
- Trigger 调用身份与应用 runtime SA 分开;消费端按业务键去重。
常用操作#
替换为实际资源;本段不依赖 lab.env。
PROJECT_ID='REPLACE_PROJECT_ID'
REGION='REPLACE_REGION'
TRIGGER='REPLACE_TRIGGER'
gcloud eventarc triggers describe "$TRIGGER" \
--project="$PROJECT_ID" --location="$REGION"容易踩的坑#
- Trigger 存在不代表投递成功:检查 conditions、目标 Invoker、日志及业务结果。
- 不要手改 Eventarc 管理的底层 Subscription;删除后检查残留专用资源。
Scheduler / Tasks / Pub/Sub 如何选择
配置说明与完整示例(按需展开)
Eventarc Standard 将受支持的事件以 CloudEvents 格式路由到目标。本篇验证 Pub/Sub → Eventarc → Cloud Run 的一条链路。
Scheduler、Tasks、Pub/Sub、Eventarc 怎么选#
| 主要需求 | 选择 | 关键配置 |
|---|---|---|
| 到指定时间触发 | Cloud Scheduler | schedule、时区、target 身份 |
| 指定 HTTP 目标、限制派发速率和并发 | Cloud Tasks | Queue、目标 URL、retry、业务幂等 |
| 一个事件由多个独立系统消费 | Pub/Sub | Topic、各自 Subscription、ACK |
| 把支持的事件来源按条件路由到服务 | Eventarc | Provider、event type、filter、destination |
这些服务可以组合。触发/投递成功只证明目标接受请求,最终业务完成需查业务状态。Tasks 与 Pub/Sub 选择
创建 Trigger#
前置:综合项目的 orders-worker。此实验创建独立 topic,不与现有 orders-created push 订阅重复消费。Worker 的 /push 可读取本例 Pub/Sub CloudEvent 中的 message.data,但不能原样处理 Storage 的事件数据。
source lab.env
gcloud services enable eventarc.googleapis.com pubsub.googleapis.com run.googleapis.com
export EVENT_SA="lab-eventarc@$PROJECT_ID.iam.gserviceaccount.com"
export PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" --format='value(projectNumber)')
export HUMAN_EMAIL=$(gcloud config get-value account)
gcloud iam service-accounts create lab-eventarc
gcloud iam service-accounts add-iam-policy-binding "$EVENT_SA" --member="user:$HUMAN_EMAIL" --role=roles/iam.serviceAccountUser
gcloud run services add-iam-policy-binding orders-worker --region="$REGION" --member="serviceAccount:$EVENT_SA" --role=roles/run.invoker
gcloud beta services identity create --service=pubsub.googleapis.com --project="$PROJECT_ID"
gcloud iam service-accounts add-iam-policy-binding "$EVENT_SA" --member="serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com" --role=roles/iam.serviceAccountTokenCreator
gcloud pubsub topics create lab-eventarc-orders
gcloud eventarc triggers create lab-orders \
--location="$REGION" \
--destination-run-service=orders-worker \
--destination-run-region="$REGION" \
--destination-run-path=/push \
--event-filters=type=google.cloud.pubsub.topic.v1.messagePublished \
--transport-topic="projects/$PROJECT_ID/topics/lab-eventarc-orders" \
--service-account="$EVENT_SA"首次启用可能要等待 Eventarc service agent 初始化;操作者需要 Eventarc Admin 和指定 SA 的 actAs。此 Pub/Sub 直接事件不需要额外给触发身份 Eventarc Event Receiver;其他 provider 按其文档配置。官方教程
发布与验收#
export EVENT_ORDER_ID=$(python3 -c 'import uuid; print(uuid.uuid4())')
export EVENT_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
gcloud pubsub topics publish lab-eventarc-orders --message="{\"id\":\"$EVENT_ORDER_ID\",\"amount\":500,\"created_at\":\"$EVENT_TIME\"}"
gcloud eventarc triggers describe lab-orders --location="$REGION"
gcloud logging read 'resource.type="cloud_run_revision" AND jsonPayload.order_id="'"$EVENT_ORDER_ID"'"' --freshness=1h --limit=10验收:worker 日志出现 completed,订单桶出现该 ID;重发相同消息不会重复落库。401/403 先查目标 Run Invoker、生成 token 的 service agent 和 audience;没有投递先查 trigger 状态、topic 与地域。
清理#
gcloud eventarc triggers delete lab-orders --location="$REGION"
gcloud pubsub topics delete lab-eventarc-orders
gcloud run services remove-iam-policy-binding orders-worker --region="$REGION" --member="serviceAccount:$EVENT_SA" --role=roles/run.invoker
gcloud iam service-accounts delete "$EVENT_SA"不手工修改 Eventarc 管理的底层订阅;在删除 trigger 后检查是否残留专用传输资源。