ELB配下のEC2アクセスログについてあれこれ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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の特性を理解してパフォチュー仙人になりましょう!