Cloud Scheduler:定时调用与认证

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

定时触发 HTTP 或 Pub/Sub;Console:Cloud Scheduler。

推荐做法#

  • 显式指定 schedule 与时区;下游处理幂等,预留重试行为。
  • Cloud Run HTTP target 用 OIDC;调用 Google 管理 API 时核对是否需 OAuth。
  • 单独配置调用 SA;检查 Job 执行日志和实际业务结果。

常用操作#

替换为实际资源;本段不依赖 lab.env。

PROJECT_ID='REPLACE_PROJECT_ID'
REGION='REPLACE_REGION'
JOB='REPLACE_JOB'

gcloud scheduler jobs describe "$JOB" \
  --project="$PROJECT_ID" --location="$REGION"
# 立即触发一次,会调用实际目标。
gcloud scheduler jobs run "$JOB" \
  --project="$PROJECT_ID" --location="$REGION"

容易踩的坑#

Scheduler 可能重复触发;HTTP 成功不代表异步业务已完成。 处理器按业务 ID 幂等,并记录实际完成状态,不能只看调度执行成功。

  • Scheduler service agent 与目标调用 SA 分开;IAP 浏览器登录不能替代机器调用。
配置说明与完整示例(按需展开)

对应 EventBridge Scheduler 的部分用途。Scheduler 决定“何时调用”;Pub/Sub 负责广播事件,Cloud Tasks 负责受控派发任务,三者不要混用。

前置:Cloud Run的 lab-hello;其 ingress 为 all、IAM 仍要求认证。若做过 LB 实验,先完成该实验的还原步骤。需要 Cloud Scheduler Admin,以及调用 SA 上的 actAs。

做过 IAP Web 实验时,先关闭 IAP、恢复 Invoker IAM check;本篇使用 Cloud Run ID token 认证,ingress 和调用者权限须满足上述前置条件。

选型比较见 异步服务选择。

创建定时 HTTP Job#

source lab.env
gcloud services enable cloudscheduler.googleapis.com
export SCHEDULER_SA="lab-scheduler@$PROJECT_ID.iam.gserviceaccount.com"
export HUMAN_EMAIL=$(gcloud config get-value account)
export RUN_URL=$(gcloud run services describe lab-hello --region="$REGION" --format='value(status.url)')
gcloud iam service-accounts create lab-scheduler
gcloud iam service-accounts add-iam-policy-binding "$SCHEDULER_SA" --member="user:$HUMAN_EMAIL" --role=roles/iam.serviceAccountUser
gcloud run services add-iam-policy-binding lab-hello --region="$REGION" --member="serviceAccount:$SCHEDULER_SA" --role=roles/run.invoker
gcloud scheduler jobs create http lab-heartbeat \
  --location="$REGION" \
  --schedule='*/5 * * * *' \
  --time-zone=Asia/Hong_Kong \
  --uri="$RUN_URL/" \
  --http-method=GET \
  --oidc-service-account-email="$SCHEDULER_SA" \
  --oidc-token-audience="$RUN_URL" \
  --attempt-deadline=30s \
  --max-retry-attempts=2
gcloud scheduler jobs run lab-heartbeat --location="$REGION"
gcloud scheduler jobs describe lab-heartbeat --location="$REGION"
gcloud logging read 'resource.type="cloud_scheduler_job" AND resource.labels.job_id="lab-heartbeat"' --freshness=1h --limit=10

验收:手动执行成功,Cloud Run 收到 200 请求;无需公开服务。OIDC audience 使用基础服务 URL;调用 *.googleapis.com API 常需 OAuth token,不能机械套用 OIDC。HTTP 认证

故障:撤销 scheduler SA 的 Run Invoker,手动执行,观察失败;恢复角色后重试成功。保留 Google 管理的 Cloud Scheduler service agent 角色,不能把它当成业务调用 SA。

定时任务可能重复触发,下游仍要幂等。指定时区并考虑夏令时;批处理通常选 UTC,业务日历任务按业务时区设计。

清理#

gcloud scheduler jobs pause lab-heartbeat --location="$REGION"
gcloud scheduler jobs delete lab-heartbeat --location="$REGION"
gcloud run services remove-iam-policy-binding lab-hello --region="$REGION" --member="serviceAccount:$SCHEDULER_SA" --role=roles/run.invoker
gcloud iam service-accounts delete "$SCHEDULER_SA"

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭