Alejandro Rioja.
AI Agents Growth

Cloudflareでコンテンツエージェントを動かす最安コスト分析

Alejandro Rioja
Alejandro Rioja
3 分で読める
TL;DR

Cloudflare Workers + Claude API上でコンテンツ生成・翻訳パイプライン全体を、Sonnet 3.5なら約$0.50/記事、Haikuなら約$0.12/記事で動かせます。Cloudflareの無料枠は1日10万リクエストを処理できます。スケールが求める時だけ課金されます。制約は長時間LLM呼び出しのコールドスタートレイテンシーで、Queuesが解決します。

無料ニュースレター

毎週水曜。28,400人以上の読者。無駄なし。

目次

2026年5月更新。

TL;DR: Cloudflare Workers + Claude API上でコンテンツ生成・翻訳パイプライン全体を、Sonnet 3.5なら約$0.50/記事、Haikuなら約$0.12/記事で動かせます。Cloudflareの無料枠は1日10万リクエストを処理できます。スケールが求める時だけ課金されます。制約は長時間LLM呼び出しのコールドスタートレイテンシーで、Queuesが解決します。

[オペレーターの視点] 私はalejandrorioja.comでまさにこのパイプラインを動かしています。TypeScript Workerが記事を書き、12の翻訳ジョブを並列展開し、すべてをKVに保存する——すべて1回のHTTP呼び出しで起動します。コストの詳細と構成方法を解説します。

AWSやVercelではなくCloudflareを選ぶ理由

AWS LambdaはGB秒単位で課金します。VercelはHobbyプランで実行ごとに課金し、厳しいレート制限があります。どちらもスケール時のコールドスタートが予測不能です。

Cloudflare WorkersはコンテナではなくV8アイソレートで動作します。コールドスタートはサブミリ秒です。無料枠は実用的:1日10万リクエスト、リクエストあたり10ms CPUタイム(ウォールクロック時間はより長い)。有料プランは月$5で1000万リクエスト。

AIコンテンツパイプラインでは、Workersのコンピュート費用はほぼゼロです。本当のコストはClaude APIです。最適化すべき変数はそれだけです。

アーキテクチャ(テキスト図)

code
HTTPトリガー(cronまたはwebhook)


  Worker: オーケストレーター

        ├─ ジョブメタデータをKVに書き込む(ステータス: "pending")

        └─ ENジョブ1件をキューに積む


         キュー: content-jobs

        ┌──────┴──────┐
        ▼             ▼
  Worker: ライター   Worker: トランスレーター(×12ロケール)
        │                    │
        ▼                    ▼
  Claude API             Claude API
        │                    │
        └──────┬─────────────┘

        KV: posts/{slug}/{locale}


     Webhook → GitHub → デプロイ

オーケストレーターWorkerがエントリーポイントです。KVに初期ステータスレコードを書き込み、Cloudflare Queueにジョブをプッシュします。QueueのファンアウトがライターWorker(EN)を起動し、ENの本文が完成したら12のトランスレーターWorkerを並列起動します。すべてが{slug}/{locale}をキーとしてKVに格納されます。最終的なwebhookがGitHub Actionsデプロイを起動します。

Cloudflareコスト表

リソース無料枠有料($5/月)実際の使用量
Workersリクエスト数10万/日1000万/月約500/日
Workers CPU時間10ms/リクエスト30s/リクエスト約8ms/リクエスト
KV読み取り10万/日1000万/月約2K/日
KV書き込み1K/日100万/月約300/日
キューメッセージ100万/月(含)約300/月
KVストレージ1 GB1 GB(含)約200 MB

月10記事を公開するサイトでは、Cloudflareの請求は無料枠で**$0**です。Workersは無料。そのボリュームでのKV読み書きも無料。私が使う唯一の有料機能はQueues——$5/月のWorkers Paidプランが必要ですが、そのプランには100万件のキューメッセージが含まれています。

私のCloudflare請求:月5ドル固定、月約3,000記事まで変わらず。

Claude APIコスト表

ここが本当にお金のかかるところです。1記事あたりの詳細分解。

EN生成(1記事、約1500語):

モデル入力トークン出力トークンコスト
Claude Haiku 3.5約2,000約2,500$0.005
Claude Sonnet 3.5約2,000約2,500$0.042

12翻訳(各約1500語):

モデル入力トークン(×12)出力トークン(×12)コスト
Claude Haiku 3.5約24,000約30,000$0.054
Claude Sonnet 3.5約24,000約30,000$0.500

1記事あたり合計(EN + 12翻訳):

モデル合計コスト
Claude Haiku 3.5約$0.059
Claude Sonnet 3.5約$0.542

EN生成にはSonnetを使い(正規記事の品質が重要)、翻訳にはHaikuを使います(ソーステキストはすでに書かれており、モデルは忠実に翻訳するだけです)。このブレンドアプローチで実際のコストは約$0.10/記事になります。

TypeScript Worker:オーケストレーター

typescript
// src/workers/orchestrator.ts
import { Queue } from "@cloudflare/workers-types";

interface Env {
  CONTENT_QUEUE: Queue;
  POSTS_KV: KVNamespace;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { slug, topic } = await request.json<{ slug: string; topic: string }>();

    // 初期ステータスを書き込む
    await env.POSTS_KV.put(
      `status:${slug}`,
      JSON.stringify({ status: "pending", createdAt: Date.now() })
    );

    // EN生成ジョブをキューに積む
    await env.CONTENT_QUEUE.send({
      type: "generate",
      slug,
      topic,
      locale: "en",
    });

    return Response.json({ queued: true, slug });
  },
};

TypeScript Worker:ライター + トランスレーター

typescript
// src/workers/content-processor.ts
interface Env {
  CONTENT_QUEUE: Queue;
  POSTS_KV: KVNamespace;
  ANTHROPIC_API_KEY: string;
}

const LOCALES = ["ar","de","es","fr","hi","it","ja","ko","nl","pt","ru","zh"];

export default {
  async queue(batch: MessageBatch<ContentJob>, env: Env): Promise<void> {
    for (const msg of batch.messages) {
      const job = msg.body;

      if (job.type === "generate") {
        const post = await generatePost(job.topic, env.ANTHROPIC_API_KEY);
        await env.POSTS_KV.put(`post:${job.slug}:en`, post);

        // 翻訳をファンアウト
        for (const locale of LOCALES) {
          await env.CONTENT_QUEUE.send({
            type: "translate",
            slug: job.slug,
            locale,
            sourceText: post,
          });
        }
      }

      if (job.type === "translate") {
        const translated = await translatePost(
          job.sourceText,
          job.locale,
          env.ANTHROPIC_API_KEY,
          // コスト削減のため翻訳にはHaikuを使用
          "claude-haiku-3-5-20241022"
        );
        await env.POSTS_KV.put(`post:${job.slug}:${job.locale}`, translated);
      }

      msg.ack();
    }
  },
};

async function generatePost(topic: string, apiKey: string): Promise<string> {
  const res = await fetch("https://api.anthropic.com/v1/messages", {
    method: "POST",
    headers: {
      "x-api-key": apiKey,
      "anthropic-version": "2023-06-01",
      "content-type": "application/json",
    },
    body: JSON.stringify({
      model: "claude-sonnet-3-5-20241022",
      max_tokens: 4096,
      messages: [{ role: "user", content: `Write a detailed blog post about: ${topic}` }],
    }),
  });
  const data = await res.json<{ content: Array<{ text: string }> }>();
  return data.content[0].text;
}

async function translatePost(
  text: string,
  locale: string,
  apiKey: string,
  model: string
): Promise<string> {
  const res = await fetch("https://api.anthropic.com/v1/messages", {
    method: "POST",
    headers: {
      "x-api-key": apiKey,
      "anthropic-version": "2023-06-01",
      "content-type": "application/json",
    },
    body: JSON.stringify({
      model,
      max_tokens: 4096,
      messages: [
        {
          role: "user",
          content: `Translate the following blog post to ${locale}. Preserve all markdown. Keep code blocks in English.\n\n${text}`,
        },
      ],
    }),
  });
  const data = await res.json<{ content: Array<{ text: string }> }>();
  return data.content[0].text;
}

代替案との比較

プラットフォーム基本料金リクエストあたりコストコールドスタートTypeScript DX
Cloudflare Workers$0〜$5/月ほぼゼロサブミリ秒優秀
AWS Lambda$0(制限あり)$0.20/100万リクエスト100ms〜1s良好
Vercel Functions$0(制限あり)使用量ベース200ms〜2s良好
自己ホストVPS$5〜$20/月$0なし(常時稼働)任意
Fly.io Machines$0(制限あり)GB秒あたり約500ms良好

自己ホストはCloudflareが負ける唯一のケースです。$6/月のHetzner VPSはコールドスタートなし、リクエストあたりコストなしでNode 24/7を動かします。ただしデプロイ、稼働率、スケーリングは自己管理が必要です。私のボリュームでは、Workersがすべてを無料で処理します。

AWS Lambdaの比較は紙面では競争力があるように見えますが、Lambdaの最大実行時間15分は長いLLMチェーンにとって実際の制約です。WorkersにはPaidプランでCPUリミット30秒があります——Queuesを使って非同期作業をするため、単一のLambdaをブロックしない運用では問題ありません。

状態管理のためのKV

KVはCloudflareのグローバル分散キーバリューストアです。読み取りはどこでも高速(エッジキャッシュ)。書き込みは60秒以内にグローバルに伝播します。

コンテンツパイプラインでは、3つのキーパターンを使います:

typescript
// ジョブステータス
await kv.put(`status:${slug}`, JSON.stringify({ status, updatedAt: Date.now() }));

// 記事コンテンツ
await kv.put(`post:${slug}:${locale}`, markdownContent);

// 一覧用インデックス
const index = await kv.get<string[]>("index:posts", "json") ?? [];
await kv.put("index:posts", JSON.stringify([...index, slug]));

私のスケールでのKVコスト:$0。無料枠は1日1K書き込みと10万読み取りを提供します。1ヶ月あたり約300件のKVエントリを書き込みます(25記事 × 13ロケール = 325)。制限にはるか及びません。

月100記事以上を12言語で公開する場合、月約3.9万回の書き込みに達しますが——$5の有料プランに含まれる100万/月をまだ下回ります。

オペレーターの結論

完全なコンテンツパイプライン——生成、翻訳、保存、デプロイ——のインフラコストは月$5.10です($5 Cloudflare Workers Paid + 月10記事で$0.10 Claude API)。それだけです。サーバー管理なし、コンテナオーケストレーションなし、プロビジョニングされた同時実行性のしきい値に達するLambdaコールドスタートによる予想外の請求なし。

混合モデル戦略(ENにSonnet、翻訳にHaiku)で翻訳品質を落とすことなくClaudeのコストを80%削減できます。自分のボリュームで計算してみてください。Cloudflare + Claude Haikuがファウンダースケールでこの種のパイプラインを動かす本当に最安の方法だとわかるはずです。

続きを読む

AIプレイブックをメールでお届け

毎週水曜。28,400人以上の読者。無駄なし。

↵ すべての結果を見る esc esc で閉じる