Azure Load Balancerと Azure Application Gateway のアクセスログを比較してみる

はじめに

くどうです。

Azureにはアクセスを負荷分散する方法として、Load BalancerとApplication Gatewayが用意されています。
しかし、それぞれレイヤー4とレイヤー7で挙動が異なりHTTPdへのアクセスログが異なります。
そこで、今回はアクセスログについて比較していきたいと思います。

用意した環境はCentOS上にApacheをデフォルトの状態(yum install httpd)したものです。

Load Balancer

実際にログを確認してみます。

168.63.129.16 - - [10/Aug/2016:08:15:58 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 154 - -
168.63.129.16 - - [10/Aug/2016:08:16:03 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 178 - -
168.63.129.16 - - [10/Aug/2016:08:16:08 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 177 - -
168.63.129.16 - - [10/Aug/2016:08:16:13 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 183 - -
210.227.234.114 - - [10/Aug/2016:08:16:13 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 220 - -
210.227.234.114 - - [10/Aug/2016:08:16:14 +0000] "GET /favicon.ico HTTP/1.1" 404 287 "http://13.78.48.179/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 241 - -

Load Balancerからの死活監視(プローブ)は「Load Balancer Agent」と表示されます。
通常の外部からのアクセスもIPアドレスなども問題なく表示されています。

ただし、Load Balancerからの死活監視のログが邪魔ですね。
/etc/httpd/conf/httpd.conf を以下のように設定し排除します。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
SetEnvIf User-Agent "Load Balancer Agent" nolog
CustomLog logs/access_log combined env=!nolog

これで出力されなくなります。

Application Gateway

実際にログを確認してみます。

10.0.1.6 - - [10/Aug/2016:07:46:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-"
10.0.1.6 - - [10/Aug/2016:07:46:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-"
10.0.1.6 - - [10/Aug/2016:07:47:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-"
10.0.1.6 - - [10/Aug/2016:07:47:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-"
10.0.1.7 - - [10/Aug/2016:07:47:46 +0000] "GET / HTTP/1.1" 200 5 "-" "-"
10.0.1.7 - - [10/Aug/2016:07:47:46 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
10.0.1.7 - - [10/Aug/2016:07:47:49 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
10.0.1.7 - - [10/Aug/2016:07:47:51 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"

アクセス元は、すべてApplication Gatewayの内部アドレスになっていることが分かります。
これでは、アクセスログの解析には役立ちません。

これを解決する方法として、X-Forwarded-ForとX-Forwarded-Protoをログに残します。
これはAWS ELBとも同じです。

/etc/httpd/conf/httpd.conf を編集しています。

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined

実際にログを確認してみます。

10.0.1.6 - - [10/Aug/2016:07:53:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 426 - -
10.0.1.7 - - [10/Aug/2016:07:53:46 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 423 - -
10.0.1.6 - - [10/Aug/2016:07:54:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 892 - -
10.0.1.7 - - [10/Aug/2016:07:54:16 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 406 - -
10.0.1.7 - - [10/Aug/2016:07:54:19 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 338 210.227.234.114:27756 http
10.0.1.7 - - [10/Aug/2016:07:54:21 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 299 210.227.234.114:27756 http
10.0.1.7 - - [10/Aug/2016:07:54:23 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 361 210.227.234.114:27756 http

末尾の方でX-Forwarded-ForとX-Forwarded-Protoが取得できていることが確認できます。
これで問題なく解析が行えるかと思います。

まとめ

アクセスを負荷分散するLoad BalancerとApplication Gatewayですが、それぞれ出力されるアクセスログも異なるため気を付けましょう。
また、対処する方法も異なるので気を付けましょう。これらはAzureに限ったことではありません。
X-Forwarded-ForとX-Forwarded-Protoが利用されるケースが多いので覚えておくとよいと思います。

ではでは