notebook

都内でWEB系エンジニアやってます。

EC2 で Elasticsearch + kibana

EC2 で Elasticsearch + kibana

何番煎じかって話ですが、やってみて初めて分かることもあるのでまとめてみます

EC2でelasticsearchのクラスタ構成+kibanaをやりましょうってやつです

結局以前使ったansibleにちょっと修正を加えてやることにしました

ansibleでelasticsearch+kibana4

まぁEC2に限らずって話もありますがどこかで誰かのお役に立てればと思います

サーバ構成

  • 10.0.21.60(Elasticsearch master EBS)
  • 10.0.21.61(Elasticsearch data EBS)
  • 10.0.22.60(Elasticsearch data EBS)
  • 10.0.1.10(reverse proxy)
  • 10.0.1.11(kibana)

やったこと

  • IAMRoleの設定
  • インスタンス作成
  • EBSのアタッチ
  • pluginsのインストール
  • elasticsearchの設定

IAMRoleの設定

  • 最初適当に作ってから下記手順で編集しました
    • InlinePolicy
    • PolicyGenerator
      • Effect: Allow
      • AWS Service: Amazon EC2
      • Actions: All Actions
      • AmazonResourceName: *

それが下記

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1429609722000",
            "Effect": "Allow",
            "Action": [
                "ec2:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

インスタンスの作成

  • サービスとかによって違うと思うので割愛
  • IAMRoleで作成したRoleを割り当ててあげます
    • このIAMRoleはインスタンス作成時しか設定できないようなので忘れずに。。。

EBSのアタッチ

  • elasticsearchのサーバで/data に100Gほど持たせました
  • 下記参考

Amazon EBS ボリュームを使用できるようにする

elasticsearchの設定

いろんなところで書いてあるけどmulticastでのノード探索ができないようなので作業が必要

pluginのインストール

/usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-cloud-aws/2.5.0

elasticsearch.ymlの修正

  • groups
    • Security Groups
  • discovery.zen.ping.unicast.hosts
    • これを設定しないとうまく動かなかった
    • master,data全てのノードを記述
network.host: _ec2:privateIpv4_

discovery.zen.ping.multicast.enabled: false
cloud.aws.region: ap-southeast-1
discovery:
    type: ec2
    ec2:
        groups: elasticsearch
        availability_zones: ap-southeast-1a,ap-southeast-1b

discovery.zen.ping.unicast.hosts: [10.0.21.61,10.0.22.60, 10.0.21.60]

クロスドメイン対策

  • elasticsearch.ymlの修正

kibanaからのアクセスは問題ないが、htmlぺら1とかでjson投げて生ログ取りたいとかそういうときにただリクエスト送るだけだとうまくいかなかった

調べた結果クロスドメインに引っかかるようなのでそれ用の設定をelasticsearch.ymlへ追加

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: GET,POST
http.cors.allow-headers: true
http.cors.allow-credentials: true

hostnameの設定

上記までの対応で起動はできたものの下記エラーが残ったままでした

java.net.UnknownHostException: ip-10-0-21-61: ip-10-0-21-61: unknown error
.....
.....
  • /etc/hostsの修正

調べてみた結果/etc/hostsに${hostname -s}を記述すればOKのようなので対処しました

- 127.0.0.1   localhost localhost.localdomain
+ 127.0.0.1   localhost localhost.localdomain ip-10-0-21-61

kibanaへのリバースプロキシ

  • 今回kibana用にリバプロ用サーバを立てました

  • 本当は「/kibana」でkibanaへリバプロするように設定したかったがstaticファイルのリクエストも設定に加えなくてはならないようだったので「/」でリバプロするように変更

  • 理想はこんな感じ

nginx - kibana ( /kibana )
        + growthforecast ( /gf )
        + monitor ( /monitor )

複数列挙できてもバージョンアップでファイルが追加されたら対応しないといけないし、正規表現頑張るのも工数かかりそうだしということで一旦断念。

おわり

elasticsearch.ymlの設定とnginxの設定で詰まったけど思ったよりかは楽に構築できた感。。。

  • nginxの設定周りで結構詰まったのでもう少し勉強しないと。。
  • kibanaの管理画面以外で生ログ検索したい
    • luceneクエリじゃなくてテキストボックスに入力したら部分一致
    • 結局サービス用に軽く作らないといけなそう。。。