古いコンテンツを配信する

このページでは、Cloud CDN で古くなった期限切れコンテンツを配信する方法について説明します。古いコンテンツを配信すると、配信元サーバーが到達不能の場合や Cloud CDN にエラーを返した場合に、Google のグローバル キャッシュからコンテンツの配信を継続できます。

このような処理は、次のような場合に行います。

  • ユーザーにエラーではなく、古いコンテンツをユーザーに配信する。
  • 古いコンテンツを配信することで、キャッシュが期限切れになった直後にコンテンツに対するリクエストを受信した場合のレイテンシを回避する。バックエンドに対する同期再検証の待機を必要とすることなく、キャッシュが期限切れとなった直後に古いコンテンツを配信すると同時に、別の再検証をトリガーします。

この動作を有効にするには、バックエンドでレスポンス Cache-Control のヘッダーに stale-while-revalidate ディレクティブを指定します。これにより Cloud CDN は、キャッシュ エントリの有効期限が切れた後でも、指定した秒数だけキャッシュからコンテンツを配信するようになります(キャッシュにコンテンツがある場合)。Cloud CDN は配信元のコンテンツを非同期に再検証します。

cdnPolicy.serveWhileStale を設定すると、ユーザーに代わって Cloud CDN がこの機能を有効にします。この設定により、レスポンスの有効期限が切れた後に Cloud CDN が古いバージョンの配信を継続できる時間が決まります。レスポンスで特に指定されていない場合、これは 86400s(1 日)です。

Cloud CDN は stale-if-error ディレクティブをサポートしていません。このディレクティブは、バックエンドとの同期再検証が特定のエラー ステータス コードで失敗していない限り、古いコンテンツを配信しないようにキャッシュに指示します。

デフォルト値、最小値、最大値は次のとおりです。

  • デフォルト値: 86,400 秒(1 日)
  • 最小値: 0 秒(この機能を無効にします)
  • 最大値: 604,800 秒(1 週間)

古いコンテンツは、キャッシュ エントリの有効期限(max-ages-maxageExpires ヘッダーで定義)を過ぎても、指定された上限になるまで配信されます。詳細については、有効期限と検証リクエストをご覧ください。

Cloud CDN のエッジ キャッシュが、古いコンテンツを配信するためにオブジェクトのコピーをキャッシュに保存していない場合、またはオブジェクトが古い TTL の上限に達している場合、Cloud CDN は送信元と同期し、コンテンツの再検証を行います。この時点で送信元からエラーが返された場合、Cloud CDN は送信元エラーを返します。

Logging とユーザー エージェント

Cloud CDN によって行われた非同期リクエストは、古いコンテンツを配信していないときに発生する通常の再検証リクエストと同じように送信元サーバーに表示されます。例外は、Cloud-CDN-Google を含む User-Agent ヘッダーでタグ付けされている場合です。

非同期リクエストも Cloud Logging に別個にログに記録されるため、最新でないユーザー リクエストに対しては 2 つのログエントリが生成されます。最初のエントリはユーザーに実際に提供されたコンテンツ用、2 つ目は配信元に対する再検証リクエスト用です。同期再検証と同様に、特定の状況下では Cloud CDN から条件付きリクエストが送信されたり、無条件でコンテンツを再リクエストすることがあります。いずれの場合も、Cloud Logging に記録されるレスポンス コードは Cloud CDN に対する元のリクエストに対応しています。たとえば、無条件リクエストの場合は 200 OK、ユーザーの元のレスポンスが条件付きの場合は 304 Not Modified になります。

クライアントの max-stale リクエスト ディレクティブ

クライアントは、max-stale キャッシュ制御ディレクティブを指定することで、サービスが最新ではないと判別されるまでの短い時間、リクエストを送信できます。このディレクティブを指定すると、クライアントが許容するステイルネスに関する期間が制御されます。

キャッシュに保存されたコンテンツがクライアントの max-stale 値よりも古い場合、Cloud CDN は配信する前にコンテンツを再検証します。

クライアントは、serve-while-stale 構成オプションと、送信元の stale-while-revalidate キャッシュ制御ディレクティブで構成されている値より大きな max-stale 値をリクエストすることはできません。

始める前に

  • キャッシュ モードと静的コンテンツについて確認します。

  • Cloud CDN が有効になっていることを確認します。手順については、Cloud CDN の使用をご覧ください。

  • 必要に応じて、次のコマンドで Google Cloud CLI を最新バージョンに更新します。

    gcloud components update
    

再検証中に古いコンテンツを配信する

コンソール

  1. Google Cloud コンソールの [ロード バランシング] ページに移動します。

    [ロード バランシング] に移動

  2. 外部アプリケーション ロードバランサの名前をクリックします。
  3. [編集] をクリックします。
  4. [バックエンドの構成] でバックエンドを選択し、[編集] をクリックします。
  5. [Cloud CDN を有効にする] が選択されていることを確認します。
  6. ウィンドウの下部にある [高度な構成] をクリックします。
  7. [その他の CDN オプション] の [古いデータの提供] で次のいずれかのオプションを選択します。
    • 1 分
    • 5 分
    • 10 分
    • 30 分
    • 1 日(推奨)
    • 7 日
  8. [更新] をクリックします。
  9. [更新] をもう一度クリックします。

gcloud

バックエンド バケットの場合は、gcloud compute backend-buckets create コマンドまたは gcloud compute backend-buckets update コマンド--serve-while-stale フラグを使用します。

バックエンド サービスの場合は、gcloud compute backend-services create コマンドまたは gcloud compute backend-services update コマンド--serve-while-stale フラグを指定します。

gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --serve-while-stale=SECONDS
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --serve-while-stale=SECONDS

例:

gcloud compute backend-services update my-backend-service
    --serve-while-stale=180s

API

バックエンド バケットの場合は、Method: backendBuckets.insert または Method: backendBuckets.update API 呼び出しを使用します。

バックエンド サービスの場合は、Method: backendServices.insert または Method: backendServices.update API 呼び出しを使用します。

次のいずれかの API 呼び出しを使用します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE

JSON リクエストの本文に次のスニペットを追加します。

"cdnPolicy": {
  "serveWhileStale": SECONDS
}

古いコンテンツの配信を無効にする

コンソール

  1. Google Cloud コンソールの [ロード バランシング] ページに移動します。

    [ロード バランシング] に移動

  2. 外部アプリケーション ロードバランサの名前をクリックします。
  3. [編集] をクリックします。
  4. [バックエンドの構成] でバックエンドを選択し、[編集] をクリックします。
  5. [Cloud CDN を有効にする] が選択されていないことを確認します。
  6. ウィンドウの下部にある [高度な構成] をクリックします。
  7. [その他の CDN オプション] > [古いデータの提供] で [古いデータの提供を無効にします] を選択します。
  8. [更新] をクリックします。
  9. [更新] をもう一度クリックします。

gcloud

バックエンド バケットには、--serve-while-stale フラグ値を 0 に設定して gcloud compute backend-buckets create コマンドまたは gcloud compute backend-buckets update コマンドを使用します。

バックエンド サービスでは、--serve-while-stale フラグの値を 0 に設定し、gcloud compute backend-services create コマンドまたは gcloud compute backend-services update コマンドを使用します。

gcloud compute backend-services (create | update) (BACKEND_SERVICE_NAME | BACKEND_BUCKET_NAME)
    --serve-while-stale=0

API

バックエンド バケットの場合は、Method: backendBuckets.insert または Method: backendBuckets.update API 呼び出しを使用します。

バックエンド サービスの場合は、Method: backendServices.insert または Method: backendServices.update API 呼び出しを使用します。

次のいずれかの API 呼び出しを使用します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE

JSON リクエストの本文に次のスニペットを追加します。

"cdnPolicy": {
  "serveWhileStale": 0
}