Route53とS3でメンテナンス中のソーリー画面作る

EC2インスタンス1台の弱小構成だとソーリー画面ぐらい作っておきたい派。EC2インスタンス2台にすると高いし。調べたところELBから直接S3のスタティックホストに振れないようなので、前段のRoute53でDNSフェールオーバさせてS3のスタティックホストを返すというのが正しそう。

  • S3側でソーリー画面の準備
    • S3->Create Bucketメニューから作成。
      • Bucket Name: プライマリサイトのドメイン名と同じにする。S3で静的サイト作るための必須要件。
      • Region: プライマリサイトTokyoと別のリージョンUS Standardとかを指定する。
    • S3->(作ったバケット)->Actions->Uploadでソーリー画面用のsorry.htmlをアップロードする。

ソーリー画面はキャッシュされないようにheadにいろいろmetaタグ埋めておく。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Cache-Control" content="no-cache">
  <meta http-equiv="Expires" content="0">
  <title>sorry</title>
</head>
<body>
  Sorry. Site is currently under maintenance. Please try again later. 
  If you have an inquiry, please send your messeage to <a href=https://twitter.com/minamijoyo>@minamijoyo</a> .
</body>
</html>
    • S3->(アップロードしたファイル)->Actions->Make Publicで参照権限を与えるのを忘れないように。
    • S3->(作ったバケット)->Properties->Static Website Hostingで
      • Enable website hostingをON
      • Index Document: sorry.htmlを指定
      • Error Document: sorry.htmlを指定

SaveしたらエンドポイントのURL(http://(バケット名).s3-website-(リージョン).amazonaws.com/) が表示されてるのでそれにアクセスしてHTMLが見えることを確認しとく。

  • Route53でヘルスチェックを作る

ググるとヘルスチェックを手動で作成して関連付けする手順がいろいろ出てくるのだけど、マニュアル読むとELBをヘルスチェックする場合は、後述のレコード設定でEvaluate Target HealthをYesにするとAWSが自動で作成してくれるようです。

  • Route53でPrimaryサイトにDNSフェールオーバ設定する
    • Route53->Hosted Zones->(ドメイン名)->Go To Record Setsメニューから対象のAレコードまたはAliasを選択。
      • AliasはTTLを設定する項目がないけど、digってみるとTTL60秒に設定されてるよう。
      • Aレコードの場合はTTLを明示的に60秒ぐらいに短くした方がよい。
      • Routing Policy: Failoverにする。
      • Failover Record Type: Primary
      • Set ID: xxxx-Primaryがデフォルトで入力されるのでそのまま。
      • Evaluate Target Health: Yesにする。
      • Associate with Health Check: ELBをヘルスチェックするのでYesにする。
      • Health Check to Associate: 明示的に関連付ける必要がないのでNo。
  • Route53でSecondaryサイトのレコード作る。
    • Route53->Hosted Zones->(ドメイン名)->Create Record Setメニューから作成。
    • Name: URLの先頭部分
    • Type: A
    • Alias: Yes
    • Alias Target: さっき作ったS3に静的サイトを選ぶ
    • Routing Policy: Failover
    • Failover Record Type: Secondaryを選択
    • Set ID: xxxx-Secondaryがデフォルトで入力されるのでそのまま。
    • Evaluate Target Health: ヘルスチェックしないのでNo。
    • Associate with Health Check: ヘルスチェックしないのでNo。

試しにプライマリサイトのアプリを落としてみると、DNSフェールオーバーしてちゃんとS3側のソーリー画面が見えた。
サイトを復旧したらDNSの応答も戻ったけど、Chromeはなぜかno-cacheの指定しても効かないようでスーパーリロードしないとソーリー画面がキャッシュされてしまった。Chromeにも有効な上手い方法あったら誰か教えて下さい。

まぁなんにせよDNSのフェールオーバがこんなに簡単にできるとか驚きだ。むかしBIG-IPのGTM使って動的にDNSの応答変えたりとかがんばってたの懐かしい。

参考