Nginx + fluentd + Elasticsearch + Kibana3 on AWSの話

なんか行動データと他のデータ結びつけたくなくなくなくない?っていう話があって、GAとは別で生の行動データ欲しかったけどサーバー直接触れないケースが多いのでGAみたいにパラメータ引っ付けたリクエスト飛ばして、ただただDBに保存してくってやってみたんだけど、結局解析するのにHadoop使うことになってHDFSにつっこむのにDBからだとむしろパフォーマンスが悪くていちいちtsvに変換してた。だったら最初からtsvとして管理すべきなんじゃと思ったら色々良さげなものが一杯出てきたので一通り試したという話。

最初リクエスト捌くのにWebサーバーとしてNginxたてて、裏側でNode.js走らせてたんだけど、そもそもNginxでリクエスト受けてるんだからそこでログ吐き出せばいいじゃんということで調べると、ログの形式とか保存先は結構融通が利いてしかも$arg_{{パラメータ名}}で簡単にリクエストのパラメータ毎に値を受け取れる。
Module ngx_http_core_module

それで、その辺調べてるうちにどうもロードバランサーとか使って複数台構成にしている場合にそのままだとログ別々に保存されちゃうじゃん?そこでfluentdですよ。fluentdなら簡単にログを他のサーバーに転送できるので、ログを集計サーバーに集約できます。っていう話を沢山みかけてなんかこれ流行ってそうだしぶっちゃけ今は必要ないけど使ってみるか!という感じで採用することに。
NginxのアクセスログをLTSV形式にしてfluentdで回収する

使ってみると要するにconfigかいて立ち上げたらログファイル監視して好きなところに保存するなり飛ばすなりしてくれるよって事で、監視対象もプラグインがいっぱいあって、ただのログファイルはもちろんS3とか、何かのアプリケーションから直接受け取ったりとか色々出来て、アウトプットも他のサーバー飛ばしたりログファイルにして保存したりS3に保存したりできる。これはすごい。しかも簡単。今は必要ないとかいってごめん。
EC2インスタンス上でnginxのログをfluentd経由でS3へ飛ばしてみる

ということで整形したNginxのログファイルを監視してS3にバンバン飛ばして、たまったらAWSでばーんとHadoop使えて便利と噂のEMRでS3から直接ログを読み込んで解析するというのが出来たんだけど、やっぱり可視化しないとイマイチ伝わらないのとなんかリアルタイムで見れなきゃつまんなくねっていうことに。
はじめてのEMR/fluentdでS3にアップロードしたログをElastic MapReduceで検索・集計する
S3 上の大量データを EMR するときは S3DistCp を使うと捗る

Nginx + fluentdで色々探してるとElasticsearchというのにデータ流してる人がちょこちょこいて、なんだろうと思ったらどうもリアルタイムに投げたデータのインデックスをじゃんじゃん作ってREST APIを提供してくれるらしい。しかもKibanaとかいう公認の可視化ツールがあって時間のデータが入ってればなんだって時系列でグラフにしてくれる。パイグラフとかで比率も出せるし、平均値や最小値最大値もとれる。あなたが神か。
Fluentd + ElasticSearch + Kibana3で簡単に様々なログを可視化・解析する
Kibana3というのもありまして

データ流すのもElasticsearch立ち上げてfluentdの出力先を向けるだけだからすごい簡単。KibanaもAPIからJSON引っぱり出してるだけでただのHTMLだからWebサーバー立ち上げればそれで終わりだったし、中にfluentd噛ませてるのもあってほんとに色んなデータが扱える。最近はTwitter Streaming APIからツイートをまるっと流し込んで色々調べたりできるじゃんおもしろと思ってやってる。でも怖いのは全体だけじゃなくて個人のアカウントも追跡出来て、そこに入っちゃったものはTwitterで消してもずっと保持されるし、その人が1ヶ月とか1年通して見てどのいつ何曜日何時頃のツイートが多いか、どういう単語がよく出てくるか、たぶんやろうとしたら簡単に分かっちゃう。めっちゃこわい。
AWS EC2上にfluentd + fluent-plugin-twitter + elasticsearch + kibana インストールするメモ

他にも環境構築にAnsible使ってみたり開発用のインスタンス立ち上げるのにVagrant使ってみたり細かい話はいろいろあるんだけど、最近やってたの大筋はこんなん。おしまい。