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"