デフォルトでキャッシュ対象外のレスポンスコードをキャッシュする


この記事の内容について

Fastlyではデフォルトでキャッシュ対象とならない一部のHTTPのレスポンスコードをキャッシュする場合、TTLを設定するだけでなく明示的に該当のレスポンスコードがキャッシュ対象であることを示すヘッダーを付与する必要があります。

この記事ではそのヘッダーの設定手順について説明します。

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。

デフォルトでキャッシュ対象のレスポンスコード

Fastlyのサーバーがデフォルトでキャッシュ対象とすることの出来るレスポンスコードは以下の通りです。

200 OK
203 Non-Authoritative Information
300 Multiple Choices
301 Moved Permanently
302 Moved Temporarily
404 Not Found
410 Gone

https://docs.fastly.com/guides/about-fastly-services/http-status-codes-cached-by-default

上記以外のレスポンスコードをキャッシュしたい場合は、以下の設定が必要となります。

Cacheable header の設定

この処理を行うことでFastlyサーバー上で処理を行う前に"cacheable: true"というヘッダーがオリジンからのレスポンスに付与され、デフォルト以外のレスポンスコードもキャッシュ対象として処理することが可能となります。

ヘッダーを追加する手順は以下の通りです。

  1. FastlyのWebポータルにログインしConfigureをクリックします。
  2. Serviceメニューから設定を行いたいServiceを選択して下さい。
  3. Edit Configurationボタンをクリックし、Clone activateをクリックして下さい。Serviceの新しいversionが表示されます。
  4. Contentタブをクリックして下さい。
  5. Create Headerボタンをクリックして下さい。"Create a new Header"ページが表示されます

  6. Create Headerにそれぞれ以下のように入力して下さい
    Type / Action : Cache / Set を選択して下さい。
    Destinationには : cacheable
    Ignore if set : No
    Priority : 10
    Description : この条件を識別するための適当な名前。例 Set Cacheable Flag

  7. 必要な値を入力したらCreateボタンをクリックして下さい

Conditionの設定

続いてこのHeaderを付与する条件(Condition)を作成します。ここでは403のレスポンスをキャッシュさせる場合の設定を説明します。

1.作成したCache Objectの右側にある Attach a condition をクリックして下さい
2. Create cache settingボタンをクリックして下さい。"Create a new cache condition"ウインドウが表示されます。

3. Create a new cache setting内の項目を以下のように入力して下さい。
 ・Typeメニュー : Cache
 ・Name : この条件を識別するための適当な名前。例 Response is 403
 ・Apply if : 適用したい条件(Conditions) 例 beresp.status == 403
 ・Priority : 5
4. Save and applyボタンをクリックして下さい

ここで設定したPriorityは、他のConditionで設定された処理との優先順位を決めるために利用されます。Priorityの値が低いほうが先に処理が行われます。

cacheable headerはCache Setting設定よりも先に実行される必要があるため、別途作成するCache Settingに設定されているConditionのPriority値より低い値に設定して下さい。

以上でcacheable headerの設定は完了です。

CacheObjectの作成、Conditionの設定

キャッシュ対象やTTLの設定を行われていない場合は次のページを参照してCacheObjectの作成、Conditionの設定を行って下さい。
Fastlyサーバー上でTTLを設定(上書き)する方法

生成されたVCLのvcl_fetchの下に以下のような記述が追記されていれば設定は完了です。
VCLを確認するにはページ右上のOptionからShow VCLをクリックして下さい。

sub vcl_fetch {

// 省略

 # priority: 5
 if ( beresp.status == 403 ) {
    # Header rewrite Set Cacheable Flag : 10
    set beresp.cacheable = true;
 }

 # priority: 10
 if ( beresp.status == 404 || beresp.status == 403 ) {
      # Cache 300 sec
      set beresp.ttl = 300s;
      set beresp.grace = 300s;
      return(deliver);
 }

// 省略

}

この例ではレスポンスコードが404と403のレスポンスコードに300秒のTTLを設定しています。
デフォルトではキャッシュ対象ではない403にのみ"cacheable: true"ヘッダーを付与しています。

また、cacheableヘッダーの設定に付与したConditionのPriority値を小さくすることでCache TTLの設定より先に処理されるようにしています。

あとは意図した通りにTTLが設定されているかを以下のページなどを参考にして確認してみて下さい。
FastlyにキャッシュされたオブジェクトのTTL確認

Snippet で設定を行う場合

Snippet 機能を使うと、記載したVCLコードを直接設定に反映させることが出来ます。Snippet 機能で設定を追加するには、編集可能なサービスの設定画面を開き、左側のメニューから VCL Snippetを選択し、 Create VCL Snippet をクリックして下さい。

Create VCL Snippet画面が表示されたら以下のような内容を入力して下さい。

Name: 設定を識別する名前です。何か適当なものを入力して下さい。
Type: 特定のサブルーチンの下にSnippetを追加するので within subroutine を選択し、リストボックスから vcl_fetch を選択

VCL: 以下のコードを参考に入力して下さい。

if ( beresp.status == 403 ) {

   # 403 Forbidden
      set beresp.cacheable = true;
      set beresp.ttl = 300s;
      set beresp.grace = 300s;
      return(deliver);  # this is optional if you want to immediately exit vcl_fetch 
}

必要な情報の入力が完了したらCreate をクリックして、設定を追加した Service を Activate して下さい。

なお、TTLはFastlyサーバーがオリジンサーバーからオブジェクトを取得した際にキャッシュオブジェクトに設定されます。そのため既にFastlyサーバー上にキャッシュがある場合はここでTTLを変更してもすぐに新しいTTLは適用されませんのでご注意下さい。

すぐに新しいTTLを適用したい場合はPurgeを行いキャッシュを削除する必要があります。