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にしたところ,インストールでこけました.
根が深そうだったので,oraclejdkをもらってきています.
これは,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認証をかけているためです.