VPC FLow Logsを継続的にElasticSearchに投入する
AWS
Published: 2015-06-14

 VPC FLow Logsのリリース直後から、クラメソさんの「VPC Flow LogsをElasticsearch + Kibana4で可視化する」と同じことを考えていました。週末に試行錯誤した結果をアウトプットします。

ログの取り方

 AWS SDK for Ruby を利用してClodWatch Logsを取得する方法は以下の様になります。

 ただし、この方法でログを取得した場合、指定したlog_streamに格納されている大量のデータがレスポンスとして帰ってきます。デフォルトでは最大で1M Byte分のログが取得するようです。

Class: Aws::CloudWatchLogs::Client

By default, this operation returns as much log events as can fit in a response size of 1MB, up to 10,000 log events.

 したがって、このコードを継続的に実行すると、最初から1M byte分のログを繰り返し取得してしまいます。これでは意味がありません。実行時には、前回実行分以降のログを取得してほしい。これを実現する方法が、get_log_eventsnext_tokenオプションです。

増分ログの取り方

 get_log_eventsのレスポンスにはnext_forward_tokennext_backward_tokenが含まれています。これらは取得結果の次のページの位置を示しています。より新しいログの位置は名前的にnext_forward_tokenが保持しているっぽいです。

Class: Aws::CloudWatchLogs::Client

resp.events #=> Array

resp.events[0].timestamp #=> Integer

resp.events[0].message #=> String

resp.events[0].ingestion_time #=> Integer

resp.next_forward_token #=> String

resp.next_backward_token #=> String

 そこで、このtokenを利用してget_log_eventsを実行するように、スクリプトを変更します。tokenの値は、fluentdっぽくstateファイルを作り、そこに書き込んでおきます。

動作確認

 ElasticSearchに投入済みのデータは以下の通りです。19:25:47までのログが格納されています。

投入済みデータ

 next_tokenをつけてget_log_eventsしたデータをElasticSearchに投入します。投入時のログは以下の通りです。19:28:40のデータ以降がElasticSearchに投入されていることがわかります。

 投入後のデータ一覧は以下の通りです。19:25:47以前のログが重複登録されることなく、19:25:47以降のログが増えました!!!

投入済みデータ

 それっぽく動いたスクリプトは以下の通りです。cronで回してみてみようと思います。