目次
はじめに
こんにちは、omkです。
CloudFront使ってますか!?
最近はあんまり使えてなかったので使っていきます!!
やりたいこと
サイトの正常性をもとに、異常時には別リージョンでホストされるサイトにフェイルオーバーしたいです。
今回はS3の静的サイトをCloudFrontで配信する構成で、CloudFrontのオリジングループを使うことで簡単に別リージョンのS3にフェイルオーバーするようにします。
オリジングループでは優先度を元にプライマリで設定したオリジンにリクエストを投げ、指定したフェイルオーバー基準の応答があった場合に別のオリジンにリクエストを投げるような動きをします。
これをつかってお手軽なDR構成を実現してみます。
やってみた
S3バケットとページの作成
まずは東京リージョンとバージニア北部リージョンにそれぞれS3バケットを作成し、リージョンに対応したページを配置します。
東京には「ap-northeast-1」と書かれた赤いページを置きます。
バー北には「us-east-1」と書かれた緑のページを置きます。
CloudFrontの設定
次にディストリビューションを作成してオリジンを設定していきます。
東京とバー北のS3バケットをそれぞれ登録しました。
オリジンが2つ以上あればオリジングループが作成できます。
画像のように設定しました。
フェイルオーバー基準としてはS3はなかなか500番台のエラーを返すことはないので今回は403を含めて、S3バケットのOACの許可設定を書き換えて検証してみます。
ビヘイビアに作成したオリジングループを設定します。
これで準備は完了です。
動作検証
ではサイトにアクセスしてみます。
通常時はプライマリに設定した東京のバケットからページを受け取ります。
東京のバケットのバケットポリシーを変更して再度アクセスします。
画面が変わったのでフェイルオーバーされたことが分かります。
簡単に別リージョンから静的サイトを配信できるようになりました。
お手軽でいいですね。
おまけ
S3とALBのオリジングループはできる?
結論: できない……と思う
オリジンリクエストポリシーの問題で基本的にALBとS3で同じ条件で接続できないと思います。
どちらかに寄せるか、出したいページがエラーページなのであればカスタムエラーレスポンスなどでいい感じに調整するのが良いと思います。
オリジンからの応答がない場合はどうなる?
結論: CloudFrontのオリジンで設定したタイムアウトを待つ
試しにセキュリティグループのルールを空にしたALBをプライマリにして、そうでないALBをセカンダリにしてオリジングループを作成してみました。
この状態でCloudFrontにリクエストしてみたところ、セキュリティグループが設定されていないのでALBには到達出来ず、オリジンに指定したコネクションタイムアウト×試行回数の30秒後にフェイルオーバーしました。
タイムアウト時間はできるだけ短めに設定できるといいですね。
フェイルバックはどうなる?
結論: 自動でされる
というか毎回プライマリにリクエストするのでプライマリが正常になればそちらから応答が返ります。
おわりに
簡単にフェイルオーバーできて便利ですね。
以上、最後までお付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!