【テクニカル・上級編】 GCP Cloud CDNの静的・動的コンテンツキャッシュ制御(Cache-Controlヘッダー、Varyヘッダー) – クラウドインフラと仮想化ネットワーク実践ガイド

GCP Cloud CDNの深淵:キャッシュ制御とパケットレベルの最適化戦略

インフラエンジニアとして現場に立っていると、「CDNが効かない」「キャッシュの挙動が期待と違う」という相談を死ぬほど受けます。そのほとんどが、Cache-Controlヘッダーの表面的な理解か、あるいはオリジンサーバーから送出されるパケットの意図せぬ挙動に起因しています。

今回は、GCP Cloud CDNという巨大なグローバル・エッジネットワークを「正しく調教」するための、泥臭くもエレガントなキャッシュ戦略について解説します。

—

1. キャッシュの意思決定:Cache-ControlとVaryの解像度

Cloud CDNのキャッシュエンジンは、HTTP/1.1およびHTTP/2の仕様を厳格に遵守します。しかし、我々アーキテクトが意識すべきは「ブラウザキャッシュ」と「CDNキャッシュ」の分離です。

s-maxage vs max-ageの力学

多くのエンジニアが犯す過ちが、max-ageのみを指定し、CDN側のエッジサーバーにキャッシュ時間を委ねてしまうことです。

  • s-maxage: CDNのエッジサーバーがオブジェクトを保持する時間を指定します。
  • max-age: ブラウザ(クライアント)が保持する時間を指定します。

もしあなたが「CDNには1時間キャッシュさせたいが、ブラウザには即時再検証させたい」と考えるなら、以下のヘッダーをオリジンから送出するのが定石です。

# CDNには1時間キャッシュを許可し、ブラウザには検証を強制する
Cache-Control: public, s-maxage=3600, max-age=0, must-revalidate

Varyヘッダーという名の「諸刃の剣」

Vary: Accept-Encodingは圧縮効率を最適化する上で必須ですが、安易にVary: CookieやVary: Authorizationを付与するのは避けてください。これらはキャッシュのヒット率を劇的に下げ、オリジンへの無駄なリクエストを増幅させます。

教訓: キャッシュキーを細分化しすぎると、エッジの分散性と引き換えに「キャッシュミス」という名のレイテンシ地獄が待っています。

—

2. トランスポート層の最適化:TLSハンドシェイクとRTT削減

Cloud CDNはGoogleのグローバルネットワークをフル活用します。しかし、クライアントからエッジまでの「ラストワンマイル」で発生するTCPハンドシェイクの遅延は、我々が制御できる最後の聖域です。

0-RTTとQUIC (HTTP/3) の恩恵

GCPのロードバランサーを通じてCloud CDNを有効化すると、自動的にQUICが有効になります。QUICはUDPベースであり、TCPの3ウェイハンドシェイクとTLS 1.3のハンドシェイクを1往復(または0往復)に集約します。

ネットワークのパケットロスが激しいモバイル環境において、TCPのように再送制御でパイプラインが停止することがないため、体感速度は別次元になります。

TCPバッファチューニングの限界

もしオリジンがGCP内部(GCE等)にある場合、sysctlでのTCPウィンドウサイズ調整は有効ですが、Cloud CDNとオリジン間の通信はGoogleのプライベートバックボーンを通ります。ここは「信頼できるネットワーク」であるため、過度なバッファチューニングよりも、Keep-Aliveの設定を適切に行い、コネクションの再利用効率を最大化することに集中してください。

—

3. 実践:CDNキャッシュを制御するための設定例

Terraformを用いてCloud CDNのキャッシュポリシーを定義する際、client_ttlとdefault_ttlの使い分けが重要になります。

# Cloud CDNのキャッシュポリシー設定の例
resource "google_compute_backend_service" "default" {
  name        = "my-web-backend"
  # ... 省略 ...

  cdn_policy {
    # オリジンがヘッダーを指定しない場合のデフォルトキャッシュ時間
    default_ttl = 3600
    # クライアントが要求する最大キャッシュ時間
    max_ttl     = 86400
    
    # オリジンの Cache-Control を尊重しつつ制御する設定
    cache_mode  = "CACHE_ALL_STATIC" 
    
    # 重要なセキュリティ設定:ヘッダーのキャッシュキー構成
    bypass_cache_on_request_headers {
      header_names = ["Authorization"]
    }
  }
}

—

4. セキュリティとネットワーク脆弱性の回避策

CDNは攻撃の最前線です。Cloud Armorとの連携は必須ですが、キャッシュ戦略におけるセキュリティリスクとして「キャッシュ汚染(Cache Poisoning)」を忘れてはいけません。

X-Forwarded-Forの信頼性

バックエンドでIP制限を行う場合、X-Forwarded-Forを安易に信用してはいけません。必ずCloud Armorを通じて、信頼できるIPレンジからのリクエストであることを確認するか、ロードバランサーが付与するX-Forwarded-Forの最後尾を確認するロジックを実装してください。

ヘッダーインジェクションの防止

Varyヘッダーにユーザー入力を含めるような実装は論外です。キャッシュキーを操作されることで、特定ユーザーのキャッシュが他者に漏洩するリスクがあります。常にホワイトリスト形式でヘッダーを処理する設計を徹底してください。

—

結びに:パケットは嘘をつかない

Cloud CDNをチューニングするということは、単に数値をいじることではありません。リクエストがエッジに到達し、キャッシュヒットし、あるいはオリジンまで旅をして戻ってくるまでの、ミリ秒単位のパケットの旅を想像することです。

tcpdumpやWiresharkでパケットを眺め、curl -Iでレスポンスヘッダーを確認する。その泥臭い作業の先にしか、真のパフォーマンス向上はありません。皆さんのインフラが、より堅牢で、より速いものになることを願っています。

次の記事では、Cloud CDNにおける「キャッシュパージの同期遅延と、その際のオリジン負荷対策」について、さらに深掘りしていこうと思います。質問があれば、いつでもコメント欄へどうぞ。

コメント

タイトルとURLをコピーしました