effidevFlutter・Cloudflareエッジ・クラウドコスト最適化
日本語

Cloudflare Workflows 実践ガイド: Durable Objects ベースのサーバーレス耐障害性リトライパイプライン

Cloudflare Workflows Durable Objects Fault Tolerant Retry Pipeline

Cloudflare Workflows 実践ガイド: タイムアウトのないサーバーレスパイプライン

従来のサーバーレス環境 (AWS Lambda, Cloudflare Workers) における最大の課題は、短時間での実行タイムアウト状態保持 (State Persistence) の難しさでした。数分以上かかる外部 API 連携や AI バッチ処理には、キューや外部 DB を複雑に組み合わせる必要がありました。

Cloudflare がリリースした Cloudflare Workflows は、Durable Objects の状態保存メカニズムを基盤とした 耐障害性ワークフローエンジン (Durable Execution Engine) です。途中でエラーが発生しても、完了したステップの状態が自動保存され、失敗したステップから正確にリトライ実行されます。

本ガイドでは、Cloudflare Workflows の動作原理、step.do / step.sleep の活用法、AI バッチ処理パイプラインの実装コードを解説します。


1. 従来のサーバーレス vs Cloudflare Workflows

比較項目 従来の Workers / Lambda Cloudflare Workflows (Durable Execution)
最大実行時間 制限あり (デフォルト30秒) 無制限 (step.sleep で数日間の待機も可能)
障害時のリトライ 関数全体を再実行 失敗した step のみを指数バックオフで自動リトライ
状態の保持 Redis や D1 への手動保存 Durable Objects により各 Step 結果を自動チェックポイント
コストモデル 待機中も CPU 時間が課金 step.sleep 中の CPU 課金は $0 (完全無料待機)

2. Workflows のプログラミングモデル

Cloudflare Workflows は WorkflowEntrypoint を継承する TypeScript クラスとして定義します。

3つの主要 API

  1. step.do(name, config, callback): 成功時に戻り値が Durable Storage にチェックポイント保存される最小実行単位。
  2. step.sleep(name, duration): CPU 時間を消費することなく、指定時間プロセスを停止。
  3. step.sleepUntil(name, timestamp): 指定した特定時刻まで安全に待機。

3. 実戦例: 自動リトライ機能付き AI コンテンツ生成パイプライン

AI 要約生成、外部 Webhook へのリトライ送信、10秒の非同期待機、メール送信までの完全なワークフローコードです。

import { WorkflowEntrypoint, WorkflowEvent, WorkflowStep } from 'cloudflare:workers';

type Env = {
  AI: any;
  MY_WORKFLOW: Workflow;
};

type Params = {
  articleId: string;
  userEmail: string;
  rawText: string;
};

export class ArticleSummaryWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    const { articleId, userEmail, rawText } = event.payload;

    // Step 1: AI 要約生成 (自動チェックポイント)
    const summary = await step.do('generate-summary', async () => {
      const aiResponse = await this.env.AI.run('@cf/meta/llama-3.3-70b-instruct-fp8-fast', {
        prompt: `以下の文章を3行で要約してください: ${rawText}`,
      });
      return aiResponse.summary;
    });

    // Step 2: 外部 Webhook 送信 (失敗時は最大3回リトライ)
    const webhookResult = await step.do(
      'send-webhook',
      {
        retries: {
          limit: 3,
          delay: '5 seconds',
          backoff: 'exponential',
        },
        timeout: '10 seconds',
      },
      async () => {
        const res = await fetch('https://api.example.com/webhooks/summary', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ articleId, summary }),
        });
        if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);
        return await res.json();
      }
    );

    // Step 3: CPU コスト $0 での 10 秒待機
    await step.sleep('wait-before-email', '10 seconds');

    // Step 4: 最終メール送信
    await step.do('send-email', async () => {
      console.log(`メール送信完了 [${userEmail}]: ${summary}`);
      return { status: 'sent', sentAt: new Date().toISOString() };
    });
  }
}

4. まとめ

  1. Cloudflare Workflows は Durable Objects に状態を永続化することで、サーバーレスのタイムアウト問題を克服します。
  2. ステップ単位のチェックポイント機能により、システム障害が発生しても未完了ステップから即座に再開できます。
  3. AWS Step Functions 等に比べてはるかにシンプルな開発体験とコスト効率を提供します。