簡単!Vagrant+Docker+td-agent+Elasticsearch+Kibanaで流行に乗ろう

Fluentd Advent Calendar 2013に登録したものの、そういえば1年位全くfluentdに触ってなかったので、リハビリも兼ねて最近バージョンアップで導入されたVagrantのDocker provisionerを使って、ES+Kibanaに流すとこまでを作ってみた。実用性には乏しい。

以下解説。

Vagrantfile

localhostからport forwardingでboxの同じポートに接続させてる。さらにboxの中でDockerが走っていて、Docker provisonerでコンテナを起動する時に、port redirectさせているので、クライアントからダイレクトにコンテナと会話ができるようになっている。

ESとKibanaはarcusが提供してるイメージを利用。シンプルなDockerfileで好感が持てる。Kibanaの方はJSの中にESのエンドポイントが書かれるのでそれはES_HOST, ES_PORTという環境変数で渡すとコンテナ起動時にKibanaのconfigに書き込んでくれる。詳しくは以下のレポジトリ参照。

td-agentはさすがにイメージが無いので、provision時にbuildしている。ただし、DockerのインストールがDocker provisionerが走った時なので、一旦ESとKibanaを起動させてからbuildを実行している。

Dockerfile

TreasureDataのページにあるような感じで、debのレポジトリを登録してからapt-getでインストール。念のためログをクリア。ESに繋ぎたかったのでとりあえずfluent-plugin-elasticsearchだけインストールして、あとは起動スクリプト配置するだけ。

起動スクリプトはKibana同様、環境変数使ってtd-agentのconfigを生成し、td-agentをstart。ただし、何かフォアグラウンドで走ってないとコンテナが終了してしまうので、とりあえずログをtailしてる。

あと、ESとの接続はコンテナ間の接続なので、linkを活用。こうすると、EXPOSEしているportについては、環境変数でアクセスすることができる。詳細はドキュメントで。

まとめ

これでvagrant upするだけで、td-agent、ES、Kibanaがlocalhostでサーブされる。適当にtd-agentにログを流してKibanaで遊んでみてね。Dockerfileとかいじれば好きなpluginを入れたtd-agentのイメージを簡単に作れてハッピーかもしれない。

クライアントもVirtualboxの環境もほとんど汚さずに、いろんなサービスをぽこぽこ起動して組み合わせることができる世界は幸せだなぁ。まぁESの様なデータベース型のサービスはpersistenceをどう考えていくかが問題ではある。

そんじゃーね