Workflows を使うと、Workers プラットフォーム上で、耐久性のある複数ステップのアプリケーションを作れます。Workflow は自動で再試行し、状態を保持し、数時間から数日動き続け、サードパーティ API 同士を調整できます。
R2 object storage へのファイルアップロードを後処理する、Workers AI の embeddings を Vectorize ベクトルデータベースへ自動生成する、Email Service でユーザーのライフサイクルメールを送る、といった用途で Workflows を作れます。
このガイドでは、データを取得し、一時停止し、結果を処理する Workflow を作成してデプロイします。
手順を飛ばして、このガイドで作る完成済み Workflow を取得したい場合は、次を実行します。
npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter"Cloudflare Workers に慣れている場合や、先にコードを見てあとから詳細を学びたい場合は、この方法を使います。
ゼロから Workflow を作る手順は、次に進みます。
- Cloudflare アカウント ↗ に登録します。
Node.js↗ をインストールします。
Node.js のバージョンマネージャー
権限の問題を避け、Node.js のバージョンを切り替えられるよう、Volta ↗ や nvm ↗ などの Node バージョンマネージャーを使います。このガイドの後半で説明する Wrangler には、Node バージョン 16.17.0 以降が必要です。
-
ターミナルを開き、
create cloudflare(C3) CLI ツールを実行して Worker プロジェクトを作成します。npm create cloudflare@latest -- my-workflowyarn create cloudflare my-workflowpnpm create cloudflare@latest my-workflowセットアップでは、次のオプションを選びます。
- What would you like to start with? では、
Hello World exampleを選びます。 - Which template would you like to use? では、
Worker onlyを選びます。 - Which language do you want to use? では、
TypeScriptを選びます。 - Do you want to use git for version control? では、
Yesを選びます。 - Do you want to deploy your application? では、
Noを選びます(デプロイ前にいくつか変更します)。
- What would you like to start with? では、
-
新しいプロジェクトディレクトリへ移動します。
cd my-workflowC3 が作成したファイル
プロジェクトディレクトリに、C3 は次のファイルを生成します。
wrangler.jsonc: Wrangler 設定ファイル です。src/index.ts: TypeScript で書かれた最小の Worker です。package.json: 最小の Node 依存関係の設定ファイルです。tsconfig.json: TypeScript の設定です。
-
新しいファイル
src/workflow.tsを作成します。src/workflow.tsts import { WorkflowEntrypoint, WorkflowStep } from "cloudflare:workers"; import type { WorkflowEvent } from "cloudflare:workers"; type Params = { name?: string }; type IPResponse = { result: { ipv4_cidrs: string[] } }; export class MyWorkflow extends WorkflowEntrypoint<Env, Params> { async run(event: WorkflowEvent<Params>, step: WorkflowStep) { const data = await step.do("fetch data", async () => { const response = await fetch( "https://api.cloudflare.com/client/v4/ips", ); return await response.json<IPResponse>(); }); await step.sleep("pause", "20 seconds"); const result = await step.do( "process data", { retries: { limit: 3, delay: "5 seconds", backoff: "linear" } }, async () => { return { name: event.payload.name ?? "World", ipCount: data.result.ipv4_cidrs.length, }; }, ); return result; } }Workflow は
WorkflowEntrypointを継承し、runメソッドを実装します。このコードでは、Workflow を起動するイベントに型が付くよう、Params型を 型パラメーター として渡しています。stepオブジェクトは、Workflows API の中核です。Workflow 内の耐久性のあるステップを定義するメソッドを提供します。step.do(name, callback)- コードを実行し、結果を永続化します。Workflow が中断または再試行されても、完了済みの処理をやり直さず、最後に成功したステップから再開します。コールバックはシリアライズ可能なデータを返します。JavaScript の Workflows では、大きなバイナリ出力向けにReadableStream<Uint8Array>も含められます。step.sleep(name, duration)- 指定した時間(例:"10 seconds"、"1 hour")Workflow を一時停止します。
ストリームを返す場合は、未使用でロックされていない新しい
ReadableStream<Uint8Array>を返します。BYOB ストリームと BYOB リーダーはサポートされていません。失敗時の扱いをカスタマイズするには、
step.do()に 再試行の設定 を渡せます。ストリームの要件、制限、sleepUntilやwaitForEventなどの追加メソッドは、step API 全体 を参照してください。コードを別ステップに分けるかは、「一部分だけ失敗したときに、このコード全体をやり直したいか」で判断します。外部 API の呼び出し、データベースのクエリ、ストレージからのファイル読み取りなどは、別ステップが向いています。あとのステップが失敗しても、すでに取得したデータを使ってその地点から再試行でき、余分な API 呼び出しやデータベースクエリを避けられます。
Workflow のロジックの定義については、Rules of Workflows を参照してください。
-
Workers プロジェクトと Workflow の Wrangler 設定ファイル である
wrangler.jsoncを開き、workflows設定を追加します。{ "$schema": "node_modules/wrangler/config-schema.json", "name": "my-workflow", "main": "src/index.ts", // Set this to today's date "compatibility_date": "2026-09-20", "observability": { "enabled": true }, "workflows": [ { "name": "my-workflow", "binding": "MY_WORKFLOW", "class_name": "MyWorkflow" } ] }"$schema" = "node_modules/wrangler/config-schema.json" name = "my-workflow" main = "src/index.ts" # Set this to today's date compatibility_date = "2026-09-20" [observability] enabled = true [[workflows]] name = "my-workflow" binding = "MY_WORKFLOW" class_name = "MyWorkflow"class_nameはエクスポートしたクラスと一致させる必要があります。bindingは、コード内で Workflow にアクセスする変数名です(env.MY_WORKFLOWなど)。同じ Workflow を一定間隔で自動実行したい場合は、Workflow 定義に
schedulesを追加します。{ "$schema": "node_modules/wrangler/config-schema.json", "name": "my-workflow", "main": "src/index.ts", // Set this to today's date "compatibility_date": "2026-09-20", "workflows": [ { "name": "my-workflow", "binding": "MY_WORKFLOW", "class_name": "MyWorkflow", "schedules": ["0 * * * *"] } ] }"$schema" = "node_modules/wrangler/config-schema.json" name = "my-workflow" main = "src/index.ts" # Set this to today's date compatibility_date = "2026-09-20" [[workflows]] name = "my-workflow" binding = "MY_WORKFLOW" class_name = "MyWorkflow" schedules = [ "0 * * * *" ]一致する各 cron 式が新しい Workflow インスタンスを自動作成するため、Workflow 専用の定期実行にトップレベルの
triggers.cronsと別のscheduledハンドラーは不要です。スケジュールされたインスタンスでは、一致した cron 式とスケジュールされたトリガー時刻が
event.scheduleに含まれます。Workflow のスケジュールを設定するときは、最新の Wrangler リリースを使います。ローカルの Wrangler スキーマがまだ
schedulesを認識しない場合は、デプロイ前に Wrangler を更新してください。Workflow 内では、
this.env経由で bindings(KV、R2、D1 など)にもアクセスできます。Workers 内の bindings の詳細は、Bindings (env) を参照してください。 -
次に、bindings の型を生成します。
npx wrangler typesこれで、
MY_WORKFLOWbinding を含むEnv型付きのworker-configuration.d.tsファイルが作成されます。
次に、Workflow を呼び出す場所が必要です。
-
src/index.tsを、Workflow インスタンスの開始と確認用の fetch ハンドラー に置き換えます。src/index.tsts export { MyWorkflow } from "./workflow"; export default { async fetch(request: Request, env: Env): Promise<Response> { const url = new URL(request.url); const instanceId = url.searchParams.get("instanceId"); if (instanceId) { const instance = await env.MY_WORKFLOW.get(instanceId); return Response.json(await instance.status()); } const instance = await env.MY_WORKFLOW.create(); return Response.json({ instanceId: instance.id }); }, } satisfies ExportedHandler<Env>;
-
ローカル開発サーバーを起動します。
npx wrangler dev -
Workflow インスタンスを開始するには、新しいターミナルウィンドウを開き、次を実行します。
curl http://localhost:8787instanceIdが自動生成されます。{ "instanceId": "abc-123-def" } -
返された
instanceIdで状態を確認します。curl "http://localhost:8787?instanceId=abc-123-def"Workflow はステップを進みます。約 20 秒後(sleep の時間)に完了します。
-
Workflow をデプロイします。
npx wrangler deploy本番では、デプロイした URL に対して同じ curl コマンドでテストできます。本番では、Workers、Wrangler、または Cloudflare ダッシュボードから Workflow インスタンスを起動 することもできます。
デプロイ後は、CLI で Workflow インスタンスを調べることもできます。
npx wrangler workflows instances describe my-workflow latestinstances describeの出力には、次が表示されます。- 各ステップの状態(success、failure、running)
- ステップが出力した状態。ストリーム出力の場合、CLI は全文ではなくプレビューまたは要約を表示します
sleepの状態(Workflow が起きる時刻を含む)- 各ステップに関連する再試行
- エラー(例外メッセージを含む)