テック技報最新号へ →
インフラ

Cloudflare プライベートロードバランサー: セッションアフィニティとハッシュ振り分けで同じユーザーを同じサーバーへ

Cloudflare One Client や Cloudflare WAN から私設ネットワークへ向かう通信を振り分けるプライベートロードバランサーで、ユーザーごとに同じエンドポイントへ送り続けられるようになった(2026-11-04)。

投稿 2026-11-04
#infra#cloudflare#load-balancing#cloudflare-one#tunnel#mesh#networking

何が困っていたか

社内の業務アプリなど、セッション状態を 1 台のサーバーのメモリに持つアプリをプライベート LB の後ろに置くと、リクエストごとに別サーバーへ振られてログインが切れたり、処理途中の状態が見えなくなったりする。これまでは LB を使わず 1 台に固定するか、アプリ側でセッションを外部ストアに出す必要があった。

2 つのやり方

方法設定場所動き
ハッシュによるエンドポイント振り分けダッシュボードでプールの Endpoint steering を Hash にするプール内で、ユーザーごとに決まったエンドポイントに割り当てる
セッションアフィニティAPI でロードバランサーの session_affinity を ip_cookie にするエンドポイントが正常でプール構成が変わらない限り、同じエンドポイントに送り続ける

ユーザーの見分け方は入口で変わる。

  • Cloudflare One Client から来た通信はデバイス単位で識別するので、Wi-Fi から 4G に切り替わって IP が変わっても同じエンドポイントのまま。
  • Cloudflare WAN の拠点など、それ以外の通信は送信元 IP で識別する。拠点の NAT の後ろにいる全員が 1 台に寄る可能性がある点に注意。

対象は Cloudflare Tunnel・Cloudflare Mesh・Cloudflare WAN の先にあるエンドポイント(エンドポイント = IP アドレス + 仮想ネットワーク)。

注意点

  • 固定されるのはエンドポイントであって、通信を運ぶ cloudflared や Mesh のレプリカではない。コネクタを冗長化していても、アプリのサーバー固定には影響しない。
  • エンドポイントが不健康になる、またはプールを編集すると割り当てが変わる。メンテで 1 台抜くとそのユーザーのセッションは切れる前提で考える。
  • 送信元 IP 方式は、拠点 NAT で偏りやすい。均等に分けたいならアプリ側でセッションを Redis などに出すほうが確実(ここは筆者の補足)。
  • Tunnel の私設 IP をエンドポイントにする場合は、その経路を含む仮想ネットワークの指定が必要。仮想ネットワーク ID の書き方は Workers VPC: network_id = "cf1:vnet:<UUID>" でバインディングごとに仮想ネットワークを選ぶ も参照。

出典