
CloudFrontを利用してオリジンサーバー障害時にS3上のコンテンツを表示する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、坂巻です。
CloudFrontのマルチオリジン(ELB-Origin、S3-Origin)構成で、オリジンサーバの障害時に、S3 Originに自動的に切り替わるように設定してみたいと思います。
構成
マルチオリジン(ELB-Origin、S3-Origin)のパスよるオリジンの振り分けを設定した構成です。

設定
S3バケット
障害時に表示させたいコンテンツ格納するバケット「nochi251」を作成します。配下にmaintenanceフォルダを作成し、ファイルを格納しています。

S3 Originは、通常のバケットとして設定するか、Webサイトホスティング機能を有効にして使用するかで、機能に違いがあるのでご注意ください。詳細は以下をご確認ください。
ここでは、Webサイトホスティングは設定せず、S3 Origin(バケット)として利用します。CloudFrontからのアクセスを許可する設定は、後ほどCloudFront経由で設定を行います。
CloudFront
Origins
ELB-Originと、障害時用のオリジンとしてS3-Originを追加します。

ここで注意頂きたいのは、S3 Originの以下の設定です。

CloudFrontからのみ、該当バケットへのアクセスを許可する設定です。Grant Read Permissions on Bucketを「Yes」にすることでバケットポリシーが更新されます。
バケット「nochi251」のバケットポリシーに、CloudFrontからのアクセス許可が設定されました。

こちらの設定の詳細については、以下をご確認ください。
Behaviors
maintenance/* を追加し、S3 Originを指定します。

Error Pages
HTTP Error Codeに502〜504を指定し、Response Page Pathに、/maintenance/index.htmlを指定します。こちらは、要件にあわせ考慮が必要です。

やってみた
通常時は、CloudFrontに設定したドメインにアクセスすると、ELB-Origin配下のWebサーバが応答します。

次は、擬似的な障害として、ALBのセキュリティグループのルールを変更し、CloudFrontからELB-Originにアクセスできない状況をつくりました。この状態でアクセスすると、パスよる振り分けでS3 Originにアクセスされます。

さいごに
Route53のフェイルオーバー等で、上記のような事もできるかと思いますが、オリジンへのHTTPS通信が必須の場合、SSL証明書のエラー(S3ウェブホスティングにSSL証明書は割り当てられない)になるので、このような構成になるのではないでしょうか。






