💡 Tips

Cloudflare Workers Cron Triggersで定期バッチを自動化する手順【TypeScript・個人開発向け】

結論:Cron Triggersなら定期バッチのためだけにサーバーを持たなくていい

個人開発で「毎朝データを集計したい」「定期的にAPIを叩いて通知したい」というだけの理由でVPSやサーバーレス関数常駐を用意するのはコストも手間も見合わない。

Cloudflare Workers の Cron Triggers を使えば、wrangler.toml に1行cron式を書くだけで、Workersスクリプトを定期実行できる。実行環境の管理は不要で、無料枠内で完結するケースも多い。

本記事では、TypeScriptでの最小構成の作り方から、個人開発で使える自動化ユースケース、ハマりやすい注意点までを実践的に解説する。

Cron Triggersの仕組み

Cron Triggersは、Cloudflareのエッジ上でWorkersスクリプトをスケジュール実行する機能だ。

  • 通常のWorkersは「HTTPリクエストが来たら実行」
  • Cron Triggersは「指定した時刻・間隔で実行」

という違いがある。トリガー種別ごとに、Workers側のハンドラーが変わる点がポイントだ。

トリガーエントリーポイント用途
HTTPリクエストfetch(request, env, ctx)API・Webアプリ
Cronscheduled(event, env, ctx)定期バッチ
キューqueue(batch, env, ctx)非同期ジョブ処理

キューを使った非同期ジョブについてはCloudflare Queues × Workers TypeScript で作る最小ジョブキュー【個人開発向け】で扱っているので、Cronと合わせて設計すると幅が広がる。

最小構成の実装手順

1. プロジェクトの用意

既にWorkersプロジェクトがあればそのまま流用できる。新規なら以下でひな形を作る。

npm create cloudflare@latest my-cron-worker -- --type=hello-world
cd my-cron-worker

2. wrangler.tomlにcron式を追加

name = "my-cron-worker"
main = "src/index.ts"
compatibility_date = "2026-01-01"

[triggers]
crons = ["0 0 * * *"]

0 0 * * * は「毎日UTC 0時(日本時間9時)に実行」を意味する標準的なcron式だ。複数スケジュールを配列で並べることもできる。

3. scheduledハンドラーを実装

export interface Env {
  SLACK_WEBHOOK_URL: string;
}

export default {
  async scheduled(
    event: ScheduledEvent,
    env: Env,
    ctx: ExecutionContext
  ): Promise<void> {
    const message = `定期チェック実行: ${new Date(event.scheduledTime).toISOString()}`;

    ctx.waitUntil(
      fetch(env.SLACK_WEBHOOK_URL, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ text: message }),
      })
    );
  },
};

ctx.waitUntil() で囲むことで、非同期処理が完了するまでWorkersの実行を待たせる。これを忘れると、fetchが完了する前に処理が打ち切られることがあるので注意したい。

4. デプロイとローカル検証

npx wrangler deploy

ローカルでcronの動作をすぐ確認したい場合は、wrangler dev --test-scheduled を使い、以下のように叩くとハンドラーを手動発火できる。

curl "http://localhost:8787/__scheduled?cron=0+0+*+*+*"

本番の時刻を待たずに動作確認できるので、開発中は必ずこちらで検証してからデプロイするとよい。

個人開発での自動化ユースケース

1. Slack/Discord通知バッチ

上記のコード例のように、毎朝の進捗確認・エラーサマリー通知などに向いている。外部APIのステータスチェックと組み合わせるパターンも多い。

2. アクセス集計・レポート生成

Cloudflare Workers AIやD1・KVと組み合わせ、日次でログを集計してレポートを作る使い方もできる。AIによる要約処理を挟みたい場合はCloudflare Workers AI 無料枠でLLM推論をゼロコスト運用する実装手順が参考になる。

3. 外部API連携の定期同期

為替レート・在庫情報・RSSフィードなどを定期取得し、KVやR2に保存しておく用途にも使える。画像を扱う場合はCloudflare R2で画像アップロードを最安構成で実装する手順【個人開発・コスト比較付き】も合わせて確認しておきたい。

4. サイトの死活監視

自分のAstroサイトやWordPressサイトに定期アクセスし、ステータスコードを監視して異常時だけ通知する、という軽量ヘルスチェックにも使える。デプロイ周りはCloudflare PagesにAstroサイトをデプロイする方法|手順と詰まりどころを参照。

注意点・デメリット

  • 実行時間に上限がある:長時間のバッチ処理には不向き。重い処理はキュー経由で分割するなど設計の工夫が必要
  • タイムゾーンはUTC基準:cron式は基本UTCで解釈される。日本時間で「毎朝9時」にしたい場合は0 0 * * *のように時差を計算してずらす必要がある
  • 失敗時のリトライ挙動:Cron Triggersの失敗時ハンドリングは仕様変更が入ることがあるため、必ず公式の最新情報を確認してから設計するのが安全
  • 無料枠の制限:リクエスト数やCPU時間には上限があるため、頻度の高いcron(数分間隔など)を組む場合は料金・仕様を公式ドキュメントで事前に確認しておきたい

まとめ

Cron Triggersは、個人開発における「ちょっとした定期処理」をサーバーレスかつ低コストで実現できる手段だ。

  • wrangler.tomlにcron式を書くだけで定期実行が組める
  • scheduledハンドラー内でctx.waitUntil()を使うのが基本形
  • 通知・集計・API同期・死活監視など、個人開発の自動化ニーズの多くをカバーできる

まずは1つの通知バッチから試し、慣れてきたらキューやAIとの連携に広げていくとよい。