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アプリ |
| Cron | scheduled(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との連携に広げていくとよい。