NginxでAWS ELBのHealth Checkログを出力させない方法


NginxでAWS ELBのHealth Checkをアクセスログとして出力させない方法を紹介します

環境

方法

コンフィグ

map $http_user_agent $loggable {
    ~ELB-HealthChecker  0;
    default             1;
}

access_log  /var/log/nginx/access.log main if=$loggable;

解説

mapとaccess_logに分けて少し解説していきます

map

map $first $second {...}とすると、$first{...}に沿って評価して返り値を$secondにマッピングします
今回の場合は$http_user_agent、つまりHTTPヘッダーに含まれるUser AgentがELB-HealthCheckerに部分一致するか評価して一致するなら0、一致しなければ1を$loggableにマッピングします

ELB-HealthCheckerの前についている~は正規表現を使うための記号です
~はcase-sensitiveで、~*はcase-insensitiveです

[備考]
2020/10時点では正式なUser AgentはELB-HealthChecker/2.0でした
/以降はバージョンなので今後変更の可能性があるので、ELB-HealthCheckerが含まれているかだけチェックしましょう

access_log

access_logにはifというパラメータがあります
条件が0か空文字と評価されたらログ出力しなくなります
今回は$loggableのデフォルトが1で、ELB-HealthCheckerがUser Agentに含まれていたら0になるので、Health Checkのアクセスログが出力されなくなります。

Reference