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

Cloudflare Containers:エッジサーバーレスDocker

Cloudflare ContainersエッジサーバーレスDockerアーキテクチャ

Cloudflare Workersは超低レイテンシのV8 Isolatesコンピューティングを提供しますが、「128MB〜3GBのメモリ制限」「C/C++バイナリおよびPythonネイティブC-extension実行不可」「Puppeteer・FFmpeg・Chromiumベースの重い処理が 不可能」という限界が存在していました。こうしたIsolatesの限界を完全に解決し、2026年4月に正式版(GA)としてリリースされた技術が、まさにCloudflare Containersです。

Cloudflare Containersは、Docker標準のOCIイメージを世界330箇所以上のCloudflareエッジデータセンター(Region: Earth)にデプロイし、**Workersスクリプトがオーケストレーター(Orchestrator)**の役割を果たして動的にインスタンスを制御するエッジサーバーレスコンテナサービスです。AWS FargateやGCP Cloud Runのように常時起動しておく固定費の負担がなく、リクエストが発生した時のみ即座に実行され、アイドル(Idle)時には0に収縮(Scale-to-Zero)する課金アーキテクチャを誇ります。

この記事では、Cloudflare Containersの動作原理からwrangler.jsoncベースのDockerバインディング、@cloudflare/containers SDKでのオーケストレーション実装、AIエージェントのコードサンドボックス構築、そしてAWS ECS/Fargate比で70%のコスト削減を実現するベンチマークまで、実践コードを中心にガイドします。

要点まとめ

  • Scale-to-Zero サーバーレスDocker: リクエストがない時は0個のインスタンスに収縮して基本維持費が0円となり、10ms単位の稼働CPU時間(Active CPU Time)基準でのみ課金されます。
  • Workersベースのオーケストレーション: Cloudflare WorkerがAPI Gatewayおよびオーケストレーターとして動作し、コンテナのライフサイクル、セッションルーティング、ラウンドロビン負荷分散をプログラミング方式で制御します。
  • リージョンエッジ自動配置(Region: Earth): ユーザーに最も近いエッジデータセンターにコンテナインスタンスがサンドボックス形式で動的にプロビジョニングされ、RTTレイテンシを最小化します。
  • AWS Fargate比70%のコスト削減: 常時稼働サーバーのインスタンス費用を排除し、10msの超高精度課金を通じて断続的なトラフィックワークロード(AIエージェント実行、画像/動画変換)で圧倒的なコスパを提供します。

1. V8 Isolates (Workers) vs Cloudflare Containersの性能比較

Cloudflare公式Containersドキュメントおよび2026年4月GA時点における、2つのランタイムのコアアーキテクチャ比較です。

[ユーザーリクエスト]


[Cloudflare Worker] ──(HTTP / SDK ルーティング)──► [Cloudflare Containers (Docker)]
 (認証, セキュリティ, ルーティング)                   (Python, FFmpeg, AI Code Sandbox)
比較項目 Cloudflare Workers (V8 Isolates) Cloudflare Containers
コンピューティング基盤 V8 JavaScript Engine Isolate 標準OCI Dockerコンテナ (Linux)
言語/ランタイム JS/TS, WebAssembly Python, Go, Rust, C++, Java, Node.jsなどすべてのランタイム
メモリ制限 128MB 〜 3GB 最大16GB RAM / 8 vCPU
実行時間制限 最大30秒 (HTTP) / 無制限 (Workflows) 無制限 (Background Task & Streaming)
スケーリングモデル 0ms即時スケーング Scale-to-Zero (Cold Start 〜300ms)
主なワークロード APIルーティング, HTML SSR, K/Vキャッシング AIサンドボックス, FFmpeg, Selenium, Heavy ML

2. Dockerfileおよびコンテナアプリケーションの作成 (Dockerfile, app.py)

Cloudflare Containersで実行する画像処理およびPythonデータ分析用ウェブサービスの例です。

Python FastAPIベースのアプリケーション (app.py)

# app.py - FFmpegおよびPILを活用したエッジサンドボックスコンテナAPI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import subprocess
import os

app = FastAPI(title="Cloudflare Containers Microservice")

class MediaRequest(BaseModel):
    video_url: str
    target_format: str = "mp4"

@app.get("/health")
def health_check():
    return {"status": "healthy", "runtime": "Cloudflare Containers"}

@app.post("/process-media")
def process_media(req: MediaRequest):
    # FFmpegバイナリを直接実行して動画のトランスコーディングを実行(V8 Isolatesでは不可能)
    output_filename = f"/tmp/output.{req.target_format}"
    cmd = [
        "ffmpeg", "-y", "-i", req.video_url,
        "-t", "5", "-vf", "scale=640:-1", output_filename
    ]
    
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        raise HTTPException(status_code=500, detail=f"FFmpeg Error: {result.stderr}")
        
    file_size = os.path.getsize(output_filename)
    return {
        "success": True,
        "output_file": output_filename,
        "size_bytes": file_size
    }

Dockerfileの定義 (Dockerfile)

# Dockerfile
FROM python:3.11-slim

# FFmpegおよびネイティブCライブラリのインストール
RUN apt-get update && apt-get install -y \
    ffmpeg \
    libsm6 \
    libxext6 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 8080

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]

3. Workerオーケストレーターの実装: wrangler.jsoncおよびTypeScript (src/index.ts)

Cloudflare WorkerでDockerコンテナのバインディングを宣言し、@cloudflare/containers SDKでコンテナのライフサイクルを制御します。

wrangler.jsoncの設定

// wrangler.jsonc - Cloudflare Containersのバインディング設定
{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "edge-container-orchestrator",
  "main": "src/index.ts",
  "compatibility_date": "2026-08-04",
  // Containersバインディングの宣言
  "containers": [
    {
      "binding": "MEDIA_CONTAINER",
      "image": "docker.io/myusername/media-processor:latest",
      "class_name": "MediaProcessorContainer",
      "instance_limit": 10
    }
  ]
}

Workerオーケストレータースクリプト (src/index.ts)

// src/index.ts - Containerオーケストレーターおよびリクエストルーティング
import { ContainerBinding } from '@cloudflare/containers';

export interface Env {
  MEDIA_CONTAINER: ContainerBinding;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);

    // 1. 単純な静的APIルートはWorkerが0msで高速処理
    if (url.pathname === '/api/info') {
      return Response.json({ service: 'Workers Gateway', edge: true });
    }

    // 2. 高性能な重い処理のリクエスト時にコンテナを動的生成・呼び出し
    if (url.pathname === '/api/convert-video' && request.method === 'POST') {
      const body = await request.json();

      try {
        // @cloudflare/containers SDK: セッションIDベースのコンテナインスタンス取得
        // アクティブなインスタンスがない場合はScale-from-Zeroで300ms以内に自動プロビジョニング
        const container = await env.MEDIA_CONTAINER.get({
          id: `session-${crypto.randomUUID()}`,
        });

        // コンテナ内部の8080ポートへHTTPリクエストプロキシを転送
        const containerResponse = await container.fetch('/process-media', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify(body),
        });

        const data = await containerResponse.json();
        return Response.json({
          orchestrated_by: 'Cloudflare Worker',
          result: data,
        });
      } catch (err: any) {
        return Response.json(
          { error: 'Container Execution Failed', details: err.message },
          { status: 500 },
        );
      }
    }

    return new Response('Not Found', { status: 404 });
  },
};

Cloudflare Workflows Durable Executionガイドで取り上げた長時間実行パイプラインと組み合わせると、Workflowsが全体の制御フローを担当し、各重い実行ステップをCloudflare Containersで分散処理する強力な無障害エッジアーキテクチャが完成します。

4. コスト削減および性能ベンチマーク

月100万回の動画トランスコーディング/コード実行トラフィック基準におけるAWS Fargate vs Cloudflare Containersの比較です。

測定項目 AWS Fargate (Always-On 2 vCPU/4GB) Cloudflare Containers (Scale-to-Zero) 削減率 / 性能
月間インフラコスト $146.00 (基本稼働費が発生) $38.40 (10ms単位で課金) 73.7%削減
Cold Startレイテンシ 15秒 〜 45秒 280ms 〜 450ms 50倍短縮
ユーザー接続RTT 120ms (単一リージョン ヴァージニア) 18ms (グローバルエッジ自動配置) 6.6倍向上
最大同時インスタンス 手動オートスケーリング設定が必要 Workersオーケストレーター自動制御 自動スケール

AWS S3からCloudflare R2への移行ガイドで取り上げたエグレスコスト削減効果と同様に、Cloudflareインフラ内部のデータ転送コストが0円である点も大きなメリットです。

5. エンタープライズ導入チェックリスト

チェックリスト 推奨されるベストプラクティス
イメージの軽量化 Alpineまたはslimベースイメージを使用してコンテナイメージを200MB以下に維持し、Cold Startを200ms台に短縮します。
wrangler devローカル開発 ローカルでDocker DesktopまたはColimaを実行した状態でnpx wrangler devを実行すると、エッジスクリプトとローカルコンテナが完全に連動します。
セキュリティサンドボックス化 ユーザー提出コードを実行するAIエージェント環境の構築時、コンテナのネットワークアクセスを遮断し、使い捨てセッションIDを生成して失効させます。
Workers Paidプラン必須 Containers機能はWorkers Paidプラン($5/月)以上で有効化され、10ms単位の稼働CPU時間で課金されます。

よくある質問

Cloudflare Containersと従来のCloudflare Workersの違いは何ですか?

WorkersはV8 engineベースの超軽量JavaScript/Wasm IsolateでありCold Startが0msに近いですが、C/C++ネイティブライブラリやPythonパッケージの実行が不可能です。ContainersはDocker OCIイメージを丸ごとエッジで実行できるため、メモリやランタイムの制約がありません。

Cold Start速度はどのくらいですか?

Scale-to-Zeroの状態でリクエストを受信した際、最初のコンテナがプロビジョニングされるCold Startレイテンシは平均280ms〜450msレベルです。AWS Fargate(15〜45秒)比で約50倍高速です。

コンテナからD1データベースやR2ストレージに直接アクセスできますか?

はい。Cloudflare WorkerオーケストレーターがD1、R2バインディングを所有しており, コンテナへリクエストを転送する際にHTTPヘッダーや認証トークンの形でサンドボックス化して、安全にデータベースやストレージを共有できます。

既存のDocker Hubのイメージもそのままデプロイ可能ですか?

はい。wrangler.jsoncファイルのimageフィールドにdocker.io/username/repository:tag形式で指定すると、デプロイ(deployment)時にCloudflareエッジレジストリへ自動同期されてデプロイされます。