この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ELBのヘルスチェックって?
ELBでは配下のEC2インスタンスが正常に動いているか定期的に接続確認をしています。これをヘルスチェックといいます。自動でインスタンスの数を調整してくれるオートスケーリング設定のトリガーとなりますので、正しく動いていないと困ります。最近何件か続いていた問題があったのでご紹介したいと思います。
開発中のサーバに認証をかける
EC2インスタンスにApacheなどのWebサーバを立てて複数の場所から関係者のみ動作確認をしたい場合、一番てっとり早い方法はドキュメントルート以下全てに認証を掛けることです。しかし、ここに落とし穴があります。ELBのヘルスチェック用URLにも認証を掛けてしまって、ELBからのチェックが通らなくなってしまうことです。今回は、特定のURLのみ認証から外す設定を行ってみたいと思います。
ざっくり認証を掛けてしまう例
こちらはザックリとドキュメントルート以下にBasic認証を掛ける例です。Locationタグではなく、Directoryで絶対パスを指定してもOKです。
<Location />
AllowOverride all
AuthType Basic
AuthName "Login"
AuthUserFile /var/hoge/.htpasswd
Require valid-user
</Location>
ヘルスチェック用URLだけ外す例
特定のURLだけ認証を外すには、ApacheのSatisfyを用います。以下は/hello.txtを外す例です。
<Location />
AllowOverride all
Satisfy Any
AuthType Basic
AuthName "Login"
AuthUserFile /var/hoge/.htpasswd
Require valid-user
SetEnvIf Request_URI "/hello.txt" healthcheck
Order Deny,Allow
Deny from all
Allow from env=healthcheck
</Location>
まとめ
HTTPでのチェックがダメならTCPでどこかのポートを開けようかなとも思ったのですが、ロードバランシングする場合には多くの場合Webサーバーだと思うので、サーバーが生きててもApacheがビジーだったり死んでたらアンヘルシーとして扱ったほうがベターだなということで特定URLのみを認証から外すようにしました。何事も解決策があるってことですなぁ。今日から君も開発中のサーバーにBasic認証を掛けてしまおう!