

# CloudFront オリジンフェイルオーバーを使用して高可用性を最適化する
<a name="high_availability_origin_failover"></a>

高可用性が必要なシナリオでは、オリジンフェイルオーバーを使用するように CloudFront を設定できます。開始するには、プライマリとセカンダリの 2 つのオリジンを持つ*オリジングループ*を作成します。プライマリオリジンが使用できない場合、または障害を示す特定の HTTP レスポンスステータスコードを返す場合、CloudFront は自動的にセカンダリオリジンに切り替わります。

オリジンフェイルオーバーを設定するには、少なくとも 2 つのオリジンを持つディストリビューションが必要です。次に、1 つをプライマリとして設定した 2 つのオリジンを含むディストリビューションのオリジングループを作成します。最後に、オリジングループを使用するようにキャッシュ動作を作成または更新します。

オリジングループを設定して特定のオリジンフェイルオーバーオプションを設定する手順については、「[オリジングループを作成する](#concept_origin_groups.creating)」を参照してください。

キャッシュ動作のオリジンフェイルオーバーを設定すると、CloudFront は、ビューワーリクエストに対して以下の処理を実行します。
+ キャッシュヒットがあると、CloudFront はリクエストされたオブジェクトを返します。
+ キャッシュミスがあると、CloudFront はオリジングループのプライマリオリジンにリクエストをルーティングします。
+ プライマリオリジンがフェイルオーバー用に設定されていないステータスコード (HTTP 2xx や 3xx ステータスコードなど) を返すと、CloudFront はリクエストされたオブジェクトをビューワーに配信します。
+ 次のいずれかに該当する場合:
  + プライマリオリジンは、フェイルオーバー用に設定した HTTP ステータスコードを返す
  + CloudFront がプライマリオリジンに接続できない (503 がフェイルオーバーコードとして設定されている場合)
  + プライマリオリジンからのレスポンスに時間がかかりすぎる (タイムアウト) (504 がフェイルオーバーコードとして設定されている場合)

  この場合、CloudFront はオリジングループ内のセカンダリオリジンにリクエストをルーティングします。
**注記**  
ビデオコンテンツのストリーミングなど、ユースケースによっては、CloudFront をセカンダリオリジンにすばやくフェイルオーバーすることが必要になる場合があります。CloudFront がセカンダリオリジンにフェイルオーバーするのにかかる時間を調整するには、「[オリジンのタイムアウトと試行を制御する](#controlling-attempts-and-timeouts)」を参照してください。

CloudFront は、前のリクエストをセカンダリオリジンにフェイルオーバーした場合でも、すべての受信リクエストをプライマリオリジンにルーティングします。CloudFront は、プライマリオリジンへのリクエストが失敗した後にのみセカンダリオリジンにリクエストを送信します。

CloudFront は、ビューワーリクエストの HTTP メソッドが `GET`、`HEAD`、または `OPTIONS` の場合にのみ、セカンダリオリジンにフェイルオーバーします。ビューワーが別の HTTP メソッド (例えば `POST` や `PUT` など) を送信しても、CloudFront はフェイルオーバーしません。

**注記**  
キャッシュ動作で `OPTIONS` が [キャッシュされる HTTP メソッド](DownloadDistValuesCacheBehavior.md#DownloadDistValuesCachedHTTPMethods) として設定されていない場合、CloudFront はフェイルオーバーしません。

以下の図は、オリジンフェイルオーバーのしくみを示しています。

![\[オリジンフェイルオーバーのしくみ\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/images/origingroups-overview.png)


**Topics**
+ [オリジングループを作成する](#concept_origin_groups.creating)
+ [オリジンのタイムアウトと試行を制御する](#controlling-attempts-and-timeouts)
+ [Lambda@Edge 関数でのオリジンフェイルオーバーの使用](#concept_origin_groups.lambda)
+ [オリジンフェイルオーバーでのカスタムエラーページの使用](#concept_origin_groups.custom-error)

## オリジングループを作成する
<a name="concept_origin_groups.creating"></a><a name="create-origin-groups-procedure"></a>

**オリジングループを作成するには**

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. オリジングループを作成するディストリビューションを選択します。

1. **[オリジン]** タブを選択します。

1. ディストリビューションに複数のオリジンがあることを確認します。そうでない場合は、2 番目のオリジンを追加します。

1. [**Origin groups**] (オリジンのグループ) ペインの [**Origins**] (オリジン) タブで、[**Create Origin group**] (オリジングループの作成) を選択します。

1. オリジングループのオリジンを選択します。オリジンを追加したら、矢印を使用して優先度 (つまり、どのオリジンがプライマリで、どのオリジンがセカンダリであるか) を設定します。

1. オリジングループの名前を入力します。

1. フェイルオーバー基準として使用する HTTP ステータスコードを選択します。次のステータスコードを任意に組み合わせて選択できます。400、403、404、416、429、500、502、503、または 504。CloudFront は、指定したステータスコードの 1 つを含むレスポンスを受信すると、セカンダリオリジンにフェイルオーバーします。
**注記**  
CloudFront は、ビューワーリクエストの HTTP メソッドが `GET`、`HEAD`、または `OPTIONS` の場合にのみ、セカンダリオリジンにフェイルオーバーします。ビューワーが別の HTTP メソッド (例えば `POST` や `PUT` など) を送信しても、CloudFront はフェイルオーバーしません。

1. **[オリジン選択基準]** で、ディストリビューションがビューワーリクエストをルーティングするときにオリジンを選択する方法を指定します。以下のオプションを選択できます。  
**デフォルト**  
CloudFront は、**[設定]** ページで指定したデフォルトのオリジン優先度を使用します。  
**メディア品質スコア**  
CloudFront は、このスコアを追跡して使用し、リクエストを転送する先の最初のオリジンを決定します。これにより、CloudFront がオリジングループの代替オリジンに非同期 `HEAD` リクエストを行い、メディア品質スコアを決定することも許可します。このオプションは、AWS Elemental MediaPackage v2 のオリジンでのみ選択できます。詳細については、「[Media Quality-Aware Resiliency](media-quality-score.md)」を参照してください。

1. [**Create origin group**] (オリジングループの作成) を選択します。

ディストリビューションのキャッシュ動作のオリジンとしてオリジングループを割り当ててください。詳細については、「[名前](DownloadDistValuesOrigin.md#DownloadDistValuesId)」を参照してください。

## オリジンのタイムアウトと試行を制御する
<a name="controlling-attempts-and-timeouts"></a>

デフォルトでは、CloudFront は、セカンダリオリジンにフェイルオーバーする前に 30 秒間 (それぞれ 10 秒間の接続試行が 3 回)、オリジングループ内のプライマリオリジンへの接続を試行します。ビデオコンテンツのストリーミングなど、ユースケースによっては、CloudFront をセカンダリオリジンに、さらにすばやくフェイルオーバーすることが必要になる場合があります。以下の設定を調整して、CloudFront がセカンダリオリジンにフェイルオーバーするのにかかる時間を変更できます。オリジンがセカンダリオリジンであるか、オリジングループの一部ではないオリジンである場合、これらの設定は、CloudFront が HTTP 504 レスポンスをビューワーに返す速度に影響します。

よりすばやくフェイルオーバーするには、接続タイムアウトを短くするか、接続試行回数を減らすか、またはその両方を行います。カスタムオリジン (静的ウェブサイトホスティングで*設定されている* Amazon S3 バケットオリジンを含む) の場合、オリジン応答タイムアウトを調整することもできます。

**オリジン接続タイムアウト**  
オリジン接続タイムアウト設定は、オリジンへの接続を確立しようとしたときに CloudFront が待機する時間に影響します。デフォルトでは、CloudFront は接続の確立まで 10 秒待機しますが、1 ～ 10 秒 (両端の値を含む) を指定できます。詳細については、「[接続タイムアウト](DownloadDistValuesOrigin.md#origin-connection-timeout)」を参照してください。

**オリジン接続の試行**  
オリジン接続試行の設定は、CloudFront がオリジンへの接続を試行する回数に影響します。デフォルトでは、CloudFront は 3 回接続を試行しますが、1 ～ 3 (両端の値を含む) を指定できます。詳細については、「[接続の試行](DownloadDistValuesOrigin.md#origin-connection-attempts)」を参照してください。  
カスタムオリジン (静的ウェブサイトホスティングで設定された Amazon S3 バケットを含む) では、この設定は、オリジン応答タイムアウトの場合に CloudFront がオリジンから応答を取得しようとする回数にも影響します。

**オリジン応答タイムアウト**  
オリジン応答タイムアウト (オリジンリードタイムアウトとも呼ばれる) は、CloudFront がオリジンからの応答を受信する (または完全な応答を受信する) まで待機する時間に影響します。デフォルトでは、CloudFront は 30 秒間待機しますが、1～120 秒 (両端の値を含む) を指定できます。詳細については、「[応答タイムアウト](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout)」を参照してください。

### これらの設定を変更する方法
<a name="controlling-attempts-and-timeouts-how-to"></a>

**[CloudFront コンソール](https://console.aws.amazon.com/cloudfront/v4/home)でこれらの設定を変更するには**
+ 新しいオリジンまたは新しいディストリビューションの場合、リソースの作成時にこれらの値を指定します。
+ 既存のディストリビューションの既存のオリジンについては、オリジンを編集するときにこれらの値を指定します。

詳細については、「[すべてのディストリビューション設定リファレンス](distribution-web-values-specify.md)」を参照してください。

## Lambda@Edge 関数でのオリジンフェイルオーバーの使用
<a name="concept_origin_groups.lambda"></a>

Lambda@Edge 関数は、オリジングループで設定した CloudFront ディストリビューションで使用できます。Lambda 関数を使用するには、キャッシュ動作を作成するときにオリジングループの[オリジンリクエストまたはオリジンレスポンストリガー](lambda-cloudfront-trigger-events.md)で指定します。オリジングループで Lambda@Edge 関数を使用すると、1 つのビューワーリクエストに対して、この関数を 2 回トリガーできます。たとえば、次のシナリオが考えられます。

1. オリジンリクエストトリガーを使用して Lambda@Edge 関数を作成します。

1. Lambda 関数は、(キャッシュミス時に) プライマリオリジンに CloudFront がリクエストを送信したときに 1 回トリガーされます。

1. プライマリオリジンは、フェイルオーバー用に設定された HTTP ステータスコードで応答します。

1. CloudFront がセカンダリオリジンに同じリクエストを送信すると、Lambda 関数が再度トリガーされます。

次の図は、オリジンリクエストまたはレスポンストリガーに Lambda@Edge 関数を含める場合、オリジンフェイルオーバーがどのように機能するかを示しています。

![\[Lambda@Edge 関数でのオリジンフェイルオーバーの機能\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/images/origingroups-with-lambda-edge.png)


Lambda@Edge トリガーの使用の詳細については、「[Lambda@Edge 関数のトリガーを追加する](lambda-edge-add-triggers.md)」を参照してください。

DNS フェイルオーバーの管理の詳細については、「Amazon Route 53 デベロッパーガイド」の「[DNS フェイルオーバーの設定](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring.html)」を参照してください。**

## オリジンフェイルオーバーでのカスタムエラーページの使用
<a name="concept_origin_groups.custom-error"></a>

オリジンフェイルオーバー用に設定されていないオリジンでそれらを使用する方法と同様に、オリジングループでカスタムエラーページを使用できます。

オリジンフェイルオーバーを使用すると、プライマリまたはセカンダリオリジン (またはその両方) のカスタムエラーページを返すように CloudFront を設定できます。
+ **プライマリオリジンのカスタムエラーページを返す** - プライマリオリジンが、フェイルオーバー用に設定されていない HTTP ステータスコードを返す場合、CloudFront はカスタムエラーページをビューワーに返します。
+ **セカンダリオリジンのカスタムエラーページを返す** - CloudFront がセカンダリオリジンからエラーステータスコードを受け取った場合、CloudFront はカスタムエラーページを返します。

CloudFront でカスタムエラーページを使用する方法の詳細については、「[カスタムエラーレスポンスを生成する](GeneratingCustomErrorResponses.md)」を参照してください。