AWS ALB(Application Load Balancer)のアクセスログをFluentdにInputする

AWS ELBのログをFluentd(td-agent)で集めて集計していました。最近、いくつかALBを使うサービスが出てきました。

このALBですが、

たぶん ALB(Application Load Balancer) が正式名称だと思っているのですが、たまに Elastic Load Balancing Version 2 と書いてあったり、APIでは AWS/ApplicationELB となっていたりします。たまによくわからなくなります。

で、そのALB用のFluentdプラグインを探してみたのですが見つからなかったので、お世話になっているこちらのプラグインを元に作ってみました

github.com

アクセスログ観点でのELB(Classic Load Balancer )との変更点と対応

アクセスログの形式が変更された

アクセスログの形式が変更されています。HTTP/2 や WebSocket 受けれるようになったので、それを表すTypeという項目が増えていたり、ALBからの概念であるTargetGroupが増えていたりします。

後は X-Amzn-Trace-Id という個別のリクエストをトレースするための情報もあります。

docs.aws.amazon.com

項目の一覧はこちらのリンクです。

docs.aws.amazon.com

ログがgzip形式で保存されるようになった

後はログがgzip形式で圧縮されて保存されているので、これの解凍が必要です。複数ファイルがgzipで圧縮されている状態なので Zlib::GzipReader を拡張した以下のGem使いました。

github.com

ソースコード

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"
}