ELB配下のEC2アクセスログについてあれこれ
ELB配下のEC2インスタンスは接続元がELBのアドレスになる
ELB配下のEC2インスタンスが、接続元のIPアドレスなど情報を得ようとする場合、初期設定ではおそらくELBのIPアドレスが返されてしまいます。これは、ELBを経由しているので当たり前といえば当たり前ですが、これではどこからアクセスされているのか把握できません。そこで、ELBの機能を利用して接続元のIPアドレス等を取得したいと思います。
X-Forwarded-ForとX-Forwarded-Proto
ELBには市販されているロードバランサー製品と同じように、接続元のIPアドレスをヘッダー情報に付けてくれます。そこで、EC2インスタンス側でその情報を取得してログとして書き出してみます。また、ELBはSSLターミネーション機能がありますので、接続元がどのプロトコル(HTTPかHTTPSか)でEC2インスタンスにアクセスしたのか分かりません。こちらも同様にヘッダー情報として取得できます。
以下は、httpd.confの記述です
LogFormat "%h %l %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined
ELBの死活監視アクセスログを取らない
ELB配下のEC2インスタンスにおいて、ApacheなどのWebサーバーは初期設定において全てのアクセスログを取ります。こんなELBの死活監視に関するログがありませんでしょうか?
10.146.99.218 - - [25/Jan/2012:15:25:52 +0000] 601 "GET /index.html HTTP/1.1" 200 30 "-" "ELB-HealthChecker/1.0" 604 - -
死活監視してくれているのはありがたいのですが、大量にログが残りますのでログに残さないようにします。
LogFormat "%h %l %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined SetEnvIf User-Agent "ELB-HealthChecker/1\.0" nolog CustomLog "logs/access_log" combined env=!nolog
Apacheを再起動して動作を確認するとELBのログがありませんね。成功です。
ついでに画像やCSSのログも取らない
httpd.confの編集でチューニングできたので、ついでに画像やCSSのログも取らないようにしたいと思います。本来、静的ファイルはS3等に置くことがベターですが、直ぐに対応できないときはログ書き込みの負荷を減らしましょう。
LogFormat "%h %l %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined SetEnvIf Request_URI "\.(gif|jpg|png|css|ico|js)$" nolog SetEnvIf User-Agent "ELB-HealthChecker/1\.0" nolog CustomLog "logs/access_log" combined env=!nolog
まとめ
心なしか全体の動作が早くなったような気がします。まぁ、この程度なら気のせいです。他にも動作パフォーマンスを上げるテクニックはたくさんあります。本来ログは足跡ですので重要な情報のみを保存するべきですが、初期設定のままだと何でも取ってしまいます。これが公開サーバーの場合だとディスクがいっぱいになってしまいますし、分析する際にも時間が掛かります。サーバーへのディスク書き込み負荷なども発生するかもしれません。ということで、ELBやEC2の特性を理解してパフォチュー仙人になりましょう!