【実務・中級編】 GCP Cloud CDNのプレキャッシュ(Pre-caching)戦略とキャッシュフィル(Cache Fill)のトラフィックフロー – クラウドインフラと仮想化ネットワーク実践ガイド

GCP Cloud CDNの深淵:キャッシュフィルと「エッジの賢い立ち回り」を極める

現場でネットワークのトラブルシュートをしていると、「なぜかオリジンへの負荷が下がらない」「CDNを導入したのに初速が遅い」といった相談をよく受けます。その原因の多くは、CDNを単なる「静的コンテンツの置き場」と勘違いし、その裏側にあるキャッシュのライフサイクルや、オリジンへ向かう「キャッシュフィル(Cache Fill)」の挙動をブラックボックスにしていることにあります。

今回は、GCP Cloud CDNにおいて、キャッシュミス時にパケットがどう走り、どのようにオリジンへ到達するのか。そのリアルな挙動を紐解いていきましょう。

—

キャッシュフィル(Cache Fill)の全貌:パケットはどこを走るのか

ユーザーがブラウザでリクエストを投げたとき、Cloud CDNのエッジサーバーが「そのコンテンツを持っていない」と判断すると、エッジは即座にオリジンへリクエストを転送します。これが キャッシュフィル(Cache Fill) です。

ここでのポイントは、この通信が Googleのグローバルプライベートネットワーク(Andromeda)上を走る という点です。

通信フローのシーケンス

1. User → Edge: ユーザーが https://api.example.com/data.json をリクエスト。
2. Cache Lookup: エッジ拠点で Cache-Key を計算し、ヒット判定。
3. Cache Miss: キャッシュミスが発生。
4. Cache Fill: エッジからGoogleの内部ネットワークを経由し、バックエンドサービス(GCE, GKE, Cloud Run, Cloud Storage等)へリクエストが飛ぶ。
5. Origin Response: オリジンがレスポンスを返し、エッジがそれをキャッシュ(Cache-Control ヘッダーに従う)。

このとき、エッジとオリジン間はレイテンシを最小化するために、Googleの巨大なバックボーンが最適化されたルーティングを提供します。

—

マルチリージョンオリジンと負荷分散の力学

Cloud CDNは、HTTP(S) ロードバランサ(GCLB)と密結合しています。マルチリージョンでオリジンを構成している場合、CDNは「どのオリジンからフェッチするか」をロードバランサのトポロジーに基づいて決定します。

負荷分散の肝:Cache-Key と X-Cloud-Trace-Context

デバッグの際、キャッシュがどのリージョンからフィルされたかを知るには、レスポンスヘッダーを確認するのが鉄則です。

# curlでレスポンスヘッダーを確認する
curl -I -H "Host: api.example.com" https://[LB_IP]/v1/resource

ここで注目すべきは Via ヘッダーや X-Cache ヘッダーです。もし X-Cache: MISS が頻発するなら、キャッシュキーの設計を見直す必要があります。

—

実践:キャッシュヒット率を最大化する設計

キャッシュミスを減らすためには、Cache-Control ヘッダーの制御がすべてと言っても過言ではありません。

1. HTTPヘッダーの構成例

バックエンド(Python/Flaskの例)で、CDNに対して「キャッシュしてほしい」と伝えるコードです。

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/api/data')
def get_data():
    resp = make_response({"status": "success", "data": "..."})
    # 3600秒間キャッシュし、共有キャッシュ(CDN)にも保持させる
    resp.headers['Cache-Control'] = 'public, max-age=3600, s-maxage=3600'
    # 重要なキャッシュキーのバリエーションをVaryで明示
    resp.headers['Vary'] = 'Accept-Encoding, Authorization'
    return resp

2. プレキャッシュ(Pre-caching)戦略の現実

「ユーザーが来る前にキャッシュを温めておきたい」というニーズには、Cloud CDNの直接的な「プレキャッシュ機能」というものは存在しません。しかし、以下の手法で擬似的に実現するのが現場の定石です。

  • ウォームアップスクリプト: デプロイ直後に、内部IPからエッジに対して curl で主要エンドポイントを叩く。
  • Cloud Run/GKEのヘルスチェック: ヘルスチェックのついでにキャッシュを温める手法もありますが、これはキャッシュの整合性に注意が必要です。

—

SREとしてのトラブルシューティングTips

最後に、現場で「キャッシュが効かない!」と叫びたくなったときに確認すべき3つのチェックリストを置いておきます。

1. Authorization ヘッダーの有無:
Authorization ヘッダーが含まれていると、Cloud CDNはデフォルトでキャッシュをスキップします。APIで認証が必要な場合、signed-url や signed-cookies を活用してキャッシュを有効化するアーキテクチャへの変更を検討してください。

2. Vary ヘッダーの不一致:
Vary ヘッダーに User-Agent を含めると、キャッシュのバリエーションが爆発し、ヒット率が壊滅的に低下します。デバイス判定は可能な限り X-Device-Type のような独自ヘッダーで正規化しましょう。

3. Cache-Control: private の罠:
バックエンドが private を返していると、CDNは一切キャッシュしません。これは最も多い設定ミスの一つです。

まとめ

Cloud CDNは魔法の箱ではなく、HTTP仕様に忠実なキャッシュサーバーです。パケットがどこを通り、どのヘッダーを見てキャッシュの可否を判断しているかを理解すれば、インフラはもっと軽量で高速になります。

まずは、自分のアプリケーションが返している Cache-Control を curl -v で確認することから始めてみてください。そこには必ず、パフォーマンス改善のヒントが隠れています。

コメント

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