kibana+elasticsearchをAWS OpsWorksで動かすcookbookを作った
こんばんは,@h3_potetoです.
もう話題だったのでかなり出尽くした感じがありますが,会社のサービス,せっかくtd-agentを使ってログをs3に吐き出しているわけだし,Kibanaで見たいなーと思った.
思ったので作ることにしました.
とりあえず,Chefを探すと,出てくる出てくる…….
だけどいざOpsWorksで動かすとなると,なかなかクリティカルなcookbookが出てこない…….
仕方ないので自前でなんとかしよう.
cookbookを作る
これをベースにします.
https://github.com/lusis/chef-kibana
で,こんなのができた.
https://github.com/interfirm/cookbook-kibana-opsworks
流すCustomJSONがこちら.
{ "htpasswd": { "install_method": "ruby" }, "kibana": { "user": "username", "install_dir": "/srv/www/kibana", "install_type": "git", "webserver": "nginx", "web_dir": "/srv/www/kibana/current/", "webserver_hostname": "hostname" }, "java": { "install_flavor": "oracle", "jdk_version": "7", "oracle": { "accept_oracle_download_terms": "true" } }, "elasticsearch": { "cluster": { "name": "kibana_cluster" }, "bootstrap.mlockall": "false", "nginx": { "allow_cluster_api": "true", "users": [{ "username": "username", "password": "password" }] } }, "nginx": { "user": "username" } }
htpasswdはBasic認証を導入するために入れています.
kibanaの設定項目に関しては,特に縛りはないので,好きなディレクトリにインストールすれば良いと思います.
javaのinstall_flavorですが,openjdkにしたところ,インストールでこけました.
根が深そうだったので,oracleのjdkをもらってきています.
これは,elasticsearchのインストールに必要なものなので,jdkがインストールできていればさほど問題ないかと.
elasticsearchのnginx設定の部分で,Basic認証に必要なユーザ名とパスワードを入れています.
この設定値を元にelasticsearch,kibanaともにnginxの設定時にBasic認証を設定しています.
nginxのユーザは本来であれば作らなくてもいいのですが,kibanaインストール時に,kibanaのユーザ名を所有者とするディレクトリを作成してしまうので,そこへのアクセス権変更が必要になります.
それをやるよりは,nginxの実行ユーザとkibanaのディレクトリの所有者を一致させたほうが手間が少ないので,設定しています.
Elasticsearch用のポート番号
Kibana3はHTML+Javascriptですが,本来であれば,Elasticsearchへのアクセスのために,9200番ポートの開放が必要になります.
しかし,Basic認証をかけている都合上,9200へのアクセスではなく80へのアクセスで,アクセス時にパスワードを使用するように変更しています.
ブラウザから見る場合には,KibanaのBasic認証をクリアしていれば問題なくElasticsearchと通信できるかと思います.
そのため,9200番ポートの開放は不要です.
80番だけ空いていれば問題無いです.
Elasticsearchへのログ送信
td-agentに,fluent-plugin-elasticsearchを導入します.
https://github.com/uken/fluent-plugin-elasticsearch
ここで,ログの転送先として,先のOpsWorksで構築したKibanaのIPを指定します.
ただし,9200番ポートは使用できません.
ここはカスタムで変えてもらっても全然構わないのですが,今回作成したcookbookでは8080番ポートを使用します.
完全に外部から通信できるよう開放させる必要はないですが,インスタンス間同士で通信はできるようにしておいてください.
インターファームのサーバ構成でいうと,同じVPC内にすべてのインスタンスを置いているため,この間で通信できる程度の設定にしています.
あとは,通信先のホスト設定として,
host username:password@kibana-ipaddress
port 8080
としてやれば,送信に成功します.
usernameとpasswordが必要になるのは,前述のとおりkibanaのサーバにBasic認証をかけているためです.