リクエストに対して複数のオリジンをチェックする

```
この記事は Checking multiple backends for a single request
https://docs.fastly.com/guides/performance-tuning/checking-multiple-backends-for-a-single-request
を基に記載されています。最新の情報は上記のページをご参照下さい。
```

Fastlyではプライマリ、セカンダリのオリジンサーバーを設定し、プライマリのオリジンが正しいレスポンスを返却できない場合にセカンダリのオリジンサーバーからコンテンツを取得するような設定を行うことが可能です。


### 処理に必要な設定
この処理を行うためには以下のような設定が必要となります。
1. Cache Settingの作成
プライマリのオリジンが正しくないレスポンスを返却した場合に、リクエストの処理を再度行う(restart)設定
2. Request Headerの作成 1
http.Fastly-Force-Shield ヘッダーを付与します。これはFastlyの配信拠点内でのクラスタリングという処理を強制するためのものです。
3. Request Headerの作成 2
プライマリオリジンが正しくないレスポンスを返却している場合に、セカンダリのオリジンを参照するよう設定を行います。


それでは続いてそれぞれの設定を順に行ってみます。

## 1. Cache Settingの作成
オリジンが正しくないレスポンス(200または304以外のレスポンスコードとします)を返却した場合に、VCLの処理を再度最初からやり直す設定(restart)を追加します。
この時Fastlyサーバー内部のrestartパラメーターに自動的に "1" がセットされます。

レスポンスがオリジンから返却されたタイミングでの処理ですので、VCL上ではvcl_fetchのサブルーチン内で処理を行います。以下の手順に従って設定を行って下さい。

1.  Fastlyポータルにログイン、**Configure** をクリック
2.  設定を行いたい **Service** を選択
3.  編集可能なバージョンを開くか、編集可能なバージョンがない場合は **Configuration** から **Clone active** をクリック
4.  **Setting** タブをクリック
5. **Create cache setting** ボタンをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/128569/d8bc23b0-1370-eb44-1f3d-25f5d767bfa4.png)

6.  **Create a cache setting** に以下の通り入力して下さい:
    *   **Name** フィールドは `Return Restart` (または識別可能なその他の名前).
    *   **TTL (seconds)** フィールドは `0`.
    *   **Action** メニューは **Restart processing**.
    *   **Stale TTL (seconds)** は `0`.
7.  **Create** ボタンをクリック。Settingページに作成したキャッシュ設定が表示されます。
8.  **Settings** ページの今作成したキャッシュ設定の横の **Attach a condition** をクリックして下さい。Create a new cache condition ウインドウが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/128569/43e75f85-4a91-7520-2ec7-20bb83136c72.png)

9.  **Create a new cache condition** フィールドに以下の通り入力して下さい:
    *   **Type** メニューは **Cache**.
    *   **Name** フィールドには `Restart Request` (または識別可能なその他の名前).
    *   **Apply if** フィールドには `beresp.status != 200 && beresp.status != 304`.（これはオリジンからのレスポンスコードが200または304以外という条件です）
10. **Save and apply to** ボタンをクリック.

## 2. Request Headerの作成 1

Fastlyがエンドユーザーからリクエストを受けた(vcl_recv)タイミングでhttp.Fastly-Force-Shield というヘッダーをリクエストに付与します。これはFastlyの配信拠点内でのクラスタリングという処理を強制するためのものです。詳細は理解しなくても大丈夫なので、これはおまじないのようなものもだと考えて以下の設定を追加して下さい。

1.  **Content** タブをクリック
2.  **Create header** ボタンをクリック。Create a header ページが表示されます
![image](https://qiita-image-store.s3.amazonaws.com/0/128569/3344598d-fe8e-e109-480b-9f151ae6e69f.png)
3.  **Create a new header** フィールドに以下の通り入力して下さい:
    *   **Name** フィールドは`Fastly Internal Shielding` (または識別可能なその他の名前).  
    *   **Type** メニューは **Request** を選択し **Action** は **Set** を選択
    *   **Destination** フィールドは `http.Fastly-Force-Shield`
    *   **Source** フィールドは `"yes"`
    *   **Ignore if set** メニューは **No**
    *   **Priority** フィールドは `10`
4.  **Create** ボタンをクリック。作成したヘッダー設定がContentページに表示されます。


## 3. Request Headerの作成 2

プライマリオリジンが正しくないレスポンスを返却した場合に、セカンダリのオリジンを参照するよう設定を行います。

手順１でプライマリオリジンからのレスポンスコードが200または304以外の場合にはrestart処理を行っているため、restartパラメータが1という条件でセカンダリのオリジンを参照するように設定することでこれが実現できます。


#### 事前準備
この設定を行う前にセカンダリのオリジン(backend)をOriginタブから設定して下さい。
また、作成したセカンダリのオリジンの名前を右上のOption - Show VCLから確認して控えておいて下さい。

オリジンの名前は通常VCLの一番上の部分に`backend F_XXXXX` というフォーマットで記載されています。


1. Contentタブで **Create header** ボタンをクリック。Create a header ページが表示されます
![image](https://qiita-image-store.s3.amazonaws.com/0/128569/7e82533b-0723-0d77-7525-0021c92aee78.png)

2.  **Create a header** フィールドに以下の通り入力して下さい:
    *   **Name** フィールド `Second Backend` (または識別可能なその他の名前).
    *   **Type** メニューは **Request** を選択し **Action** は **Set** を選択
    *   **Destination** フィールドは `backend` (このbackendには、コンテンツ取得先のオリジンを保持するパラメータです）
    *   **Source** フィールド `Second_Backend` (ここは予め設定したセカンダリのbackendの名前を記入して下さい。).
    *   **Ignore if set** メニューは **No**
    *   **Priority** フィールドは `11`.
3.  **Create** ボタンをクリックして下さい。新しいヘッダー設定が表示されます。


## Header用のConditionの作成
作成したふたつのHeader設定(Second Backend, Fastly Internal Shielding)にConditionを設定します。

1. ヘッダー設定の横の **Attach a condition** リンクをクリックして下さい。Create a new request condition ウインドウが表示されます。

2.  **Create a new request condition** フィールドに以下の通り入力して下さい:
    *   **Type** メニューは **Request**
    *   **Name** フィールドは `Req.restart` (または識別可能なその他の名前).
    *   **Apply if** フィールドは `req.restarts == 1`
3.  **Save and apply to** をクリックして下さい。作成したコンディションが`Second Backend` 設定に追加されています。

4.  作成した `Req.restarts` コンディションを先程作成した`Fastly Internal Shielding`にも適用して下さい。

*セカンダリバックエンドがプライマリバックエンドとは異なるHostヘッダーを期待している場合は、Create Header で http.hostに対してセカンダリバックエンドが期待しているHostヘッダーを設定して下さい。*
5.  設定が完了したら新しい設定を有効にするために画面右上の `Activate` ボタンをクリックして下さい。