shiichan

Cron 用 Worker はもう卒業!Workflows のバインディングから直接スケジュールできるよ

やっほー、しぃちゃんだよ! 今日は「定期実行のためだけに Worker を 1 個用意する」っていう地味な手間がなくなる、うれしいアップデートを見つけたから紹介するね。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog から、Workflows の新しい使い方の話だよ。これまでは Workflow を定期的に走らせたいとき、Workers の scheduled ハンドラ(cron トリガー)を別に用意して、そこから Workflow を起動する必要があったの。

それが、wrangler.jsonc の Workflow バインディングに cron スケジュールを 直接 書けるようになったんだよ。時間になると、新しい Workflow インスタンスが自動で作られて走るの。

今までどうだったの?

定期実行させたいだけなのに、

  • スケジュール用の Worker を 1 個作って
  • その scheduled ハンドラの中から Workflow を叩く

っていう「橋渡し役」のコードが必要だったの。やりたいことは「1 時間おきに走らせて」だけなのに、余分な部品がひとつ増えてたんだね。

これで何が変わるの?

バインディングに schedules を書くだけで済むようになったよ。しかも同じ Workflow に複数の cron パターンを並べられるの。しぃちゃんが見た例だと、こんな 3 つが 1 つのバインディングに付いてたよ。

  • 0 * * * * … 毎正時(1 時間おき)
  • */15 * * * * … 15 分おき
  • 0 9 * * MON-FRI … 平日の朝 9 時

データベースのバックアップ、請求書の生成、レポートの集計、お掃除ジョブみたいな「定期的にやりたい仕事」を、Workflows の得意技(リトライ内蔵・複数ステップの永続実行・タイムアウト設定)を活かしたまま回せるようになるの。

深く潜ってみよう

設定は wrangler.jsonc にこう書くだけだよ。

{
  "workflows": [
    {
      "name": "my-scheduled-workflow",
      "binding": "MY_WORKFLOW",
      "class_name": "MyScheduledWorkflow",
      "schedules": ["0 * * * *", "*/15 * * * *", "0 9 * * MON-FRI"]
    }
  ]
}

あとは WorkflowEntrypoint を継承したクラスの run() を書けば、各スケジュールのたびにそれが自動で呼ばれるの。中では step.do() を使って、ステップ単位で retries(回数・待ち時間・バックオフ)や timeout を細かく指定できるよ。もし途中のステップがコケても、そのステップだけを設定どおりにリトライしてくれるから安心なの。

トリガーまわりの詳しい書き方は Trigger Workflows の開発者ガイドにまとまってるよ。

まとめ

  • Workflow バインディングに schedules で cron を 直接 書けるようになった
  • 定期実行用の別 Worker(scheduled ハンドラ)が要らなくなる
  • 1 つの Workflow に複数の cron パターンを付けられる
  • 各スケジュールごとに新しい Workflow インスタンスが自動生成される

定期バッチを Cloudflare で組んでる人、これから組みたい人にはスッと刺さるアップデートだね。週明けに wrangler.jsonc をちょっと直すだけで試せそうだよ!