Cloud Scheduler とは、決めた時刻や間隔で HTTP の口や Pub/Sub に仕事を送る、Google Cloud の cron のサービスです。

  • Cloud Scheduler の呼び先・料金と無料の枠・cron の書き方とタイムゾーン・再試行の既定
  • gcloud scheduler で HTTP の便を作り、OIDC で Cloud Run を呼び、手で 1 回撃ってから任せる手順
  • AIエージェントの席に本番の定時の仕事を任せている当社が、Cloud Scheduler で実際に踏んだ所(秘密の漏れ・紙と現物の食い違い・撃つ主体の取り違え)

当社の本番の定時の仕事は、Cloud Scheduler の便で動いています。毎晩 3 時の数え直し、5 分ごとの受け箱の期限の見回り、15 分ごとの掃き寄せ、毎分の予約送信、毎日 4 時 40 分の退会者のデータの削除などです(社の実測 2026-10-21〜2026-10-30)。この頁は Google Cloud の公式の文書で仕組みを押さえた上で、当社の記録から「どう作り、どこで踏んだか」を並べます。Mac の上で時刻の仕事を回す形は launchd の頁、gcloud のログインと資格情報は gcloud auth の頁にあります。

Cloud Scheduler とは:時刻が来たら呼び先へ 1 回送る

Google Cloud の文書は、Cloud Scheduler を「決めた時刻や一定の間隔で実行する仕事の単位(いわゆる cron ジョブ)を設定する」物としています。作った便は、決めた予定どおりに呼び先へ送られ、仕事は呼び先の側で行われます(About Cloud Scheduler・2026-11-02 に見た)。

呼び先の種類使う場面
HTTP/S の口Cloud Run など、URL で呼べる所(公に届く口である事)
Pub/Sub のトピックメッセージを置いて、受け手に任せる
App Engine の HTTP/S同じプロジェクトの App Engine のアプリ

出典: About Cloud Scheduler・Create and configure cron jobs(2026-11-02 に見た)。

送り方は「少なくとも 1 回(at least once)」です。まれに 1 回の予定で 2 回以上走る事があるので、呼び先は何度走っても害の無い形(冪等)にしておくよう文書は求めています。同じ予定の再送を見分けるには、便の名と X-CloudScheduler-ScheduleTime ヘッダ(予定の時刻・再試行でも変わらない)を使えます(About Cloud Scheduler・2026-11-02 に見た)。

Cloud Scheduler の料金と無料の枠

料金は便(ジョブ)の数だけで決まり、走った回数(実行)には掛かりません。止めている(pause した)便も 1 本と数えます(Cloud Scheduler pricing・2026-11-02 に見た)。

見る所公式の料金の頁の記載
何に掛かるか便(ジョブ)の数。実行の回数には掛からない
単価1 本あたり 31 日で $0.10(1 日あたり $0.003)。日割りで数える
無料の枠Google の請求先アカウントごとに月 3 本まで無料
無料の枠の数え方プロジェクトごとではなく請求先アカウントごと(例: 5 つのプロジェクトに 2 本ずつ=無料 3 本・有料 7 本)
止めている便1 本と数える

出典: Cloud Scheduler pricing(2026-11-02 に見た)。毎分走る便も 1 日 1 回の便も、料金の上では同じ 1 本です。

cron の書き方とタイムゾーン

予定は unix-cron の 5 つの欄(分・時・日・月・曜日)で書きます。曜日は 0〜6(SUN〜SAT)で、7 も日曜です。月の最後の日を表す L は使えません。日と曜日の両方を指定すると、どちらかに当たれば走ります(Cron job format and time zone・2026-11-02 に見た)。当社の本番の便の予定を例に並べます。

予定cron の書き方当社の便
毎分* * * * *予約送信(社の実測 2026-10-21)
5 分ごと*/5 * * * *受け箱の期限の見回り(社の実測 2026-10-28)
15 分ごと*/15 * * * *掃き寄せ(社の実測 2026-10-30)
毎時 0 分0 * * * *月次の仕事を 1 社ずつ回す輪番(社の実測 2026-10-29)
毎日 3 時0 3 * * *数え直し・日本時間(社の実測 2026-10-24)
毎日 4 時 40 分40 4 * * *退会から 90 日を過ぎた会員のデータの削除(社の実測 2026-10-24)

出典: 書き方は Cron job format and time zone(2026-11-02 に見た)。右の列は当社の運用の記録。

タイムゾーンは既定が UTC です。日本時間で書くなら、作るときに --time-zone で tz database の名(Asia/Tokyo など)を渡します。夏時間のある地域では、時計が戻る日に同じ時刻が 2 回来るなどで走り方が乱れる事があり、文書は乱れを避けたいなら UTC を勧めています(Cron job format and time zone・2026-11-02 に見た)。cron の代わりに every 5 minutes のような groc の書き方も、gcloud か API からなら使えます(同じ頁)。

HTTP の呼び先の認証:OIDC と Bearer の共有の秘密

当社は呼び先の認証に 2 つの形を使っています(社の実測 2026-10-24・2026-10-28・2026-10-30)。

見る所OIDC(ID トークン)Bearer の共有の秘密
呼び先が確かめる物Google が出した ID トークン(Cloud Run などは自動で確かめる)呼び先が持つ秘密と、ヘッダの値が同じか
便に入れる物サービスアカウントと audienceAuthorization ヘッダの値(秘密そのもの)
当社の作り方便専用のサービスアカウントを使い、audience を呼び先の本番の口の URL にする作るとき本文は標準入力で渡し、コマンドの引数に秘密を出さない
気をつける所サービスアカウントは便と同じプロジェクトの物。Cloud Run には起動元(roles/run.invoker)の役割が要る便の中身を出す命令の出力に、値がそのまま出る(下の記録)

出典: Use authentication with HTTP targets(2026-11-02 に見た)・社の実測 2026-10-24・2026-10-28・2026-10-30。

文書は、トークンは OIDC を使うのが普通で、*.googleapis.com の Google の API を呼ぶときだけ OAuth のトークンを使うとしています。audience を指定しないと、引数を含む URL 全体が audience になります。Cloud Scheduler のサービスエージェント(Google が自動で作る物)を便のサービスアカウントに使ってはいけません(Use authentication with HTTP targets・2026-11-02 に見た)。

gcloud scheduler で便を作り、任せるまでの手順

当社は便を作ったら、まず gcloud scheduler jobs run で手で 1 回撃ち、呼び先が 200 を返した事とログを見てから、予定に任せます。戻すときは pause(止めるだけ)か delete(消す)です(社の実測 2026-10-18・2026-10-24・2026-10-28)。

  1. 便を作る。OIDC で Cloud Run を呼ぶなら次の形です(大文字は自分の値に置き換える)。
    gcloud scheduler jobs create http JOB \
      --location=LOCATION \
      --schedule="0 3 * * *" \
      --time-zone="Asia/Tokyo" \
      --uri=https://SERVICE_URL/PATH \
      --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL \
      --oidc-token-audience=https://SERVICE_URL/PATH
    旗は gcloud scheduler jobs create http の参照の頁にあります(2026-11-02 に見た)。--oidc-token-audience を省くと URI がそのまま audience になります(同じ頁)。
  2. 手で 1 回撃つ: gcloud scheduler jobs run JOB --location=LOCATION。文書も、予定を待たずにすぐ走らせる命令としてこれを挙げています(Schedule and run a cron job using the gcloud CLI・2026-11-02 に見た)
  3. 呼び先が 200 を返し、仕事が終わった事をログで見る。当社の数え直しの便は、作って 1 発撃ったら 27 秒で数え直しが終わり、失敗は 0 でした(社の実測 2026-10-24)。5 分ごとの見回りの便は、手で 1 回撃って 200・50ms でした(社の実測 2026-10-28)
  4. 見えたら予定に任せる。戻すなら gcloud scheduler jobs pause JOB(止めた便は resume で戻せる)か gcloud scheduler jobs delete JOB

古い便を新しい便に置き換えるときは、先に新しい便を作り、200 を 2 回見てから古い便を消しました。当社の毎分の予約送信の便はこの順で置き換えています(社の実測 2026-10-21)。2 本が同時に動く間は同じ仕事が 2 回呼ばれ得るので、呼び先が冪等である事が前提です(冪等は About Cloud Scheduler の求め・2026-11-02 に見た)。

失敗した時の再試行は、既定では行われません。--max-retry-attempts(retryCount)の既定は 0 で、0 なら次の予定の時刻まで待ちます。指定できるのは 5 までです(Retry jobs・2026-11-02 に見た)。

再試行の設定(gcloud の旗)既定
最大の再試行の回数(--max-retry-attempts)0(再試行しない・5 まで)
再試行を続ける長さ(--max-retry-duration)0 秒(回数の上限だけで決まる)
最小の待ち(--min-backoff)5 秒
最大の待ち(--max-backoff)3600 秒(1 時間)
待ちを倍にする回数(--max-doublings)5

出典: Retry jobs(2026-11-02 に見た)。HTTP の呼び先は、呼び先の時間切れと Cloud Scheduler の attempt deadline が合わないと、呼び先が成功していても失敗と出る事があります(Create and configure cron jobs・2026-11-02 に見た)。

当社の記録 1: 便の中身を見るだけで、秘密が 3 回漏れた

Bearer の形の便は、ヘッダの値が秘密そのものです。当社はこれを 3 回、別々の道で外へ出しました。

  1. gcloud scheduler jobs describe の --format に headers を含めて撃ち、Authorization の値が会話の記録に出た。その秘密を回す(新しい値に替える)起票をした(社の実測 2026-09-20)
  2. describe の出力を sed で伏せたつもりが、出力の区切りが : ではなく = で、伏せの式に当たらず値が出た(社の実測 2026-10-09)
  3. gcloud scheduler jobs update http は、更新した後の便の全体(ヘッダの値を含む)を標準エラーに出す。標準出力を >/dev/null で捨てただけでは出た(社の実測 2026-10-10)

3 回とも「出してから伏せる」形でした。当社の作法は「要る欄だけ選んで出す」に変えています。ヘッダは名前だけを見て、値は出しません(社の実測 2026-10-10)。

gcloud scheduler jobs describe JOB --location=LOCATION \
  --format='value(httpTarget.uri,status.code)'

同じ日に、ヘッダを外す --remove-headers が gcloud 586.0.0 では単独でも TypeError で落ちました。当社は --clear-headers で全部外し、--update-headers=Content-Type=application/json で要る物だけ戻す 2 手にしました(社の実測 2026-10-10)。

当社の記録 2: 紙の「1 分ごと」を信じて、正常を故障と読んだ

社内の紙には、ある付与の便が「1 分ごと」と書いてありました。付与が 1 分で来ないので故障と読みましたが、現物の便は */5 * * * * で、付与は最大 5 分待つのが正常でした(社の実測 2026-09-20)。

便の間隔は、紙ではなく現物の便の schedule の欄で確かめるのが確かです。見るときも上の作法どおり、要る欄だけを選んで出します。

当社の記録 3: PERMISSION_DENIED を「権限が無い」と読んだが、撃つ主体が違った

便を撃って PERMISSION_DENIED が返り、「権限が無い」と報告しかけました。実際は撃った主体を取り違えていて、別の機体のサービスアカウントは jobs の create・get・run・delete・list を全部持っていました(社の実測 2026-09-21)。「撃てない」と言う前に、どの主体で撃ったかを確かめます。主体の確かめ方と切り替えは gcloud auth の頁に譲ります。

その後、席が便の作成・実行・削除を自分で撃てるよう、席のサービスアカウントに Cloud Scheduler の管理の役割を 1 回付けました(社の実測 2026-09-21)。

当社の記録 4: 会社ごとに便を作らず、毎時の輪番にした

毎晩 3 時に走っていた月次の便を、毎時(0 * * * *)に変えました。会社ごとに便を作るのではなく、1 本の便が毎時 1 社ずつ順に回す形です(社の実測 2026-10-29)。便の数が会社の数で増えないので、便の一覧と、料金の上での本数(便の数で決まる)も増えません。

よくある質問

Cloud Scheduler の料金はいくらですか?無料で使えますか?

便(ジョブ)1 本あたり 31 日で $0.10 で、実行の回数には掛かりません。Google の請求先アカウントごとに月 3 本まで無料で、無料の枠はプロジェクトごとではなくアカウントごとに数えます。止めている便も 1 本と数えます(Cloud Scheduler pricing・2026-11-02 に見た)。

Cloud Scheduler で Cloud Run を呼ぶにはどうしますか?

HTTP の便を作り、--oidc-service-account-email にサービスアカウントを渡し、そのサービスアカウントに Cloud Run の起動元(roles/run.invoker)の役割を付けます(Use authentication with HTTP targets・2026-11-02 に見た)。当社は便専用のサービスアカウントを使い、audience を呼び先の本番の口の URL にしています(社の実測 2026-10-24)。

Cloud Scheduler の cron は日本時間で書けますか?

書けます。既定は UTC なので、作るときに --time-zone="Asia/Tokyo" のように tz database の名を渡します(Cron job format and time zone・2026-11-02 に見た)。当社の毎晩 3 時の便も日本時間の 0 3 * * * です(社の実測 2026-10-24)。

gcloud scheduler で作った便を、予定を待たずに試すには?

gcloud scheduler jobs run JOB --location=LOCATION ですぐ走ります(Schedule and run a cron job using the gcloud CLI・2026-11-02 に見た)。当社は作った便を必ずこれで 1 回撃ち、200 とログを見てから任せています(社の実測 2026-10-24・2026-10-28)。

同じ便が 2 回走る事はありますか?

あります。Cloud Scheduler の送り方は「少なくとも 1 回」で、まれに 1 回の予定で 2 回以上走るので、呼び先は何度走っても害の無い形にします。再送の見分けには X-CloudScheduler-ScheduleTime ヘッダが使えます(About Cloud Scheduler・2026-11-02 に見た)。

出典

  1. Google Cloud「About Cloud Scheduler」 https://docs.cloud.google.com/scheduler/docs/overview(2026-11-02 に見た・何をする物か・呼び先の 3 種・少なくとも 1 回・再試行・X-CloudScheduler-ScheduleTime)
  2. Google Cloud「Cloud Scheduler pricing」 https://cloud.google.com/scheduler/pricing(2026-11-02 に見た・便の数で決まる事・$0.10/31 日・月 3 本の無料の枠・止めた便も数える事)
  3. Google Cloud「Cron job format and time zone」 https://docs.cloud.google.com/scheduler/docs/configuring/cron-job-schedules(2026-11-02 に見た・5 つの欄・L が無い事・日と曜日の OR・既定 UTC・夏時間・groc)
  4. Google Cloud「Use authentication with HTTP targets」 https://docs.cloud.google.com/scheduler/docs/http-target-auth(2026-11-02 に見た・OIDC と OAuth・audience・roles/run.invoker・同じプロジェクトのサービスアカウント・サービスエージェント)
  5. Google Cloud「Create and configure cron jobs」 https://docs.cloud.google.com/scheduler/docs/creating(2026-11-02 に見た・HTTP の呼び先・attempt deadline・pause・resume・delete)
  6. Google Cloud「Schedule and run a cron job using the gcloud CLI」 https://docs.cloud.google.com/scheduler/docs/schedule-run-cron-job-gcloud(2026-11-02 に見た・gcloud scheduler jobs run)
  7. Google Cloud「Retry jobs」 https://docs.cloud.google.com/scheduler/docs/configuring/retry-jobs(2026-11-02 に見た・再試行の設定と既定)
  8. Google Cloud「gcloud scheduler jobs create http」 https://docs.cloud.google.com/sdk/gcloud/reference/scheduler/jobs/create/http(2026-11-02 に見た・--time-zone・--oidc-service-account-email・--oidc-token-audience)
  9. 社の実測 2026-09-20(当社の運用の記録・describe の format で秘密が出た事・紙の「1 分ごと」と現物の */5)
  10. 社の実測 2026-09-21(当社の運用の記録・撃つ主体の取り違えと PERMISSION_DENIED・管理の役割を付けた事)
  11. 社の実測 2026-10-09・2026-10-10(当社の運用の記録・sed の伏せが = の区切りで外れた事・update http が標準エラーに便の全体を出す事・--remove-headers の TypeError と 2 手の外し方)
  12. 社の実測 2026-10-18・2026-10-21・2026-10-24・2026-10-28・2026-10-29・2026-10-30(当社の運用の記録・本番の便の予定・手で 1 回撃つ確かめ・置き換えの順・認証の 2 つの形・毎時の輪番)