こんにちは。katoです。
Route53のDNSフェイルオーバー機能を利用してECサイトからS3サイトへの切り替えを行う方法を紹介させていただきます。
ランニングコストの削減やDR対策としても活用出来る機能となっております。
全体構成
今回は、下記のような構成にて動作を見ていきたいと思います。
通常時はアクセスをELBに向け、ターゲットグループ内のインスタンスがすべてヘルスチェックに失敗した場合にのみ、S3上のエラードキュメントを返すという動作になります。
本構成では、S3からエラーページを表示することができるので、sorry-serverが不要となります。障害対策としてだけではなく、夜間のサーバ停止を行う際などには、不要なインスタンスのランニングコストを抑えることにつながります。
設定方法
ALB作成
今回は、ALBを利用し、通信には80番ポートを利用したいと思います。 443番ポートでの通信を行う場合には、CloudFrontの設定が別途必要となります。
ヘルスチェックの設定を行い、ターゲットインスタンスを選択します。
ここでは設定していませんが、ヘルスチェックの詳細設定は適宜行ってください。 デフォルトのヘルスチェック間隔は30秒となっており、この間にインスタンスに障害が発生した場合は、bad gatewayのエラーページが表示される可能性があります。
ALBの作成が完了したら、ターゲットがの状態がhealthyと表示されるのを確認して、次の手順に向かいます。
S3静的ウェブサイトホスティング
S3サイトのための静的ウェブサイトホスティング設定を行っていきます。
まず、S3サイト用のバケットを作成します。 ここで重要になるのが、ECサイトで使用するドメインと同名のバケットを作成することです。 今回の場合、「web.xxx.xxx」というドメインにて設定を行うため、同名のバケットを作成します。
バケットの作成が完了したら、静的ウェブサイトホスティングを有効にします。
バケット内にindex.htmlの名前でエラーページ用のhtmlファイルをアップロードします。 htmlファイルのアップロード後は、エラーページへのアクセスが可能な様に、アクセス権の設定を適宜行ってください。
Route53 DNSフェイルオーバー
ここからは、ルーティングの設定となりますが、設定自体は簡単で、下記の様にレコードセットの作成を行うだけです。
ELBをプライマリ、S3をセカンダリとして登録します。
ELBレコードセットの設定にて「Evaluate Target Health」をyesにすることで、ELBのヘルスチェックの結果でルーティングが行われるようになります。
動作確認
通常時は下記の様にECサイトのウェブページが表示されます。
webサーバにてHTTPサービス停止し、動作の確認を行います。 ターゲットグループ内のインスタンスがunhealthyの状態で下記の様にS3上のエラーページが表示されました。
ターゲットグループ内のいずれかのインスタンスがhealthyに戻ると、ELB側にルーティングされるようになります。
まとめ
Route53のDNSフェイルオーバー機能は、今回の様に障害時のエラーページへの切り替えという用途以外にも、別リージョンに建てたセカンダリサイトへの切り替えなど、幅広い応用が利く機能となっております。
設定自体も簡単で、他AWSサービスとの連携も可能なので、多くのシーンでご活用いただけるのではと思います。