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

サーバーレス(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要素で構成されます。
- Lambda実行コスト: メモリ(GB) × 実行時間(秒) + リクエスト数
- API Gatewayリクエストコスト: HTTP APIの場合 100万件あたり$1.00
- 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%以上削減することができました。