【AWS】ELBのログをS3に保存し、Lambdaを利用してElasticsearchにデータ転送。そしてkibanaで可視化。

Amazon

タイトルの通りですが、AWSのサービスを駆使して全てのアクセスログをElasticsearchに突っ込み、kibanaで可視化するというデータ基盤を作る機会があったのでその方法を残しておこうと思います。ちなみにほぼリアルタイムで反映されていくのでlambda archtectureでいうところのspeed layer(スピード層)に相当します。

前提

環境

  • Elasticsearch 5.2.0
  • kibana 5.x

使ったAWSのサービス

  • EC2
  • S3
  • Lambda
  • ELB

概念図

テキストだけだとイメージしにくいので図にしました。

f:id:momota10:20170417170445p:plain

EC2にElasticsearch(=ES)とkibanaを入れて、最終的にはkibanaにアクセスができてデータ閲覧が可能になるという感じです。

ざっくり手順

  • ELBからS3へのログ設定
  • ES, kibana用のEC2作成及びインストール
  • index templateの作成
  • Lambdaの作成

ELBからS3へのログ設定

ログの設定はとても簡単で「EC2 management Console」の左バーにある「Load Balancers」を選択し、対象のELBの「Attributes」にある「Access logs」で設定できます。

f:id:momota10:20170417172415p:plain

  • ELBからS3へのログ転送は5分おきか60分おきかの2択で選べます。
  • あらかじめS3で作成したバケットを指定してprefixが欲しければ任意で設定できます。
  • ログのpathは 「bucket/prefix(任意)/AWSLogs/************/elasticloadbalancing/your-region/2016/04/01/file_name」と結構長いです。なのでprefixは要らないと思いますw

ES, kibana用のEC2作成及びインストール

EC2のセキュリティーグループにおいては 9200(es), 5601(kibana) は許可しておく様にします。 また、t2.micro だとメモリ不足でesが起動しないため、別途ヒープサイズを変更する必要があります。

stackoverflow.com

ESのインストール

$ sudo yum install java-1.8.0-openjdk
$ sudo alternatives --config java
$ java -version

openjdk version “1.8.0_121" //1.8がインストールされていることを確認

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.rpm
$ sudo rpm -i elasticsearch-5.2.1.rpm

/etc/elasticsearch/elasticsearch.yml に追記する

network.host 0.0.0.0

起動

$ sudo service elasticsearch start


$ curl localhost:9200 //下の様な結果が出ればおk
{
  "name" : "UlhX_go",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : “hogehoge",
  "version" : {
    "number" : "5.2.1",
    "build_hash" : “hoge-hash",
    "build_date" : "timestamp",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

kibanaのインストール

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

/etc/yum.repos.d/elasticsearch.repo に追記

[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
$ sudo yum install kibana
$ sudo chkconfig --add kibana

/etc/kibana/kibana.yml に追記

server.host: 0.0.0.0
elasticsearch.url: "http://localhost:9200"
$ sudo service kibana start

index templateの作成

ESはデータを突っ込むとよしなにデータ型を決定してくれますが、基本的にstring型です。なので、あらかじめ index もしくは index template を用意しておくと実際にkibanaでESのクエリを組みながらデータ分析をやろうとする時に便利になります。

elbのログフォーマットは設定できるものではなく、従ってデータがesに入るときのフィールド数が同じなのでそこまでマッピングに違いがある訳ではありませんが設定したindex templateを貼っておきます。

gist3c2c089d578d9b61b491a818d3918e99

Lambdaの作成

LambdaではS3にデータが入ったというイベントをトリガーにしてそのデータをEC2に送るという処理を担ってもらいます。これを作る為には

  • LambdaがS3とEC2にアクセスできる様にIAMでロールを作成してアタッチする
  • 実査に処理を行うソースコードを用意する

の2つが必要になります。

ロールについては AmazonS3ReadOnlyAccessAmazonEC2FullAccess の2つがあれば大丈夫ですが、もしEC2がVPC内にある時は AWSLambdaVPCAccessExecutionRole が別途必要です。

ソースコードは下記のスクリプトを参考にendpointを対象のEC2に設定します。

github.com

最後に

  • 設定を終えてenabledにするとesにデータが入っていることをサーバー内で確認出来、kibanaでも見れるかと思います。
  • 以下のリンクはこのデータ基盤を作成する時に役にたった記事です。こちらも合わせて見てみて下さい。特にLambdaの設定は画像付きで詳しく解説してあります。

Ref

ELB のログを Lambda の Node.js で取り込み、Elasticsearch Service の Kibana で可視化する - Qiita

ELBのアクセスログをAWS LambdaでElasticsearchに取り込む | Developers.IO

Install Kibana with RPM | Kibana User Guide [5.0] | Elastic

Installing Elasticsearch | Beats Platform Reference [5.3] | Elastic