flowlogs-readerを使って、VPC Flow Logsをコマンドラインで操作する

AWS
Published: 2016-02-02

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をお勧めします。気軽ですよ。