I.T.の
エンジニアブログ

フェイルオーバーの方法を変えてみたが、あまり良くなかったかも

公開: 2021/9/25更新: 2024/12/8

以前まで

私の作ったウェブサービスでは、メンテナンス中の表示を出すのに、 以前まではRoute53のフェイルオーバー機能を使っていました。
これを使うと以下のように、普段はALBにルーティングされるが、 コンテナが落ちるとメンテナンス画面用S3にルーティングされるようにできます。
しかし、この方法はDNSキャッシュが悪さをしたり、反応が悪かったりしていまいち使い勝手が悪かったです。

no_cloudfront

CloudFrontを使ってみた

そこで、CloudFrontを間に挟み、CloudFrontのError Pages機能を使うことにしました。

まず、OriginsにALBとS3を登録します。
Behaviorsの設定がいろいろあってややこしいのですが、試行錯誤した結果、 キャッシュポリシーはCacheDisabledにしておき、オリジンリクエストポリシーはALBをAllViewerにして、 S3はCORS-S3Originで大丈夫そうです。
S3のPath Patternにエラー画面へのパスを設定し、他はALBに流れるようにします。
そして、Error Pagesで503とかをエラー画面にとばします。

この方法だとかなり反応がよく、エラー画面とサービスの画面の切り替わりがすごく速いです。これはいいかもしれません。

cloudfront

やっぱりよくなかったかも

しかし、この方法だと重大な問題があることに気づいたのはしばらく経ってからでした。
ALBはセキュリティグループでIP制限ができるのだが、CloudFrontにはそういう機能はないです。 ステージング環境で検証するときに全世界に大公開されてしまいます。
まあ大したものはないから別にいいですけどね。 せっかくセキュリティグループとか設定してたのが意味なくなるのはなんか嫌です。

そこで、ちょっと頑張って、HTTPヘッダーで制限をかける方式をつけることにしました。
独自のヘッダーに秘密の文字列が入っていないと、ALBのルールではじくようにしました。
ステージングで検証するときはFiddlerでヘッダを付加してアクセスできるようにします。 本番環境ではCloudFrontが勝手にカスタムヘッダを付加してくれるようにしてだれでもアクセスできるようにします。
もうこれでいいということにします。

まとめ

まあいろいろ勉強になったから良しとします。
Fiddlerは初めて使って結構手こずったけどすごい便利ですね。