Cloudflare Workersの実装設計:認証・キャッシュ・運用とLambdaとの使い分け
まず押さえたいことエッジコンピューティングとは、ユーザーに最も近い拠点(エッジ)でデータ処理を行うことで、遅延を抑え、オリジンサーバーの負荷を軽減する配信技術のことです。
この記事の要点
Workersで動的処理を実装するときに決めることは、Secretsの置き場所、キャッシュの対象と期間、ログの保存先、障害時の切り分け方法の4点です。エッジ実行は起動遅延が小さい一方で実行時間とメモリの上限が厳しいため、長時間処理や重いライブラリを使う処理はAWS Lambdaなどリージョン実行へ寄せる判断が必要になります。まずは静的配信に必要最小限の動的処理を足す構成から始めます。
この記事でわかること
- Cloudflare Workers vs AWS Lambda (サーバーレス比較)
- 代表的な構成パターン(静的+BFF)
- 認証・Secrets・環境変数の扱い
- 開発設定とデプロイ(wrangler.toml)
- キャッシュ戦略(何をキャッシュするか)
- 運用(ログ・監視・障害対応)
- よくある落とし穴(CORS/ルーティング等)
- チェックリスト(構築前に決める)
Cloudflare Workers vs AWS Lambda (サーバーレス比較)
従来のサーバーレス(AWS Lambda等)と、エッジサーバーレス(Cloudflare Workers)は、アーキテクチャが根本的に異なります。
| 比較軸 | Cloudflare Workers (Edge) | AWS Lambda (Region) |
|---|---|---|
| 実行場所 | Cloudflareのグローバルネットワーク | 指定したリージョン (東京、バージニア等) |
| 起動速度 | V8 Isolatesを利用し、起動遅延を抑えやすい | 数百ms〜数秒 (コールドスタートあり) |
| 課金体系 | リクエスト数 + CPU時間 (安価) | 実行時間 (GB-seconds) + リクエスト数 |
| 制約 | 実行時間やメモリに厳格な上限あり | 長時間処理や重いメモリ処理も可能 |
静的配信に近い軽量APIやリクエスト制御はWorkersが候補になります。一方、長時間の処理、豊富なランタイム、AWS内のデータへ近接させたい処理はLambdaが扱いやすい場合があります。料金表だけでなく、処理時間、依存ライブラリ、データの場所で判断します。
代表的な構成パターン(静的+BFF)
画面は静的配信に任せ、動的処理だけをWorkersへ寄せる構成が基本形です。PagesとWorkersのどちらを使うかという選択自体は、Cloudflare PagesとWorkersの違い:構成を選ぶための判断表で扱っています。本記事はWorkersで動的処理を実装する前提で、その設計と運用を扱います。
運用コストを含めた構成の判断は中小企業サイトの運用コストを抑える方法で整理しています。また、フロントエンドとAPIをリポジトリレベルで分離する場合は疎結合アーキテクチャの設計が前提になります。
1. User → Cloudflare Pages (CDN Edge)
まずは最寄りのエッジから、キャッシュされたHTML/JSを受信します。オリジンへの往復がないため、遅延は距離に依存しにくくなります。
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.jsonc が推奨形式ですが、wrangler.toml も引き続き利用できます)。最小限の構成例は以下の通りです。
name = "my-worker-app"
main = "src/index.ts"
compatibility_date = "2026-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時間)。同じキーワードでの検索負荷を下げる。
キャッシュが成立する範囲を先に決めると、オリジンやデータベースへの不要なアクセスを減らせます。個人情報を含むレスポンスや権限ごとに内容が変わる画面は、共有キャッシュへ混ぜない設計が必要です。
運用(ログ・監視・障害対応)
サーバーレスは「サーバー管理が不要」ですが、「運用が不要」なわけではありません。むしろ、ログが見えにくくなるため、意図的な可視化が必要です。
- ログの保存:
Workers Logsで実行ログを保存・検索できます(保存期間やサンプリング率はプランにより異なります)。長期保管や外部SIEMへの集約が必要な場合は、LogpushやDatadog連携を設定します。 - リアルタイム監視:
「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開発環境での実装時にライブラリ選びに注意が必要です。
CPU時間とメモリの制約
Workersには1回のリクエストに対する「CPU実行時間」と「メモリ使用量」の上限があります。制限されるのは主にCPU時間で、外部APIの応答待ちなどCPUを使わない時間は算入されません。上限はプランにより異なり、有料プランでは大幅に引き上げられています。
画像のリサイズや複雑な計算はCPU時間を消費するためエラー(1101等)になることがあり、重い処理はクライアント側で行うか、別途AWS Lambdaなどを非同期で呼ぶアーキテクチャが選択肢になります。
チェックリスト(構築前に決める)
Cloudflare環境での構築プロジェクトを始める前の確認リストです。
押さえておきたい点
自社の状況を確認する
- □ PagesとWorkersの役割分担(どこまで静的化するか)が決まっている
- □ 環境変数(Secrets)の管理ルール(
.envはコミットしない等)が周知されている - □ フロントエンドから直接叩いてはいけないAPI(Admin系)が識別されている
- □ CORS設定(許可するオリジンドメイン)が定義されている
- □ ログの保存先(Datadog, Sentry等)が決まっている
- □ デプロイフロー(GitHub Actionsか、Pages標準機能か)が決まっている
- □ ロールバックの手順がドキュメント化されている
- □ 使用するライブラリがEdge Runtime(Workers)で動くか検証済みである
- □ カスタムドメインのDNS設定権限(Cloudflareへの移管要否)を確認した
- □ 課金アラート(Usage Limit)の設定を行っている
よくある質問
Q. Cloudflare PagesとVercelは何が違いますか?
どちらも優れたホスティング環境ですが、Cloudflare Pagesは「エッジネットワークの広さ」と「帯域幅(転送量)の無料枠の大きさ」に強みがあります。Next.jsのフル機能を使うならVercel、コストと速度重視ならPagesといった住み分けです。
Q. 既存のWordPress環境と共存できますか?
可能です。バックエンド(コンテンツ管理)としてWordPressを残し、フロントエンドだけをNext.js + Cloudflare Pagesで表示する「ヘッドレスCMS化」というアプローチで共存できます。
業務に合わせて、使い続けられるシステムを。
要件整理、試作、実装、受入、公開後の運用まで進めます。
モダンWeb開発の構成判断:Next.jsとヘッドレスCMSをどう組み合わせるか
この分野の全体像と判断の順序をまとめた記事です。