時折やってくるAWSからのサーバーリブートスケジュールのお知らせ。
この通知が来た際にはインスタンスの停止・起動が不可避ですが、夜間にAWSのタイミングで実施されると復旧後の確認などがハンドリングしづらくなるため、自分たちで事前にメンテナンススケジュールを組むことが多いかと思います。
冗長化してあれば話は簡単ですが、EC2 1台に対してElasticIPを振って、Route53を使ってドメインとひも付けを行なっている場合、EC2を停止すると名前解決ができなくなってしまいメンテナンス中かどうかすらわからなくなってしまいます。
TTLを短くして、メンテナンスのタイミングで向き先を変えることもできますが、メンテナンスの時にはそういうチキンレース的なことはしたくないですよね。
ということでRoute53のヘルスチェックとフェイルオーバーを使うと便利です。という話です。
詳しいやり方は
http://dev.classmethod.jp/cloud/route-53-dns-failover-s3/
が丁寧に書いてあるのでここを見るといいと思います。
注意点
SecondaryをCNAMEで設定しようとすると以下の様なエラーが出ます。
RRSet of type CNAME with DNS name sub.domain.com. is not permitted as it conflicts with other records with the same DNS name in zone domain.com.
Route53と異なるAWSアカウントでS3バケットを作成し、そこをSecondaryに指定する際には Alias Targeに s3-website-ap-northeast-1.amazonaws.com を指定する(リージョンを指定する、バケット名とかは不要)
内部の仕組みとして サブドメイン名とバケット名をひも付けてくれるようです。そのため、バケット名はサブドメイン名と合わせておくのが重要になります。
http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html#rrsets-values-alias-alias-target
注意点
Route53のヘルスチェックはエンドポイントに対して定期的にアクセスするのでそれなりに負荷がかかります。