キャッシュ無効化の概要

このページでは、Cloud CDN のキャッシュ無効化の概要について説明します。

キャッシュの無効化とは

キャッシュに保存されたオブジェクトは通常、期限切れになるか、新しいコンテンツを保存するために削除されるまでキャッシュに残ります。場合によっては、有効期限になる前にキャッシュ オブジェクトの削除が必要になることもあります。キャッシュの無効化をリクエストすると、キャッシュ内の 1 つまたは複数のオブジェクトを無効にできます。

キャッシュの無効化(「キャッシュ パージ」とも呼ばれます)は、キャッシュに保存されたコンテンツを無効として宣言するプロセスです。このプロセスにより、エントリはキャッシュから削除され、次にコンテンツがリクエストされたときにバックエンド サーバーから補充されます。

Cloud CDN は、無効化リクエストでのキャッシュタグ(プレビュー版)と無効化マッチャー(ホストや URL パスなど)の使用をサポートしています。

これらの無効化パラメータを組み合わせることで、特定のキャッシュ済みレスポンスをターゲットにし、後続のキャッシュ フィルでのバックエンドの負荷を最小限に抑えることができます。

重要な点として、キャッシュ無効化をリクエストする前に、バックエンド サーバーが正しいコンテンツを返すことを確認する必要があります。確認を怠ると、Cloud CDN がコンテンツを再度リクエストしたときに、間違ったコンテンツがキャッシュに保存される可能性があるからです。

無効化リクエストには次のレート制限が適用されます。

  • キャッシュタグ(プレビュー版)を使用する場合、送信できる無効化リクエストは 1 分あたり最大 500 件です。各無効化リクエストが有効になるまでには約 10 秒かかります。
  • 他の無効化マッチャーを使用する場合、送信できる無効化リクエストは 1 分あたり 1 件のみです。各無効化リクエストが有効になるまでに 1~3 分ほどかかります。

Cloud CDN では、リクエストごとのオブジェクト数または無効化される全オブジェクトの合計サイズに対する制限は適用されません。

URL による無効化

無効化リクエストには、無効にする 1 つまたは複数のオブジェクトを識別するパスパターンを指定します。パスパターンとして、/cat.jpg のように特定のパスを指定することも、/pictures/* のようにディレクトリ構造全体を指定することもできます。パスパターンには次のルールが適用されます。

  • パスパターンは / で始まる必要があります。
  • ?# を含めることはできません。
  • * は、/ に続く最後の文字として使用できますが、それ以外の場所では使用できません。
  • /* で終わる場合、先行する文字列は接頭辞になり、その接頭辞で始まるすべてのオブジェクトが無効になります。

パスパターンは、URL のパス コンポーネント(ホスト名と ? または # との間にあるすべての文字列)と比較されます。

URL にクエリ文字列(例: /images.php?image=fred.png)が含まれている場合、クエリ文字列だけが異なるオブジェクトを無効にすることはできません。たとえば、2 つの画像(/images.php?image=fred.png/images.php?image=barney.png)がある場合、fred.png だけを無効にすることはできません。images.php で提供されるすべての画像を無効にするには、パスパターンに /images.php を使用します。

単一ホストの無効化

キャッシュを無効化すると、すべてのホスト名のパスが無効になります。たとえば、example.comexample2.com が同じロードバランサを指している場合に /images/cat.jpg を無効にすると、example.com/images/cat.jpgexample2.com/images/cat.jpg の両方が無効になります。

いずれかのホストのみを無効にするよう制限するには、コマンドに --host フラグを追加します。

キャッシュタグによる無効化

キャッシュタグ(またはサロゲートキー)を使用すると、任意のメタデータに基づいてコンテンツを無効にすることができます。

これらのタグは、バックエンド レスポンスの Cache-Tag HTTP ヘッダーで定義されます。バックエンドからの Cache-Tag HTTP レスポンス ヘッダーで、キャッシュタグがクライアントに送信されます。

キャッシュタグには次の上限が適用されます。

  • タグあたりのバイト数は 120 以下でなければなりません。
  • キャッシュ済みオブジェクトごとのタグ名のサイズは合計 4 KiB(4,096 バイト)以下でなければなりません。
  • オブジェクトごとのタグ数は 50 以下でなければなりません。

これらのタグの上限を超えると、レスポンスはキャッシュに保存されません。この決定は、LoadBalancerLogEntry.cacheDecisionRESPONSE_CACHE_TAG_INVALID として記録されます。

無効化リクエストごとに最大 10 個のキャッシュタグを指定できます。1 つの無効化リクエストで複数のタグが指定されている場合、それらは論理 OR として扱われます。キャッシュに次のオブジェクトが保存されている例について考えてみましょう。

  • タグ js2020-12-23prod が付けられた、キャッシュに保存されているオブジェクト #1
  • タグ css2020-11-30prod が付けられた、キャッシュに保存されているオブジェクト #2
  • タグ img2020-11-30staging が付けられた、キャッシュに保存されているオブジェクト #3

tags="prod,2020-11-30" に一致するオブジェクトを無効にするリクエストを送信すると、キャッシュに保存されている 3 つのオブジェクトのすべてが無効になります。つまり、このアプローチではオブジェクトを無効にするときに、考えられるすべてのタグの組み合わせを把握したり指定したりする必要はありません。

キャッシュタグと併せて無効化マッチャーを指定すると、無効化リクエストは、無効化マッチャーに一致するタグが付けられたオブジェクトにのみ適用されます。キャッシュに次のオブジェクトが保存されている例について考えてみましょう。

  • URL が https://staging.example.com/img/cat.jpg で、タグ a が付けられた、キャッシュに保存されているオブジェクト #1
  • URL が https://example.com/img/cat.jpg で、タグ a が付けられた、キャッシュに保存されているオブジェクト #2
  • URL が https://staging.example.com/js/cat.js で、タグ a が付けられた、キャッシュに保存されているオブジェクト #3
  • URL が https://staging.example.com/img/logo.jpg で、タグ b が付けられた、キャッシュに保存されているオブジェクト #4

--host="staging.example.com" --path="/img/*" --tags="a" に一致するオブジェクトを無効にするリクエストを送信すると、オブジェクト #1 のみが無効になります。オブジェクト #2、#3、#4 については、それぞれホスト、パス、タグが一致しません。

無効化レイテンシ

Cloud CDN は分散システムです。このため、ごく一部のキャッシュで無効化リクエストがまだ処理されていない場合でも、無効化が完了したと報告することがあります。この状況はめったに発生しませんが、発生した場合には自動的に問題が訂正されます。

ベスト プラクティス

必要なものだけを無効にしてください。無効にする対象が多すぎると、それまでキャッシュで処理されていたリクエストの急増によりインスタンスやバケットが影響を受ける可能性があります。

無効化は、通常のワークフローではなく、例外的な状況での使用を前提としています。無効化は、ウェブブラウザ内のキャッシュや、他のインターネット サービス プロバイダが管理するキャッシュには影響しません。

定期的に無効化を行う代わりに、レスポンスに適切な有効期間を設定したり、コンテンツのバージョンごとに別々の URL を使用したりすることもできます。有効期間の詳細については、有効期間と検証リクエストをご覧ください。

共有 VPC のプロジェクト間サービス参照を使用している場合の無効化

キャッシュの無効化は、フロントエンド プロジェクトで構成されます。つまり、ロードバランサの転送ルール、ターゲット プロキシ、URL マップが設定されているプロジェクトで構成されます。したがって、共有 VPC のプロジェクト間サービス参照でグローバル外部アプリケーション ロードバランサを使用している場合、デフォルトでは、サービス プロジェクト管理者にはキャッシュの無効化をリクエストするために必要な権限がありません。

キャッシュの無効化を実行できるのは、フロントエンド プロジェクトでロードバランサ リソースを構成するための Identity and Access Management(IAM)ロール(Compute ネットワーク管理者ロール(roles/compute.networkAdmin)など)を持つプリンシパルのみです。

別のプロジェクトのバックエンド サービスのプロビジョニングを管理するサービス管理者は、フロントエンド プロジェクトのロードバランサ管理者と連携して、プロジェクト間のサービスのキャッシュ無効化を行ってください。URL の書き換えについては、無効化が、クライアントが送信する書き換え前のホストとパスに一致していることを確認してください。

次のステップ