Elastic Load Balancingのヘルスチェックだけ認証から外す

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認証を掛けてしまおう!

参考資料

Apache コア機能 Satisfy ディレクティブ