ちょっと話題の記事

VPC Flow LogsをElasticsearch + Kibana4で可視化する

はじめに

昨日発表されたVPC Flow Logsはネットワークエンジニアにとって待ちわびた機能でした。これまでAWS上のネットワークトラフィックを分析するにはホスト単位でキャプチャしたり、あるいはNATサーバ上でキャプチャしたりするなど、どうしても一部の通信しか分析できませんでした。しかしVPC Flow Logsがリリースされたことで、VPC全体のネットワークトラフィックを分析することが可能になります。オンプレミスで言えばコアスイッチのミラーリングポートでパケットキャプチャするようなものですね。

さて、このVPC Flow LogsはClodWatch Logsと連携する形になりますので、ネットワークトラフィックを一覧化したりフィルタを使って検索したりは出来るものの、可視化、という観点では少々弱いです。せっかくネットワークトラフィックが取れるんだから、かっこいいグラフで可視化して統計を確認したいですよね。

ということで、VPC Flow LogsをElasticsearchに取り込んでKibana4で可視化してみました!

AWS_Simple_Icons_2_3_light_edition_pptx

やってみた

VPC Flow Logsのセットアップ

VPC Flow Logsのセットアップは【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!をご参照下さい。

Elasticsearchのセットアップ

Elasticsearchのセットアップは以下の通り、公式Webサイトからrpmパッケージをダウンロードしてインストールするだけです。

$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.noarch.rpm 
$ sudo rpm -ivh elasticsearch-1.6.0.noarch.rpm

自動起動の設定をした上で、サービスを起動します。

$ sudo chkconfig --add elasticsearch
$ sudo chkconfig elasticsearch on
$ sudo service elasticsearch start
Starting elasticsearch:                                    [  OK  ]

VPC Flow LogsをElasticsearchに取り込む

VPC Flow LogsをElasticsearchに取り込むのは、AWS SDK for Goを使いました。AWS SDK for GoのセットアップはAWS SDK for Goが開発者向けプレビュー版として公開されましたをご覧下さい。

package main

import (
  "fmt"
  "time"
  "os/exec"
  "strings"

  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/service/cloudwatchlogs"
)

func main() {
  defaultRegion := "ap-northeast-1"
  logGroupName  := "VPCFlowLogsGroup"
  logStreamName := "eni-618ca000-all"
  url           := "http://localhost:9200/" + strings.ToLower(logGroupName) + "/" + logStreamName + "/"

  cli := cloudwatchlogs.New(&aws.Config{Region: defaultRegion})
  params := &cloudwatchlogs.GetLogEventsInput{
              LogGroupName: &logGroupName,
              LogStreamName: &logStreamName,
            }
  resp, err := cli.GetLogEvents(params)
  if err != nil {
    panic(err)
  }

  if len(resp.Events) < 1 {
    fmt.Println("Info: No Event.")
  }

  for i := range resp.Events {
    time := fmt.Sprint(time.Unix(*resp.Events[i].Timestamp/1000,0).Format("2006-01-02 15:04:05"))
    item := strings.Split(*resp.Events[i].Message," ")
    json := "{"
    json += "\"@timestamp\"  : \"" + time     + "\","
    json += "\"version\"     : \"" + item[0]  + "\","
    json += "\"account-id\"  : \"" + item[1]  + "\","
    json += "\"interface-id\": \"" + item[2]  + "\","
    json += "\"srcaddr\"     : \"" + item[3]  + "\","
    json += "\"dstaddr\"     : \"" + item[4]  + "\","
    json += "\"srcport\"     : \"" + item[5]  + "\","
    json += "\"dstport\"     : \"" + item[6]  + "\","
    json += "\"protocol\"    : \"" + item[7]  + "\","
    json += "\"packets\"     : \"" + item[8]  + "\","
    json += "\"bytes\"       : \"" + item[9]  + "\","
    json += "\"start\"       : \"" + item[10] + "\","
    json += "\"end\"         : \"" + item[11] + "\","
    json += "\"action\"      : \"" + item[12] + "\","
    json += "\"log-status\"  : \"" + item[13] + "\""
    json += "}"

    _, err := exec.Command("curl", "-XPOST", url, "-d", json).Output()

    if err != nil {
      fmt.Println(err)
    }

  }
}

このスクリプトをIAMロールを設定したEC2上に置いて、go buildして出来上がったバイナリファイルを実行すると、AWS Flow LogsのデータがJSONに整形されてElasticsearchに投入されます。

Kibana4で可視化する

Kibana4のインストールは、公式Webサイトからtarファイルをダウンロードして展開するだけです。

$ wget https://download.elastic.co/kibana/kibana/kibana-4.1.0-linux-x64.tar.gz
$ mkdir kibana; tar xvzf kibana-4.1.0-linux-x64.tar.gz -C kibana --strip-components 1

Kibana4からはWebサーバが内包されているので、他にWebサーバを用意する必要がありません。kibanaを実行するだけで起動します。

$ ./kibana/bin/kibana

WebブラウザからKibana4(http://EC2のIPアドレス:5601/)にアクセスします。最初に[Configure an index pattern]画面が表示されるので、[Index name]にインデックス名(vpcflowlogsgroup)を設定します。[Time-field name]は自動判定で@timestampを設定してくれます。[Create]ボタンをクリックします。

Settings_-_Kibana_4 2

するとIndexのmappingを以下のように表示してくれます。[Discover]をクリックします。

vpcflowlogsgroup_-_Settings_-_Kibana_4

VPC Flow Logsがこんな感じで可視化されます!表示したい期間は右上で調整します。やっぱりグラフになるとわかりやすいですね。

Discover_-_Kibana_4_と_名称未設定フォルダ_と_名称未設定フォルダ

左側にfieldが表示されていますが、ここからそれぞれのfieldを可視化することができます。例えば"dstaddr"の[Visualize]をクリックすると...

Discover_-_Kibana_4 2

このように、通信先IPアドレスTop20を棒グラフにしてくれます。

Visualize_-_Kibana_4

これはdstportを可視化したもの。圧倒的に443/tcp(HTTPS)が多いですね。

Visualize_-_Kibana_4 2

さいごに

VPC Flow Logsを超簡単に可視化することが出来ました。Elasticsearch + Kibanaの組み合わせは本当に使いやすいです。Kibana4になってWebサーバが不要になったのもナイスですね。今回はVPC Flow Logsを一気に取り込んで可視化しましたが、ストリームデータとして常にElasticsearchに流し込むことも出来そうです。

ということで、VPC Flow Logsは素晴らしいアップデートです!