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 などは自動で確かめる) | 呼び先が持つ秘密と、ヘッダの値が同じか |
| 便に入れる物 | サービスアカウントと audience | Authorization ヘッダの値(秘密そのもの) |
| 当社の作り方 | 便専用のサービスアカウントを使い、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)。
- 便を作る。OIDC で Cloud Run を呼ぶなら次の形です(大文字は自分の値に置き換える)。
旗は gcloud scheduler jobs create http の参照の頁にあります(2026-11-02 に見た)。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--oidc-token-audienceを省くと URI がそのまま audience になります(同じ頁)。 - 手で 1 回撃つ:
gcloud scheduler jobs run JOB --location=LOCATION。文書も、予定を待たずにすぐ走らせる命令としてこれを挙げています(Schedule and run a cron job using the gcloud CLI・2026-11-02 に見た) - 呼び先が 200 を返し、仕事が終わった事をログで見る。当社の数え直しの便は、作って 1 発撃ったら 27 秒で数え直しが終わり、失敗は 0 でした(社の実測 2026-10-24)。5 分ごとの見回りの便は、手で 1 回撃って 200・50ms でした(社の実測 2026-10-28)
- 見えたら予定に任せる。戻すなら
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 回、別々の道で外へ出しました。
gcloud scheduler jobs describeの--formatに headers を含めて撃ち、Authorizationの値が会話の記録に出た。その秘密を回す(新しい値に替える)起票をした(社の実測 2026-09-20)- describe の出力を sed で伏せたつもりが、出力の区切りが
:ではなく=で、伏せの式に当たらず値が出た(社の実測 2026-10-09) 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 に見た)。
出典
- Google Cloud「About Cloud Scheduler」 https://docs.cloud.google.com/scheduler/docs/overview(2026-11-02 に見た・何をする物か・呼び先の 3 種・少なくとも 1 回・再試行・X-CloudScheduler-ScheduleTime)
- Google Cloud「Cloud Scheduler pricing」 https://cloud.google.com/scheduler/pricing(2026-11-02 に見た・便の数で決まる事・$0.10/31 日・月 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)
- 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・同じプロジェクトのサービスアカウント・サービスエージェント)
- Google Cloud「Create and configure cron jobs」 https://docs.cloud.google.com/scheduler/docs/creating(2026-11-02 に見た・HTTP の呼び先・attempt deadline・pause・resume・delete)
- 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)
- Google Cloud「Retry jobs」 https://docs.cloud.google.com/scheduler/docs/configuring/retry-jobs(2026-11-02 に見た・再試行の設定と既定)
- 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)
- 社の実測 2026-09-20(当社の運用の記録・describe の format で秘密が出た事・紙の「1 分ごと」と現物の */5)
- 社の実測 2026-09-21(当社の運用の記録・撃つ主体の取り違えと PERMISSION_DENIED・管理の役割を付けた事)
- 社の実測 2026-10-09・2026-10-10(当社の運用の記録・sed の伏せが = の区切りで外れた事・update http が標準エラーに便の全体を出す事・--remove-headers の TypeError と 2 手の外し方)
- 社の実測 2026-10-18・2026-10-21・2026-10-24・2026-10-28・2026-10-29・2026-10-30(当社の運用の記録・本番の便の予定・手で 1 回撃つ確かめ・置き換えの順・認証の 2 つの形・毎時の輪番)