AWS ELBのログをFluentd(td-agent)で集めて集計していました。最近、いくつかALBを使うサービスが出てきました。
このALBですが、
たぶん ALB(Application Load Balancer)
が正式名称だと思っているのですが、たまに Elastic Load Balancing Version 2
と書いてあったり、APIでは AWS/ApplicationELB
となっていたりします。たまによくわからなくなります。
で、そのALB用のFluentdプラグインを探してみたのですが見つからなかったので、お世話になっているこちらのプラグインを元に作ってみました
アクセスログ観点でのELB(Classic Load Balancer )との変更点と対応
アクセスログの形式が変更された
アクセスログの形式が変更されています。HTTP/2 や WebSocket 受けれるようになったので、それを表すTypeという項目が増えていたり、ALBからの概念であるTargetGroupが増えていたりします。
後は X-Amzn-Trace-Id
という個別のリクエストをトレースするための情報もあります。
項目の一覧はこちらのリンクです。
ログがgzip形式で保存されるようになった
後はログがgzip形式で圧縮されて保存されているので、これの解凍が必要です。複数ファイルがgzipで圧縮されている状態なので Zlib::GzipReader
を拡張した以下のGem使いました。
ソースコード
Amazon ALB(Application Load Balancer) log input p ...
インストール
Gem化してないため fluent-gem
使えないです。
なのでダウンロードして以下の場所に配置して使います。
/etc/td-agent/plugin/in_alb_log.rb
設定は元の fluent-plugin-elb-log
とほぼ変更ありません。
type
の項目のみ alb_log
としてください。
<source> type alb_log region us-east-1 s3_bucketname my-alblog-bucket s3_prefix prodcution/web timestamp_file /tmp/elb_last_at.dat buf_file /tmp/fluentd-alblog.tmpfile refresh_interval 300 tag alb.access access_key_id XXXXXXXXXXXXXXXXXXXX secret_access_key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx </source> <match **> type stdout </match>
プラグインのアウトプット例はこのような感じです。
{ "account_id": "123456789012", "region": "ap-northeast-1", "logfile_date": "2016/12/13", "logfile_alb_name": "app.your_alb_name.1112345ee6cb6789f", "alb_ip_address": "52.193.1.1", "logfile_hash": "1owaarp9", "alb_timestamp": "20161213T0435Z", "key": "path/to/your_alb_log/logname.log.gz", "prefix": "path/to/your_alb_log", "alb_timestamp_unixtime": 1481603700, "type": "http", "time": "2016-12-13T04:30:02.028143Z", "alb_fullname": "app/your-alb-name/111111aa2bb3333f", "alb": "your-alb-name", "client": "10.10.10.10", "client_port": "57550", "target": "192.168.1.100", "target_port": "80", "request_processing_time": 0, "target_processing_time": 0.037, "response_processing_time": 0, "elb_status_code": "200", "target_status_code": "200", "received_bytes": 209, "sent_bytes": 26108, "request_method": "GET", "request_uri": "http://yourdomain.com:80/path/to/contents", "domain": "yourdomain.com", "request_protocol": "HTTP/1.1\"", "user_agent": "-", "ssl_cipher": "-", "ssl_protocol": "-", "target_group_arn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/your_target_group/aaa12f883c64c674", "target_group_name": "your_target_group", "trace_id": "Root=1-583f7949-5c791cef1d063ae227c00000" }