システム開発インフラ
約9分
更新

Cloudflare Workersの実装設計:認証・キャッシュ・運用とLambdaとの使い分け

執筆・編集Malake株式会社
まず押さえたいこと

エッジコンピューティングとは、利用者に近い拠点(エッジ)でデータを処理することで、応答の遅れを抑え、オリジンサーバーの負荷を減らす配信の仕組みのことです。

この記事の要点

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(エッジ) AWS Lambda(リージョン)
実行場所 Cloudflareのグローバルネットワーク 指定したリージョン(東京、バージニアなど)
起動速度 V8 Isolatesを使い、起動の遅れを抑えやすい 数百ms〜数秒(コールドスタートあり)
課金の仕組み リクエスト数 + CPU時間(安価) 実行時間(GB-seconds) + リクエスト数
制約 実行時間とメモリの上限が厳しい 時間のかかる処理や、メモリを多く使う処理にも対応できる

静的配信に近い軽いAPIや、リクエストの振り分けなどには、Workersが候補になります。一方、時間のかかる処理、多くのランタイム機能を必要とする処理、AWS内のデータの近くで動かしたい処理は、Lambdaのほうが扱いやすい場合があります。料金表に加えて、処理にかかる時間、使うライブラリ、データの置き場所で判断します。

代表的な構成パターン(静的+BFF)

画面は静的配信に任せ、動的な処理だけをWorkersで行う構成が基本の形です。PagesとWorkersのどちらを使うかは、Cloudflare PagesとWorkersの違い:構成を選ぶための判断表で扱っています。この記事では、Workersで動的な処理を実装することを前提に、その設計と運用を説明します。

運用の費用を含めた構成の判断は、中小企業サイトの運用コストを抑える方法で整理しています。また、フロントエンドとAPIをリポジトリごとに分ける場合は、疎結合アーキテクチャの設計が前提になります。

1. 利用者 → Cloudflare Pages(CDNのエッジ)

最寄りのエッジから、キャッシュされたHTMLやJavaScriptを受け取ります。オリジンまで往復しないため、距離による遅れが出にくくなります。

2. 画面(フロントエンド) → Cloudflare Workers(BFF)

ブラウザから、動的なデータ(在庫、マイページの情報など)をWorkersへ要求します。

3. Workers → 外部のAPI / DB

WorkersがAPIキーを付けて外部のAPI(ヘッドレスCMS、DBなど)を呼び出し、結果を整えて返します。

この構成の利点は、オリジンサーバー(重い処理をするサーバー)への負荷を小さくできることです。静的ファイルへのアクセスはオリジンに届かず、動的なリクエストも、Workersがキャッシュや軽い処理で代わりに受け持ちます。

認証・Secrets・環境変数の扱い

フロントエンドの開発で特に注意したいのが、APIキーやシークレットトークンの漏えいです。

原則は、Secretsをブラウザに届くコードに含めないことです。

  • 危険な書き方:
    Reactのコードに const API_KEY = "sk-..." と書く。
    → ブラウザの「ソースを表示」などで、誰でも見られてしまいます。
  • 安全な書き方:
    APIキーはCloudflare Workersの環境変数に保存し、画面側からはキーを付けずに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の使い方の例:

  • ニュース一覧(誰にでも同じ内容): max-age=600(10分キャッシュ)。誰が見ても同じ内容なので、エッジから返し続けます。
  • ユーザー情報(利用者ごとの内容): no-store(キャッシュしない)。常にDBから最新の情報を取得します。
  • 検索結果: s-maxage=3600(1時間)。同じキーワードでの検索による負荷を下げます。

キャッシュできる範囲を先に決めておくと、オリジンやデータベースへの不要なアクセスを減らせます。個人情報を含むレスポンスや、権限によって内容が変わる画面は、共有のキャッシュに入れないように設計します。

運用(ログ・監視・障害対応)

サーバーレスでは、サーバーの管理は不要になりますが、運用がなくなるわけではありません。サーバーに入ってログを見ることができないため、何を記録し、どこで確認するかを前もって決めておきます。

  • ログの保存:
    Workers Logsで実行ログを保存・検索できます(保存期間やサンプリング率はプランによって異なります)。長期間の保管や、外部のSIEMへの集約が必要な場合は、LogpushやDatadogとの連携を設定します。
  • リアルタイムの確認:
    Wrangler tail コマンドで、今起きているエラーをターミナルで続けて確認できます。開発中のデバッグで役立ちます。
  • バージョン管理:
    PagesもWorkersも、過去のデプロイへ1クリックで戻す(ロールバック)機能があります。障害が起きたときは、原因を直すより先に、前のバージョンへ戻すかどうかを判断すると、影響が続く時間を短くできます。

よくある落とし穴(CORS/ルーティング等)

導入するときにつまずきやすい点を挙げます。

  • CORSのエラー:
    Pages(ドメインA)からWorkers(ドメインB)を呼び出すと、ブラウザが通信をブロックします。Workers側で、適切な Access-Control-Allow-Origin ヘッダーを返すように実装します。
  • Node.jsのAPIとの違い:
    Workersはブラウザと同じ系統のV8エンジンで動いており、Node.jsそのものではありません。fs モジュールなどは使えないため、ライブラリを選ぶときに、Workersで動くかを確かめます(参考:型安全にWorkersを実装するTypeScript開発環境)。

CPU時間とメモリの制約

Workersには、1回のリクエストあたりのCPU実行時間とメモリ使用量に上限があります。主に制限されるのはCPU時間で、外部APIの応答待ちなど、CPUを使わない時間は含まれません。上限はプランによって異なり、有料プランでは大きく引き上げられています。
画像のリサイズや複雑な計算はCPU時間を多く使うため、エラー(1101など)になることがあります。重い処理は、クライアント側で行うか、AWS Lambdaなどを別に非同期で呼び出す構成が選択肢になります。

チェックリスト(構築前に決める)

Cloudflareで構築を始める前に確認する項目です。

押さえておきたい点

Cloudflareは費用と速度の面で利点がありますが、従来のサーバーとは運用の進め方が違います。まずは問い合わせフォームの送信処理のような小さな機能でWorkersを使い、ログの確認やロールバックの手順に慣れてから主要な機能に広げると、つまずきを抑えられます。

自社の状況を確認する

  • □ PagesとWorkersの役割分担(どこまで静的にするか)が決まっている
  • □ 環境変数(Secrets)の管理ルール(.env はコミットしないなど)を関係者に伝えている
  • □ ブラウザから直接呼び出してはいけないAPI(管理用のものなど)を洗い出している
  • □ CORSの設定(許可するオリジンのドメイン)を決めている
  • □ ログの保存先(Datadog、Sentryなど)が決まっている
  • □ デプロイの方法(GitHub ActionsかPagesの標準機能か)が決まっている
  • □ ロールバックの手順を文書にしている
  • □ 使うライブラリがWorkersの実行環境(Edge Runtime)で動くことを確かめている
  • □ 独自ドメインのDNSを設定する権限(Cloudflareへ移す必要があるか)を確認した
  • □ 利用量の上限と課金のアラートを設定している

よくある質問

Q. Cloudflare PagesとVercelは何が違いますか?

どちらもホスティングの環境ですが、Cloudflare Pagesは、エッジのネットワークの広さと、転送量の無料枠の大きさに強みがあります。Next.jsの機能をすべて使いたい場合はVercel、費用と速度を重視する場合はPages、という使い分けが考えられます。

Q. 既存のWordPress環境と共存できますか?

はい。コンテンツの管理にはWordPressを残し、表示する部分だけをNext.jsとCloudflare Pagesで作る方法(ヘッドレスCMS化)で共存できます。

業務に合わせて、使い続けられるシステムをつくります。

要件整理、試作、実装、受入、公開後の運用まで進めます。

システム・アプリ開発の支援内容を見る

この分野の全体像

モダンWeb開発の構成判断:Next.jsとヘッドレスCMSをどう組み合わせるか

この分野の全体像と判断の順序をまとめた記事です。

全体像を読む

IT課題を、
優先順位から整理します。

Malakeは外部IT責任者として、現状の確認から実装・運用まで支援します。