CDN・DNS・Workers・Pages…… Cloudflare は結局何をしているのか?
このサイトは GitHub Pages でホストされている。もし今日からドメインを Cloudflare に向けたら、CDN・DNS・Workers・Pages のうちどれが何を代わりにやってくれるのか、説明できるだろうか。名前は聞いたことがあっても、DNS の向き先を切り替えた瞬間に裏で何が起きているかまで追った人は意外と少ない。
- Cloudflare の土台は「権威 DNS + リバースプロキシ」。ドメインのネームサーバーを向けると、DNS が返す IP が origin ではなく Cloudflare の anycast IP に変わり、そこから CDN・WAF・DDoS 対策が有効になる
- anycast は世界中の拠点が同じ IP アドレスを持つルーティング方式で、BGP 経路上いちばん近い拠点に自動的に振り分けられる。だからキャッシュも TLS 終端も「利用者に一番近い場所」で行われる
- Workers は VM やコンテナではなく V8 の isolate という軽量な単位で動く。Pages はその上に静的ホスティングを乗せた製品で、GitHub Pages との違いは配信網の規模よりも「edge で動的処理を足せるか」にある
ドメインを向けた瞬間に何が変わるのか ―― 権威 DNS という入口
ブラウザがドメイン名から IP アドレスを引くとき、問い合わせは再帰リゾルバ(キャッシュがなければルート → TLD → 権威サーバーの順に辿る)を経由し、最後にそのドメインを管理する権威 DNS サーバー(authoritative nameserver、ドメインの正式な DNS レコードを持つサーバー)から答えが返る。ドメインのレジストラでネームサーバーを Cloudflare のものに変更すると、以後この権威 DNS サーバーの役割を Cloudflare が担うことになる。
ここで効いてくるのが、レコードごとの「プロキシ状態」という切り替えだ。プロキシを無効(グレークラウド)にしたレコードは通常の DNS と同じく origin サーバーの IP をそのまま返す。一方プロキシを有効(オレンジクラウド)にすると、DNS が返す IP は origin ではなく Cloudflare 自身の anycast IP に変わる。この 1 つのトグルが、CDN・WAF・DDoS 対策をまとめて有効化するスイッチになっている。
anycast とリバースプロキシ ―― なぜ「一番近い拠点」が自動で選ばれるのか
通常の IP アドレスは 1 台のサーバーに紐づくが、anycast は世界中の複数拠点が同一の IP アドレスを同時に経路広報する方式だ。利用者からの通信は、BGP(インターネットの経路情報を交換するプロトコル)上でその利用者に一番近い経路を持つ拠点へ自動的にルーティングされる。特別な設定をしなくても、東京からのアクセスは東京近郊の拠点へ、ロンドンからのアクセスはロンドン近郊の拠点へ届く。
その拠点で動いているのがリバースプロキシ(クライアントに代わって origin へリクエストを仲介するサーバー)だ。キャッシュに目的のコンテンツがあればそのまま返し、なければ origin まで転送する。TLS の暗号化解除もこの拠点で行われるため、origin 側は復号処理を肩代わりしてもらえる。そして origin の IP アドレスはクライアントから見えなくなるので、DDoS 攻撃はまず拠点側で受け止められることになる。
ブラウザ │ DNS で example.com を問い合わせ ▼ Cloudflare 権威DNS │ 同じ anycast IP を返す ▼ BGP 的に一番近い edge 拠点 ├─ cache hit → 即応答 ├─ Workers 実行 → その場で生成 └─ cache miss → origin へ転送
通販の地域集配所にたとえるとわかりやすい。荷物を頼んだ人は本社倉庫の住所を知らなくても、自分の地域で一番近い集配所に届く。集配所に在庫(キャッシュ)があればその場で手渡され、なければ本社倉庫(origin)まで問い合わせてから届く。攻撃者が集配所に押し寄せても、本社倉庫の住所を知らない限り本体には届かない。anycast とリバースプロキシは、この「利用者ごとに一番近い窓口が自動で選ばれ、窓口が本体を代理で守る」構造をネットワーク上で実現している。
Workers ―― サーバーを増やすのではなく isolate を増やす
一般的なサーバーレス実行環境は、リクエストのたびにコンテナや VM を起動するコールドスタートのコストを抱えやすい。Cloudflare Workers は V8(Chromium や Node.js が使う JavaScript エンジン)が提供する isolate という軽量な実行単位を使う。公式ドキュメントによれば、isolate は Node.js プロセスをコンテナや VM で起動するのに比べておよそ 100 倍速く起動でき、1 つのランタイム上に数百〜数千の isolate を、互いのメモリ空間を分離したまま同居させられる。この起動コストの低さのおかげで、リクエストが来るたびに新しい実行環境を用意しても待ち時間がほぼ発生しない。
Workers は基本設定では 1 回のデプロイでコードが Cloudflare の全拠点に配られ、利用者に一番近い拠点で実行される。ここで「一番近い拠点で動くなら常に最速のはず」と思いたくなるが、実際はそう単純ではない。Worker が特定リージョンの DB に頻繁に問い合わせるような処理では、利用者の近くで実行するほど Worker から DB までの往復が長くなり、かえって遅くなることがある。この場合は Smart Placement という設定を有効にすると、実行場所が「利用者の近く」から「アクセス先データの近く」へ切り替わり、Worker と DB 間の往復を短縮できる。
Pages と GitHub Pages、何が違うのか
「git に push すると静的サイトが公開される」という体験そのものは両者で変わらない。このサイトも GitHub Actions が生成した HTML を main ブランチへ push し、GitHub Pages がそれを配信する形で動いている。GitHub Pages は静的ファイルをそのまま配るだけで、配信後にリクエスト単位の処理を差し込む仕組みは持たない。
Cloudflare Pages は Pages Functions という機能で Workers の実行環境をそのまま使えるため、ビルド済みの静的ファイルは変えずに、リダイレクトや認証チェックのような処理を edge に追加できる。つまり両者を分けているのは「静的ファイルを配る」性能そのものより、配った後にリクエスト単位のロジックを足せるかという構造上の違いだ。
実際に乗せ替えるとなると、変わる点は 2 つある。1 つ目はドメインのネームサーバーを Cloudflare に向け直す必要があること(最初のセクションの話に戻る)。2 つ目はデプロイの主導権で、GitHub Pages は GitHub Actions からの push だけで完結するが、Cloudflare Pages は Cloudflare 側の Git 連携か、Wrangler のような CLI で直接アップロードする Direct Upload のいずれかに、デプロイの仕組みごと乗せ替えることになる。
普段の開発で Cloudflare に触れる場面の多くは、ドメインのネームサーバー設定作業か、突然表示される bot 対策のチャレンジ画面、あるいは原因不明の 5xx エラーを調べる場面だろう。エラー画面や HTTP レスポンスに含まれる CF-Ray ヘッダーの値(Ray ID)を Cloudflare サポートや自社の障害調査チケットに添えると、どの拠点でどう処理されたリクエストかを追いやすくなる。
Cloudflare でプロキシされている公開サイトにヘッダーだけ問い合わせて、anycast が実際にどの拠点へ振り分けたかを覗いてみる。
curl -sI https://developers.cloudflare.com | grep -i cf-ray
Cf-Ray: 8c1a0bfedfe39436-nrt のような行が返るはずだ。ハイフンの後ろ 3 文字は処理した拠点の IATA 空港コードで、nrt なら成田、lax ならロサンゼルスの拠点を意味する。同じコマンドを別のネットワーク(自宅の Wi-Fi とスマホのテザリングなど)から叩くとコードが変わることがあり、それが BGP 経路に応じて anycast が最寄りの拠点を選び直している証拠になる。
- Cloudflare を挟むだけでサイトの表示速度が自動的に大きく速くなる — キャッシュされるのは主に静的アセットで、動的な HTML や API レスポンスはデフォルトではキャッシュされず origin まで転送される。速度改善の幅はキャッシュ可能な割合次第で一律ではない。
- Cloudflare は CDN 専業の会社 — 実際には権威 DNS とリバースプロキシを土台に、WAF や DDoS 対策のようなセキュリティ機能、Workers という実行環境まで抱えるプラットフォームで、CDN はその中の一機能にすぎない。
- GitHub Pages を Cloudflare Pages に乗せ替えても、ホスティング先が変わるだけで中身は同じ — Pages Functions によって edge でリクエスト単位の処理を足せるようになる点と、デプロイの仕組みが GitHub Actions 前提の運用とは別物になる点が構造的に変わる。
- 権威 DNS サーバー
- あるドメインの正式な DNS レコードを持ち、問い合わせに最終的な答えを返すサーバー。
- anycast
- 世界中の複数拠点が同一の IP アドレスを同時に経路広報し、BGP 経路上一番近い拠点に自動でルーティングする方式。
- リバースプロキシ
- クライアントに代わって origin サーバーへリクエストを仲介するサーバー。キャッシュ・TLS 終端・origin の IP 秘匿を担う。
- isolate
- V8 エンジンが提供する軽量な実行コンテキスト。コンテナや VM より大幅に高速に起動できる。
- Pages Functions
- Cloudflare Pages 上で Workers の実行環境を使い、静的サイトの配信にリクエスト単位の処理を足す機能。
- How Cloudflare works | Cloudflare Docs — 権威 DNS・anycast・リバースプロキシがどう連動するかの公式解説。
- How Workers works | Cloudflare Docs — V8 isolate モデルの仕組みと、コンテナ・VM との比較を公式ドキュメントで解説。
- Cloudflare HTTP headers | Cloudflare Docs — CF-Ray など Cloudflare 固有ヘッダーの仕様一覧。
- Cloudflare Pages overview | Cloudflare Docs — Pages のデプロイ方式(Git 連携・Direct Upload)と Pages Functions の公式概要。