アプリを運用しているとメンテナンス画面どうしようかと考えることがあると思います。
同じサーバでメンテナンス画面を用意している人もいるかもしれませんが、サーバ自体を落としたりしたいときはそれができないですよね。
だからと言って、それ専用のサーバなんか立てたくない。と思い、メンテナンス画面をs3でホスティングして、切り替える方法を検討しました。
手順
今回はメンテナンス画面も独自ドメインかつhttps対応しています。
1. AWS S3でのhttps対応含む静的ウェブサイト公開の手順でメンテナンス画面を公開する
2. 上記のCloudFrontのDistributionを作成するときに、[Alternate Domain Names (CNAMEs)]に対して、メンテナンス画面に移行する元のurlもコンマ区切り、もしくは改行で入れる(アプリがapp.XXX.co.jpでメンテナンス画面がmaintenance.XXX.co.jpであればこれを二つ入れる)
3. これだけだと、例えばapp.XXX.co.jp/topとかのようにアプリのどこかのページを開いている時にメンテナンスモードになると、s3バケットの/topを探しに行き、ないので、403が返ってきてしまう。そのため、CloudFrontのError Pagesで403が帰ってきたらmaintenanceのhtmlに飛ばすよう設定する
4. Route53で[create record set]で[name]=[app.XXX.co.jp],[Type]=[CNAME],[value]=[maintenance.XXX.co.jp.]とする(既にRoute53でELBなどにルーティングしている場合は、[app_.XXX.co.jp]などのnameでAレコードを作成し、そのALIASにELBを設定する。その上で通常は[app.XXX.co.jp]のCNAMEレコードを作成し,[value]を[app_.XXX.co.jp]としておく。)
上記であれば、通常時は[app.XXX.co.jp]へのアクセスは[app_.XXX.co.jp]にルーティングされ、それがELBに流れる
メンテナンス時は[app.XXX.co.jp]へのアクセスが[maintenance.XXX.co.jp]にルーティングされ、メンテナンス画面が表示される。メンテナンス画面の更新も、s3のファイルを置き換えるだけなので便利。
追記
上記はiOS/androidのwebviewで見せるためのものだったのですが、通常のPCブラウザやiOSのwebview,androidのブラウザなどはOKだったんですが、androidのwebviewのみDNSの名前解決ができず、エラーとなってしまいました。。。
原因は結局わかりませんでしたので、最終的にはapp.XXX.co.jpのAレコードのAliasをapp.XXX.co.jpに向いているELBのDNSと, maintenance.XXX.co.jpに向いているcloudFrontのDNSで切り替えてやることで対応しました。
ただし、この場合はELBやCloudFrontを立て直した場合は、動的に取得してやらないとrakeタスクなどでコマンド一発で切り替えようとすると不便です。。。
やはりandroid謎。。。
何か修正、コメントあればお願いします!