エンジニア必見!Cloudflare/CloudFrontでCDNキャッシュを「正しく」制御する設定と無効化のベストプラクティス
CDN(Contents Delivery Network)は、ウェブサイトの高速化、オリジンサーバーの負荷軽減、そしてユーザー体験の向上に不可欠な技術です。CloudflareやCloudFrontといった主要なCDNサービスを「正しく」設定し、効果的に運用することは、現代のウェブサービスにおいて非常に重要となります。しかし、設定を誤ると、古いコンテンツが配信され続けたり、予期せぬパフォーマンス低下を招いたりする可能性があります。
本記事では、CloudflareおよびCloudFrontにおけるCDNキャッシュの正しい制御方法と、コンテンツ更新時の効果的な無効化(Purge/Invalidation)戦略について、初心者エンジニアの皆さんが実践できるよう簡潔に解説します。
1. CDNキャッシュの基本と「正しく」制御するための設定
CDNキャッシュの核心は、ウェブコンテンツ(画像、CSS、JavaScript、HTMLなど)をユーザーに最も近いエッジサーバーに一時的に保存し、次回以降のリクエストに対して高速に配信することにあります。この仕組みを最大限に活用するためには、オリジンサーバーとCDNの連携を理解し、適切な設定を行うことが不可欠です。
キャッシュの「鍵」となる要素
コンテンツをキャッシュするかどうか、そしてどのキャッシュを返すかを決定するために、CDNは「キャッシュキー」と呼ばれる識別子を使用します。これは主に以下の要素から構成されます。
- URLパス: 最も基本的な識別子です。
- ホスト名: 複数のドメインを扱う場合。
-
HTTPヘッダー:
Accept-Encoding(圧縮形式)、User-Agent(デバイスの種類)など、オリジンサーバーが応答を変える可能性のあるヘッダー。 -
クエリパラメータ:
?version=123のように、URLに付加されるパラメータ。これをキャッシュキーに含めるかどうかで、キャッシュの粒度が大きく変わります。
ベストプラクティス:
- Cloudflare: Page Rulesで「Caching Level」を設定し、「Ignore Query String」を選択することで、不要なクエリパラメータによるキャッシュの細分化を防ぎ、キャッシュヒット率を高めることができます。
- CloudFront: Cache Policyの「Cache Key Settings」で、Headers, Query Strings, Cookiesをキャッシュキーに含めるかどうかを細かく制御します。特に重要なのは、コンテンツのババリエーションに影響しないクエリパラメータは含めないように設定することです。
HTTPキャッシュヘッダーの活用
オリジンサーバーからCDN、そしてクライアントブラウザに至るまで、キャッシュ動作を制御する最も重要な要素がHTTPレスポンスヘッダーです。
-
Cache-Control: これが最も強力で柔軟なヘッダーです。-
max-age=<seconds>: キャッシュが新鮮であると見なされる秒数を指定します。 -
no-cache: キャッシュはしますが、オリジンに再検証を求めます(ETag/Last-Modifiedを使用)。 -
no-store: キャッシュを一切許可しません。 -
public/private: CDNや共有キャッシュでキャッシュ可能か、ユーザー固有のプライベートキャッシュのみかを示します。 -
例:
Cache-Control: public, max-age=3600(1時間キャッシュ)
-
-
Expires:Cache-Controlの古い代替ですが、互換性のために併記されることがあります。絶対的な日付と時刻を指定します。 -
ETag/Last-Modified: これらは条件付きリクエスト(If-None-Match,If-Modified-Since)に使用され、コンテンツが変更されていない場合に304 Not Modifiedを返すことで、帯域幅の消費を抑えます。
ベストプラクティス:
- オリジンサーバーで、動的に変化するコンテンツには短い
max-ageまたはno-cacheを、静的コンテンツには長いmax-ageを設定しましょう。 - Cloudflareでは「Browser Cache TTL」をPage Rulesで設定することで、エッジサーバーからクライアントブラウザへのキャッシュ期間を制御できます。
- CloudFrontでは、Cache PolicyでMinimum/Default/Maximum TTLを設定し、オリジンからの
Cache-Controlヘッダーを尊重するか、強制的に指定したTTLを適用するかを選択できます。
2. 効果的なキャッシュ無効化(Purge)戦略
コンテンツが更新された際、古いキャッシュが残り続けるとユーザーに誤った情報を提供してしまいます。これを防ぐためには、適切なタイミングでキャッシュを無効化(CloudflareではPurge、CloudFrontではInvalidation)する戦略が必要です。
なぜ無効化が必要か?
- コンテンツの鮮度保持: 最新の情報やデザインをユーザーに確実に届けるため。
- セキュリティ対応: 誤ってキャッシュされた機密情報などを速やかに削除するため。
無効化の種類と方法
- 完全無効化 (Full Purge): CDN上の全てのキャッシュを削除します。手軽ですが、影響範囲が大きく、一時的にキャッシュヒット率が低下します。緊急時以外は避けるべきです。
- 部分無効化 (Partial Purge): 特定のURLパスやファイルのみを削除します。最も推奨される方法で、影響範囲を限定しつつ、必要なコンテンツを更新できます。
CloudflareでのPurge:
-
ダッシュボードから:
- 「Caching」→「Configuration」セクションから、特定のURLを指定してPurgeすることも、全てのキャッシュをPurgeすることも可能です。
-
APIからの自動化:
- Cloudflare APIを利用すると、プログラムから特定URLのPurgeや、ワイルドカード(例:
example.com/blog/*)を使ったパス配下のPurgeを自動化できます。これは、CMSでの記事更新時やCI/CDパイプラインに組み込む際に非常に有効です。
- Cloudflare APIを利用すると、プログラムから特定URLのPurgeや、ワイルドカード(例:
CloudFrontでのInvalidation:
-
AWSコンソールから:
- CloudFrontディストリビューションの「Invalidations」タブから、「Create Invalidation」を選び、無効化したいファイルパス(例:
/images/logo.png)やワイルドカード(例:/blog/*)を指定します。
- CloudFrontディストリビューションの「Invalidations」タブから、「Create Invalidation」を選び、無効化したいファイルパス(例:
-
AWS CLI/SDKからの自動化:
- AWS CLIやSDKを使用して、プログラムからInvalidationリクエストを発行できます。これにより、デプロイやコンテンツ更新のワークフローに無効化処理を組み込むことが可能になります。
- 注意点: CloudFrontのInvalidationは、一定数を超えると料金が発生する場合があります。また、伝播には数分から十数分かかることがあります。
ベストプラクティスと注意点
- 最小限の範囲で無効化: 更新されたコンテンツのみをターゲットにし、無関係なキャッシュまで削除しないようにしましょう。
-
TTLを適切に設定: 動的に変化するコンテンツには短めの
max-ageを設定することで、無効化の頻度自体を減らせます。 - CI/CDパイプラインとの連携: 2026年現在、コンテンツデプロイ時に自動的に関連するCDNキャッシュを無効化する仕組みはほぼ必須です。これにより、手動によるミスを防ぎ、常に最新のコンテンツを配信できます。
- テスト環境での検証: 本番環境で無効化を実行する前に、必ずステージング環境などで動作を検証し、意図しない影響がないか確認しましょう。
まとめ
CloudflareやCloudFrontといったCDNは、ウェブサービスのパフォーマンスを飛躍的に向上させる強力なツールですが、その力を最大限に引き出すには、キャッシュの「正しい」制御と無効化戦略が不可欠です。オリジンサーバーのHTTPヘッダー設定から始め、CDNのキャッシュポリシーや無効化機能を効果的に活用することで、常に最新かつ高速なコンテンツをユーザーに提供し、彼らの体験を向上させることができます。パフォーマンスとコンテンツの鮮度という二つの重要な要素のバランスを保ちながら、適切な戦略を構築していきましょう。
エンジニアのスキルシェアプラットフォーム「DokuPro」
教えたい人と学びたい人を繋ぐDokuProでは、新規登録(先生・生徒)を募集中です。
詳細はこちら: https://dokupro.dev/