CDN
世界中に配置したエッジサーバからコンテンツを配信し、速度と負荷を改善する仕組み。
概要
CDN(Content Delivery Network)は、世界中に配置した多数のサーバ(エッジサーバ)にコンテンツのキャッシュを置き、利用者に地理的に近い場所から配信するネットワークです。コンテンツの本来の置き場所である自分のサーバは「オリジン」と呼ばれ、CDNはその代理人として利用者の近くに立ちます。
効果は二重です。まず速度——光の速さにも限界があるため、東京のユーザが米国のサーバから取得すると往復だけで100ミリ秒以上かかりますが、都内のエッジからなら数ミリ秒です。次に負荷——大半のリクエストがエッジで完結するため、オリジンには全体のごく一部しか届かず、アクセス急増にも耐えられます。
CloudflareやAkamai、Amazon CloudFront、Fastlyが代表例です。画像やJS/CSSの配信という古典的な用途に加え、現在ではTLS終端、DDoS攻撃の吸収、さらにはエッジ上でのコード実行(エッジコンピューティング)まで、「サイトの入口」全般を担う存在になっています。
なぜ生まれたか
1990年代後半、Webの利用者が急増すると、2つの問題が深刻になりました。1つは距離です。コンテンツは1か所のサーバに置かれているのに利用者は世界中にいるため、遠い地域からは表示が遅い。もう1つは集中です。人気コンテンツやニュース速報にアクセスが殺到すると、1か所のサーバと回線では捌ききれず、サイトが落ちる——いわゆる「フラッシュクラウド」問題です。インターネットの父と呼ばれるティム・バーナーズ=リーがこの輻輳問題の解決を呼びかけ、それに応える形でMITの研究者らが1998年に創業したのがAkamaiでした。
解決のアイデアは「コンテンツのコピーを世界中にばら撒き、利用者を最寄りのコピーへ誘導する」こと。静的なコンテンツは誰に配っても同じなので、コピーして各地に置いても矛盾しません。この性質を利用して、距離の問題と集中の問題を同時に解決したのがCDNです。
詳細
最寄りのエッジへ誘導する仕組み
CDNの第一の仕掛けは「利用者をどうやって近くのエッジに接続させるか」です。主流の方式ではDNSを使います。サイトのドメインをCDN事業者のドメインへのCNAMEにしておくと、名前解決の際にCDN側のDNSが問い合わせ元の位置を判断し、最寄りのエッジのIPアドレスを返します。もうひとつの方式がエニーキャストで、世界中のエッジが同一のIPアドレスを名乗り、インターネットの経路制御によって自然に最寄りへ届く仕組みです(Cloudflareが代表例)。いずれにせよ利用者側は何も意識せず、いつものURLにアクセスするだけで近くのエッジに繋がります。
キャッシュヒットとキャッシュミス
エッジに着いてからの動きは、キャッシュの典型例です。エッジがコンテンツのコピーを持っているかどうかで、経路が分岐します。
持っていれば(キャッシュヒット)その場で応答して終わり、オリジンには一切アクセスしません。持っていなければ(キャッシュミス)、エッジがオリジンまで取りに行き、応答を利用者へ返すと同時に手元に保存します。次に同じコンテンツを求める利用者からはヒットになる——つまり、オリジンまでの往復のコストを払うのは最初の1人だけです。
何をどれだけキャッシュするかは、オリジンが返すHTTPのCache-Controlヘッダ(max-ageやs-maxage)で制御します。全リクエスト中ヒットで捌けた割合を「キャッシュヒット率」と呼び、CDN運用の最重要指標です。
キャッシュ無効化という難問
CDN運用の最大の落とし穴は「古いコンテンツが配られ続ける」ことです。オリジンのファイルを更新しても、エッジのキャッシュは有効期限が切れるまで古いままです。対策の定石は2つあります。緊急時は「パージ」——CDNのAPIでキャッシュを明示的に消す操作です。より根本的なのが「キャッシュバスティング」で、ファイル内容のハッシュをファイル名に含め(app.a1b2c3.jsのように)、更新のたびに別URLとして配信する手法です。URLが変われば古いキャッシュは参照されなくなるため、静的アセットには「1年キャッシュ+ハッシュ付きファイル名」が事実上の標準になっています。逆に、ユーザごとに内容が変わるページやCookieに依存する応答を誤ってキャッシュすると、他人の個人情報が配信される重大事故になります。「何をキャッシュしてよいか」の設計はCDN導入時の最重要検討事項です。
静的配信からエッジコンピューティングへ
現代のCDNは配信以外の役割も抱え込んでいます。まずTLS終端と証明書管理。利用者とのHTTPS接続をエッジで終端するため、証明書の設定・更新をCDN側に任せられます。次にセキュリティで、DDoS攻撃のトラフィックを世界中のエッジで薄く吸収し、WAF(Webアプリケーションファイアウォール)で攻撃リクエストを入口で弾きます。この意味でCDNは、巨大な分散リバースプロキシだと言えます。
さらに近年は、エッジサーバ上で開発者のコードを実行する「エッジコンピューティング」(Cloudflare Workers、Lambda@Edgeなど)が広がっています。A/Bテストの振り分けやパーソナライズのような「静的キャッシュでは無理だが、オリジンまで往復するには惜しい」処理を利用者の近くで実行でき、サーバレスの実行基盤としても存在感を増しています。SSGで生成した静的サイトをCDNから配る構成(いわゆるJamstack)は、この流れの代表的な成功例です。