このページでは、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-age
、s-maxage
、Expires
ヘッダーで定義)を過ぎても、指定された上限になるまで配信されます。詳細については、有効期限と検証リクエストをご覧ください。
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
再検証中に古いコンテンツを配信する
Console
- Google Cloud コンソールの [ロード バランシング] ページに移動します。
- 外部アプリケーション ロードバランサの名前をクリックします。
- [編集] をクリックします。
- [バックエンドの構成] でバックエンドを選択し、[ 編集] をクリックします。
- [Cloud CDN を有効にする] が選択されていることを確認します。
- ウィンドウの下部にある [高度な構成] をクリックします。
- [追加の CDN オプション] については、[古いデータの提供] で次のいずれかのオプションを選択します。
- 1 分
- 5 分
- 10 分
- 30 分
- 1 日(推奨)
- 7 日
- [更新] をクリックします。
- [更新] をもう一度クリックします。
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 }
古いコンテンツの配信を無効にする
Console
- Google Cloud コンソールの [ロード バランシング] ページに移動します。
- 外部アプリケーション ロードバランサの名前をクリックします。
- [編集] をクリックします。
- [バックエンドの構成] でバックエンドを選択し、[ 編集] をクリックします。
- [Cloud CDN を有効にする] が選択されていないことを確認します。
- ウィンドウの下部にある [高度な構成] をクリックします。
- [その他の CDN オプション] > [古いデータの提供] で [古いデータの提供を無効にします] を選択します。
- [更新] をクリックします。
- [更新] をもう一度クリックします。
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 }