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

AWS LambdaからCloudflare Workersへの移行ガイド:サーバーレスEgressコストを95%削減

AWS LambdaからCloudflare Workersへの移行によるコスト削減アーキテクチャ

サーバーレス(Serverless)構成で構築されたサービスが成長する際、クラウド請求書で最も大きなインパクトを与えるのが**データ転送費用(Egress Fee)**です。コンピューティング時間やリクエスト数は予測可能な範囲に収まりますが、APIの応答データをユーザーに送信する際のOutbound通信料は、トラフィックの増加に伴い爆発的に跳ね上がります。

AWS LambdaとAPI Gatewayで運用していた当社のバックエンドは、月間データ転送量が5TBを超えた時点で、サーバーレス全体の請求額の75%以上がネットワークEgress費用で占められる事態に直면しました。そこでエッジコンピューティング基盤であるCloudflare Workersへの完全移行を実施し、Egressコストを95%以上削減すると同時に、コールドスタートの遅延を80%短縮することに成功しました。

本記事では、AWS LambdaからCloudflare Workersへ移行したアーキテクチャ上の理由、詳細な料金比較、Node.jsハンドラーのV8 Isolateへの書き換え手法、およびデータベース接続ボトルネックの解決策を解説します。

要約

  • Egressコストゼロ(Zero Egress): AWSはインターネット向けの転送データに1GBあたり$0.09を課金しますが、Cloudflare WorkersはWorker応答データの**Egress費用が完全無料($0)**です。
  • コールドスタートの解消: AWS LambdaはVPC接続やコンテナ起動に伴い200ms〜800msのコールドスタートが発生しますが、V8 IsolateベースのCloudflare Workersは5ms未満で即座に起動します。
  • ハンドラーの標準化: Node.js固有モジュール(fs, netなど)に依存していたコードを、Web Standard API(Fetch API, Streams)またはHonoフレームワークへ移行する必要があります。
  • DBコネクション最適化: エッジからのRDBMS(PostgreSQL/MySQL)接続時は、接続数の枯渇を防ぐためにCloudflare Hyperdriveなどのコネクションプーリング機構を導入します。

1. 移行の背景:AWSに潜むトラップ「Egress費用」

AWS上でLambdaを外部HTTP APIとして公開する場合、前段にAmazon API Gatewayまたは**Application Load Balancer (ALB)**を配置するのが一般的です。この際のコスト構造は以下の3要素で構成されます。

  1. Lambda実行コスト: メモリ(GB) × 実行時間(秒) + リクエスト数
  2. API Gatewayリクエストコスト: HTTP APIの場合 100万件あたり$1.00
  3. AWS Data Transfer Out (Egress): インターネット向け転送量 1GBあたり$0.09

レスポンスデータが大きくなると、3要素目のEgress費用が他すべてのコンピューティング費用を圧倒するようになります。

5TB/月 Egressにおけるコスト比較表

以下は、月間1,000万リクエスト・平均レスポンスサイズ500KB(計5TB Egress)における実測比較です。

項目 AWS (Lambda + API Gateway HTTP API) Cloudflare Workers (Paidプラン) 削減率
基本/プラン料金 $0.00 (従量課金) $5.00/月 (1,000万リクエスト含む) -
リクエスト費用 $10.00 (1,000万件 × $1.00/1M) $0.00 (プラン内に含む) 100%
コンピューティング費用 約 $18.50 (256MB, 200ms実行) $0.00 (3,000万ms CPU時間含む) 100%
ネットワークEgress費用 $450.00 (5,000GB × $0.09) $0.00 (Worker応答データ転送無料) 100%
合計月額費用 $478.50 $5.00 98.9% 削減

2. ハンドラーコードのリファクタリング:AWS Lambda → Cloudflare Workers

AWS Lambda固有の(event, context)構造から、W3C Web Standardに準拠したWeb API構造へ書き換えます。

AWS Lambda 従来コード (Node.js)

exports.handler = async (event) => {
  const body = JSON.parse(event.body || '{}');
  const userId = event.queryStringParameters?.userId;

  return {
    statusCode: 200,
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ message: "Success", userId })
  };
};

Cloudflare Workers 移行後コード (Hono Framework)

import { Hono } from 'hono';
import { cors } from 'hono/cors';

type Bindings = { API_KEY: string; };
const app = new Hono<{ Bindings: Bindings }>();

app.use('*', cors());

app.post('/api/process', async (c) => {
  const userId = c.req.query('userId');
  return c.json({
    message: "Success",
    userId,
    workerRegion: c.req.raw.cf?.colo || 'UNKNOWN'
  });
});

export default app;

3. データベース接続問題の解決 (Hyperdrive)

エッジ環境からの直接DB接続によるコネクション枯渇を防ぐため、Cloudflare Hyperdriveを使用して接続のプールとクエリのキャッシュを実施します。

# wrangler.toml
name = "api-worker"
main = "src/index.ts"
compatibility_date = "2026-07-01"

[hyperdrive]
binding = "HYPERDRIVE"
id = "your-hyperdrive-id"
import { Client } from 'pg';

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
    await client.connect();
    const { rows } = await client.query('SELECT * FROM users LIMIT 10');
    await client.end();
    return Response.json(rows);
  }
};

結論

AWS Lambdaは強固なエコシステムを持ちますが、HTTP APIとして大量のレスポンスデータを配信する際のEgress費用は非常に高額になります。応答転送量のEgress費用が無料であるCloudflare Workersを採用することで、イン프ラ費用を95%以上削減することができました。