Cloudflare Pages/Workersでのエッジ配信とサーバーレス活用
Definitionエッジコンピューティングとは、ユーザーに最も近い拠点(エッジ)でデータ処理を行うことで、遅延を極小化し、オリジンサーバーの負荷を軽減する配信技術のことです。
TL;DR (要約)
Pagesは高速な静的配信、WorkersはBFF/APIや認証など動的処理に強みがあります。役割分担とSecrets管理、キャッシュ戦略を設計すると、運用負荷を抑えつつ性能を出せます。まずは「静的+必要最小限の動的」から始めるのが安全です。
この記事でわかること
- Cloudflare Workers vs AWS Lambda (サーバーレス比較)について学べます
- PagesとWorkersの役割分担(何をどこでやるか)について学べます
- 代表的な構成パターン(静的+BFF)について学べます
- 認証・Secrets・環境変数の扱いについて学べます
- 開発設定とデプロイ(wrangler.toml)について学べます
- キャッシュ戦略(何をキャッシュするか)について学べます
- 運用(ログ・監視・障害対応)について学べます
- よくある落とし穴(CORS/ルーティング等)について学べます
- チェックリスト(構築前に決める)について学べます
Cloudflare Workers vs AWS Lambda (サーバーレス比較)
従来のサーバーレス(AWS Lambda等)と、エッジサーバーレス(Cloudflare Workers)は、アーキテクチャが根本的に異なります。
| 比較軸 | Cloudflare Workers (Edge) | AWS Lambda (Region) |
|---|---|---|
| 実行場所 | 世界270都市以上 (ユーザーの最寄り) | 指定したリージョン (東京、バージニア等) |
| 起動速度 | 0ms (Isolate技術で爆速) | 数百ms〜数秒 (コールドスタートあり) |
| 課金体系 | リクエスト数 + CPU時間 (安価) | 実行時間 (GB-seconds) + リクエスト数 |
| 制約 | 実行時間やメモリに厳格な上限あり | 長時間処理や重いメモリ処理も可能 |
静的サイトの配信や軽量なAPIならCloudflareが圧倒的に有利ですが、動画変換や機械学習などの「重い処理」はAWS Lambdaの方が向いています。
PagesとWorkersの役割分担(何をどこでやるか)
Cloudflareのエコシステムは機能が豊富ですが、モダンなWeb開発において主役となるのは「Pages」と「Workers」の2つです。これらを混同せず、適材適所で使い分けることが成功の第一歩です。
💡 実践ガイド
中小企業がコストを抑えて安全にWebサイトを構築する具体的な手順については、👉 中小企業が無料〜安価に高品質HPを作る:Cloudflare Pages × Next.js 実務手順 で詳細に解説しています。
| 機能 | Cloudflare Pages | Cloudflare Workers |
|---|---|---|
| 主な用途 | フロントエンドのホスティング (HTML/JS/CSS/画像) |
APIサーバー、BFF、プロキシ (動的処理、認証、リダイレクト) |
| デプロイ | Git連携 (Pushで自動ビルド) | CLI (Wrangler) でデプロイ |
| ファイルシステム | 静的アセットを持つ | 原則コードのみ (KV/R2を利用) |
| 開発者体験 | Vercel / Netlifyに近い | AWS Lambdaに近い |
基本戦略は、「画面(UI)はPages、ロジック(API)はWorkers」です。Next.jsなどのフレームワークを使う場合、Pagesの中にFunctions(実体はWorkers)を含めることも可能ですが、大規模化を見越すならリポジトリレベルで分離する疎結合アーキテクチャを検討すべきです。
代表的な構成パターン(静的+BFF)
最もコストパフォーマンスが良く、スケーラビリティが高いのが以下の構成です。
1. User → Cloudflare Pages (CDN Edge)
まずは最寄りのエッジから、キャッシュされたHTML/JSを0.1秒で受信します。
2. Frontend → Cloudflare Workers (BFF)
ブラウザから動的なデータ(在庫、マイページ情報)をWorkersへリクエストします。
3. Workers → Upstream API / DB
WorkersがAPIキーを付与して外部API(Headless CMS, DBなど)を叩き、結果を整形して返します。
この構成のメリットは、「オリジンサーバー(重い処理をするサーバー)への負荷を極小化できる」点です。静的ファイルへのアクセスはオリジンに行かず、動的リクエストもWorkersがキャッシュや軽量処理を肩代わりします。
認証・Secrets・環境変数の扱い
フロントエンド開発で最も危険なのが、APIキーやシークレットトークンの漏洩です。
「Secretsをフロントに出さない」ことが鉄則です。
- NG (危険):
Reactコード内にconst API_KEY = "sk-..."と書く。
→ ブラウザの「ソースを表示」で誰でも見れてしまいます。 - OK (安全):
Cloudflare Workersの環境変数にAPIキーを保存し、フロントからはキー無しでWorkersを叩く。
Workers内でenv.API_KEYを付与して外部APIへプロキシする。
Cloudflareではダッシュボードから暗号化された環境変数を設定でき、コード内からは参照できますが、デプロイ後の値の閲覧はできないよう保護されています。
開発設定とデプロイ(wrangler.toml)
Cloudflare Workersの設定は wrangler.toml ファイル一つで管理します。最小限の構成例を見てみましょう。
name = "my-worker-app"
main = "src/index.ts"
compatibility_date = "2024-01-01"
# ■ 環境変数のバインディング
# シークレットはここには書かず、CLIで `npx wrangler secret put` して登録します
[vars]
API_HOST = "https://api.example.com"
# ■ KV (Key-Valueストア) の設定
[[kv_namespaces]]
binding = "MY_KV"
id = "xxxxxxxxxxxxxxxxxxxxx"
# ■ スマートプレースメント (最適配置) の有効化
# ユーザーに近いエッジではなく、DBに近いエッジで動かす場合にONにする
# [placement]
# mode = "smart"
このように、「インフラの設定」をコードとしてリポジトリ管理(IaC)できる運用性の高さも魅力の一つです。
キャッシュ戦略(何をキャッシュするか)
エッジ活用の醍醐味はキャッシュコントロールにあります。Workersを使えば、「特定のユーザーだけキャッシュしない」「1分だけキャッシュする」といった細かい制御が可能です。
Cache API活用例:
- ニュース一覧 (Public):
max-age=600(10分キャッシュ)。誰が見ても同じなので、エッジで返し続ける。 - ユーザー情報 (Private):
no-store(キャッシュなし)。常にDBから最新を取得。 - 検索結果 (Query):
s-maxage=3600(1時間)。同じキーワードでの検索負荷を下げる。
これらを適切に設定するだけで、バックエンドDBの負荷を1/10以下に減らすことも珍しくありません。
運用(ログ・監視・障害対応)
サーバーレスは「サーバー管理が不要」ですが、「運用が不要」なわけではありません。むしろ、ログが見えにくくなるため、意図的な可視化が必要です。
- ログストリーミング:
Workersのログは標準では保存されません。DatadogやLogpush連携を設定し、永続化します。 - リアルタイム監視:
「Wrangler tail」コマンドで、今起きているエラーをターミナルで流し見ることができます。開発中のデバッグに必須です。 - バージョン管理:
PagesもWorkersも、過去のデプロイメントに「1クリックでロールバック(切り戻し)」する機能があります。障害時は修正より先に、まず前バージョンに戻す判断が重要です。
よくある落とし穴(CORS/ルーティング等)
導入時によくハマるポイントを挙げます。
- CORS (Cross-Origin Resource Sharing) エラー:
Pages (Domain A) から Workers (Domain B) を叩く時、ブラウザがブロックします。Workers側で適切なAccess-Control-Allow-Originヘッダーを返す実装が必要です。 - Node.js APIの非互換:
Workersはブラウザ互換のV8エンジンで動いており、Node.jsではありません。fsモジュールなどは使えないため、型安全にWorkersを実装するTypeScript開発環境での実装時にライブラリ選びに注意が必要です。
💡 Tips: CPU時間とメモリの壁
Workers(特にFree/Standardプラン)には、1回のリクエストに対する「CPU実行時間」や「メモリ使用量」に厳しい制約があります。
画像のリサイズや複雑な計算を行うとエラー(1101等)になることがあるため、重い処理はクライアント側でやるか、別途AWS Lambdaなどを非同期で呼ぶアーキテクチャを検討しましょう。
チェックリスト(構築前に決める)
Cloudflare環境での構築プロジェクトを始める前の確認リストです。
重要ポイント
チェックリスト
- □ PagesとWorkersの役割分担(どこまで静的化するか)が決まっている
- □ 環境変数(Secrets)の管理ルール(
.envはコミットしない等)が周知されている - □ フロントエンドから直接叩いてはいけないAPI(Admin系)が識別されている
- □ CORS設定(許可するオリジンドメイン)が定義されている
- □ ログの保存先(Datadog, Sentry等)が決まっている
- □ デプロイフロー(GitHub Actionsか、Pages標準機能か)が決まっている
- □ ロールバックの手順がドキュメント化されている
- □ 使用するライブラリがEdge Runtime(Workers)で動くか検証済みである
- □ カスタムドメインのDNS設定権限(Cloudflareへの移管要否)を確認した
- □ 課金アラート(Usage Limit)の設定を行っている
モダンで拡張性の高いシステム開発
Next.jsやクラウドネイティブ技術を活用し、ビジネスを加速させるシステムを構築します。
モダンなWeb開発の標準:Next.jsとヘッドレスCMSによる構築
このテーマの全体像を把握し、より体系的な理解を深めましょう。