VPC Flow Logsを分析、可視化する方法を模索しており、以下のツール・サービスを試しました。
- sumologic
- Splunk
- ElasticSearch
- ElasticSearch Service
どれも素晴らしいツールなのですが、気軽にログを調査する、集計するといった用途で使うには少々大がかりです。もっと気軽なツールはないかとGithubをさまよった結果、obsrvbl/flowlogs-readerというツールを見つけたので試してみました。
インストール
READMEに書いてある通りです。ソースからインストールしてみました。
git clone https://github.com/obsrvbl/flowlogs-reader.git
cd flowlogs-reader
pyenv exec python setup.py develop
基本操作
READMEに従って、flowlogs_reader logGroupName
を実行してみます。
$ pyenv exec flowlogs_reader VPCFlowLogGroup
Traceback (most recent call last):
(中略)
botocore.exceptions.ClientError: An error occurred (ResourceNotFoundException) when calling the FilterLogEvents operation: The specified log group does not exist.
そんなロググループはないと怒られました。これはリージョンを指定していないことが原因です。デフォルトのリージョンはus-east-1になっていますが、私のAWSアカウントのus-east-1にはlogGroupNameというVPC Flow Logsが存在しません。東京リージョンにはlogGroupNameというVPC Flow Logsが存在していますので、--region
で東京リージョンを指定します。
$ pyenv exec flowlogs_reader VPCFlowLogGroup --region ap-northeast-1
2 743065858817 eni-63444414 54.245.120.220 172.20.0.10 443 51378 6 13 1982 1454337327 1454337447 ACCEPT OK
2 743065858817 eni-63444414 103.246.150.154 172.20.0.10 443 47354 6 10 1223 1454337327 1454337447 ACCEPT OK
2 743065858817 eni-63444414 27.0.2.250 172.20.0.10 443 50540 6 10 935 1454337327 1454337387 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 103.246.150.154 47354 443 6 12 1501 1454337327 1454337447 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 27.0.2.250 50539 443 6 12 1501 1454337327 1454337387 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 27.0.2.250 50540 443 6 12 1501 1454337327 1454337387 ACCEPT OK
2 743065858817 eni-63444414 195.99.212.67 172.20.0.10 53 57627 17 1 77 1454337327 1454337387 REJECT OK
出ました!なにこれすごい!
時間指定
-s
と-e
オプションを使うことで、抽出する範囲を限定することができます。
$ pyenv exec flowlogs_reader VPCFlowLogGroup --region ap-northeast-1 -s '2016-02-01 10:59:00' -e '2016-02-01 11:00:00'
2 743065858817 eni-63444414 172.20.0.10 103.246.150.154 44589 443 6 12 1501 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 103.246.150.154 172.20.0.10 443 44589 6 10 935 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 103.246.150.154 172.20.0.10 443 44591 6 10 935 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 54.245.120.220 172.20.0.10 443 48618 6 7 1079 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 103.246.150.154 44591 443 6 12 1501 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 103.246.150.154 44592 443 6 6 313 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 103.246.150.154 172.20.0.10 443 44588 6 9 895 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 103.246.150.154 172.20.0.10 443 44592 6 4 306 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 54.245.120.220 48618 443 6 11 2232 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 103.246.150.154 44588 443 6 12 1501 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-98fccfd1 104.216.59.132 172.20.0.106 57664 6379 6 1 40 1454324381 1454324411 REJECT OK
おおお、すごい。VPC Flow Logs内のstartをもとにフィルタリングしてるようです。
IPアドレスで抽出
findip
を利用することで、IPアドレスを利用したログの抽出が可能です。
$ pyenv exec flowlogs_reader VPCFlowLogGroup findip 54.245.120.220 --region
ap-northeast-1 -s '2016-02-01 10:59:00' -e '2016-02-01 11:00:00'
2 743065858817 eni-63444414 54.245.120.220 172.20.0.10 443 48618 6 7 1079 1454324362 1454324415 ACCEPT OK
2 743065858817 eni-63444414 172.20.0.10 54.245.120.220 48618 443 6 11 2232 1454324362 1454324415 ACCEPT OK
AWKで処理する
VPC Flow Logsの内容が標準出力されるということは、AWKで自由に編集できるということです。
まずは、VPC Flow Logsの時刻をJSTに変換、かつ不要なフィールドを削除することで可読性を向上してみます。
$ pyenv exec flowlogs_reader VPCFlowLogGroup --region ap-northeast-1 -s '2016-02-01 10:59:00' -e '2016-02-01 11:00:00' | awk -F" " '{print strftime("%F %T %Z",$11) " " $4 " " $5 " " $6 " "
$7 " " $10 " " $13}'
2016-02-01 19:59:22 JST 172.20.0.10 103.246.150.154 44589 443 1501 ACCEPT
2016-02-01 19:59:22 JST 103.246.150.154 172.20.0.10 443 44589 935 ACCEPT
2016-02-01 19:59:22 JST 103.246.150.154 172.20.0.10 443 44591 935 ACCEPT
2016-02-01 19:59:22 JST 54.245.120.220 172.20.0.10 443 48618 1079 ACCEPT
2016-02-01 19:59:22 JST 172.20.0.10 103.246.150.154 44591 443 1501 ACCEPT
2016-02-01 19:59:22 JST 172.20.0.10 103.246.150.154 44592 443 313 ACCEPT
2016-02-01 19:59:22 JST 103.246.150.154 172.20.0.10 443 44588 895 ACCEPT
2016-02-01 19:59:22 JST 103.246.150.154 172.20.0.10 443 44592 306 ACCEPT
2016-02-01 19:59:22 JST 172.20.0.10 54.245.120.220 48618 443 2232 ACCEPT
2016-02-01 19:59:22 JST 172.20.0.10 103.246.150.154 44588 443 1501 ACCEPT
2016-02-01 19:59:41 JST 104.216.59.132 172.20.0.106 57664 6379 40 REJECT
すごく見やすくなりました。一般的なファイアウォールのログのようです。この形式であればトラブルシュートが簡単ですね。
どのようなデータを得られるかは、分析の要件をシェル芸で実装できるかどうか次第です。私はシェル芸力が赤ちゃんレベルなので、Google先生に聞きながら、172.20.0.10からのOutbound通信を、通信量が多いホスト順に集計するワンライナーを書いてみました。
$ pyenv exec flowlogs_reader VPCFlowLogGroup --region ap-northeast-1 | awk -F" " '{if($4 ~ /^172.20.0.10$/) print $4 " " $5 " " $6 " " $7 " " $10}' | awk -F " " '{ arr[$2] += $5 } END {for
(i in arr) {print arr[i] "\t" i } }' | sort -nr
1953728 xxx.246.150.182
1513154 xxx.0.2.250
1403416 xxx.2.107.75
585957 xxx.246.150.154
230835 xxx.245.91.49
99516 xxx.245.231.247
68348 xxx.214.251.251
59299 xxx.112.97.146
29665 xxx.245.120.220
2657 xxx.32.102.213
1368 xxx.7.236.66
684 xxx.106.180.168
228 xxx.7.154.29
228 xxx.250.35.250
おお、できたっぽい!
所感
過去触ってきた各種サービスは、VPC Flow Logsを継続的に保管し、傾向を分析、可視化するにはもってこいです。ですが、トラブルシュートなどのスポット用途でログを見たい、分析したいという用途には少々オーバースペックです。そんな人には、obsrvbl/flowlogs-readerをお勧めします。気軽ですよ。