2018/05/29更新

[AWS] ELB経由のリクエストで、接続元IPをApacheのログに出力する

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、Elastic Load Balancing(ELB)を使った負荷分散をしている際に、Apacheなどのアプリケーション側で接続元IPアドレスを取得する方法をブログに書きたいと思います。



何が問題か

アプリケーションの前にELBがいる場合、何も設定しないと、接続元のIPアドレスはELBのIPアドレスになってしまいます。
# Accessログ
172.31.9.100 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
172.31.9.100 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
172.31.16.48 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
172.31.16.48 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
172.31.9.100172.31.16.48がELBのIPアドレスになっていて、実際の接続元がわかりません。



ELB経由の場合に接続元IPを取得するには

ELB経由の場合には、X-Forwarded-Forヘッダに接続元IPアドレスが設定されています。それをログに出力するように設定します。

例えば、httpd.confのログ設定を以下のように変更します。
# 変更前
LogFormat %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

# 変更後(「X-Forwarded-For」を追加)
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
これで出力されるようになります(xxx.xxx.xxx.xxxのところです)。
# Accessログ(変更後)
xxx.xxx.xxx.xxx 172.31.9.100 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
xxx.xxx.xxx.xxx 172.31.9.100 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
xxx.xxx.xxx.xxx 172.31.16.48 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200
xxx.xxx.xxx.xxx 172.31.16.48 - - [25/May/2018:23:17:23 +0000] "GET /api/items HTTP/1.1" 200



参考資料

X-Forwarded-For以外にX-Forwarded-ProtoX-Forwarded-Portが設定されています。具体的には以下の資料をご参照ください。

HTTP ヘッダーおよび Classic Load Balancer - Elastic Load Balancing(公式ドキュメント)



最後に

AWSのこのようなTips、どんどんと吸収したいところですね。今後もAWSについても色々とブログを書きたいと思います。

最後になりますが本ブログでは、インフラ、フロントエンド、PHP、サーバー、Swift、Node.js、Python、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。