CloudFrontを利用してオリジンサーバー障害時にS3上のコンテンツを表示する
こんにちは、坂巻です。
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証明書は割り当てられない)になるので、このような構成になるのではないでしょうか。