はじめに
Nginx、ELBに関して説明は端折りますが、概要を知りたい方は以下が参考になるかと思います。
本記事の前提条件
- ELB + EC2(WEB/AP)の構成を組んでいること
- Nginxをインストール済のEC2インスタンス (ソーリーサーバ用)が用意してあること
Nginxのコンフィグ設定
色々と試行錯誤して以下に落ち着きました
server {
listen 80;
root /var/www;
location = /healthcheck {
empty_gif;
access_log off;
break;
}
# ELBからのhealthcheckは通す
set $sorry true;
if ($request_uri = "/healthcheck") {
set $sorry false;
}
error_page 503 @sorry;
location @sorry {
rewrite ^(.*)$ /sorry.html break;
}
if ($sorry = true) {
return 503;
}
}
※ ドキュメントルート、URIの部分は適宜読み替えてください
実施
Nginxを起動(もしくはリロード)する
$ sudo service nginx start
OR
$ sudo service nginx reload
ELBの付け替えをする
この時の注意点なのですが、ELBは切り替え後サービスインするまでに数分かかるので、以下の順序で実施するとよいでしょう。
- SorryサーバをELBにぶら下げる
- Sorryサーバのステータスが Out of Service -> In Sercice になることを確認する
- WEB/APサーバをELBからはずす
これでどのURLを叩かれてもソーリーページが開き、HTTPのステータスコードも 503 で返るはずです。
付け替えの方法は、 マネジメントコンソール OR CLI OR SDKのいずれかになるかと思います。マネジメントコンソールからの操作は以下の動画が参考になるかと思います。
Introduction to Elastic Load Balancing
マネジメントコンソールは便利なのですが、手続きが少し多いので、ヒューマンエラーを減らすためにもできるだけCLIやSDKを利用してコマンド一発で切り替えられるようにしておきたいですね。(ChatOpsを取り入れている会社であればBOTにお願いするのが今風かもですね)
さいごに
S3のWebホスティング利用して、Route53で切り替えじゃダメなの?
個人的にはステータスコードを503
で返したいのでナシですが、ステータスコードが200
で返っても問題ないのであればアリだと思います。その場合は以下のクラスメソッドさんの記事が参考になるかと思います。
[Amazon Route 53のDNSフェイルオーバー機能を利用したリージョンを跨いだバックアップサイトの構築(EC2 to S3編)]
(http://dev.classmethod.jp/cloud/route-53-dns-failover-s3/)