Amazon EC2 を使用して Elasticsearch クラスタをセットアップする

Amazon Web Service や、Microsoft Azure の IaaS 環境に、 Elastic Stack をインストールして運用されるケースが増えています。ここでは、Amazon EC2 インスタンスに Elasticsearch 2.3.2Kibana 4.5.0 をインストールする方法を紹介します。

クラスタの構成

VPCにひとつ、もしくは複数の EC2 インスタンスをセットアップし、それぞれに Elasticsearch をインストールするような構成を検討します。Kibana のインストール対象は専用の EC2 イスタンスでも、Elasticsearch をインストールしたものでも結構です。

EC2 インスタンスのセットアップ

AMI

Elasticsearch は、CentOS、Redhat、Ubuntu をはじめとして様々なオペレーティングシステムに対応しています。Amazon Linux にも対応していますが、なるべく新しい AMI を使用されることをお勧めします。ここでは “Amazon Linux AMI 2016.03.0 (HVM), SSD Volume Type - ami-f80e0596” を選択します。Elasticsearch が使用するメモリは 32G 未満になることを推奨していますので、Instance Type には、m4.4xlarge (16 vCPUs, 64 GB Memory) を選択します。

AMI の選択

Instance Type の選択

ネットワーク

VPC に、パブリックサブネットとプライベートサブネット がある場合には、プライベートサブネットに EC2 インスタンスを配置します。プライベートサブネットを使用する場合には、後に RPM などをインターネットからダウンロード可能なように、NAT をあらかじめ構成してください。複数の Elasticsearch ノードをセットアップする場合には、それぞれの AZ に配置することを、お勧めします。

ストレージ

IOPS が高い方が、より良いパフォーマンスが期待できます。64GB のメモリのインスタンスを選択した場合、使用方法にもよりますが、最大でおよそ 1TB のストレージを Elasticsearch のデータディレクトリとして利用可能です。

ストレージの追加

セキュリティグループ

Elasticsearch は、クラスタ外部へのサービスに 9200/tcp、内部のコミュニケーションに 9300/tcp のポートを使用します。Elasticsearch の所属するサブネット内で、9300/tcp の通信を許可し、接続する可能性のある IP アドレス、もしくはサブネットから 9200/tcp への接続を許可するよう、セキュリティグループを構成します。Elasticsearch をインストールする EC2 インスタンスのひとつに Kibana をインストールする場合には、5601/tcp ポートへのアクセスも許可します。必要なクライアントからのアクセスのみを許可するよう、Source の設定に注意してください。

セキュリティグループの設定

他の必要な設定を行い、EC2 インスタンスの起動を終えたら、それぞれに割り当てられたプライベート IP アドレスを確認しておきます。

Elasticsearch のインストール

RPM のインストール

作成した EC2 インスタンスに SSH でログインします。Elasticsearch を RPM でインストールします。

$ sudo rpm -i https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.2/elasticsearch-2.3.2.rpm

その他の Elasticsearch バージョンの RPM のパスは、Downloads で確認してください。yum を利用してインストールを行いたい場合は、こちらの手順を参考にしてください。

システム起動時に Elasticsearch も起動するようにシステムサービスとして登録します。

$ sudo chkconfig --add elasticsearch

Plugin のインストール

以下のとおり、Marvel と Kuromoji の Plugin をインストールします。必要に応じてその他のプラグインもインストールします。

$ cd /usr/share/elasticsearch/
$ sudo bin/plugin install license
$ sudo bin/plugin install marvel-agent
$ sudo bin/plugin install analysis-kuromoji

設定

起動したインスタンスの割り当てメモリに応じて、Elasticsearch が使用する JVM のヒープサイズを設定します。 /etc/sysconfig/elasticsearch ファイルを vi 等のエディタで開き、ES_HEAP_SIZE, MAX_LOCKED_MEMORY パラメータを設定します。m4.4xlarge インスタンスの場合には、以下のとおりです。

ES_HEAP_SIZE=31g
MAX_LOCKED_MEMORY=unlimited

インスタンスに割り当てられているメモリの半分を目安に 32GB を上まらない範囲で設定します。

次に /etc/elasticsearch/elasticsearch.yml ファイルを vi 等のエディタで開き、以下の記述を追記します。

bootstrap.mlockall: true
discovery.zen.ping.unicast.hosts: [__IP_ADDR__,...]
network.host: [_site_,_local_]

__IP_ADDR__,... は、起動したEC2 インスタンスのプライベート IP アドレスです。本パラメータには、マスターノードになる可能性があるノード (master-eligible nodes) をリストアップします。小規模な構成では、すべてのノードが、データノードとマスターノードを兼ねます。自身の IP アドレスは、必ずしも含む必要はありませんので、1ノードしかないクラスタでは、設定が不要です。_site_,_local_ は、プライベート IP アドレスとローカルループバックアドレス 127.0.0.1 でのアクセスを許可するための設定です。

起動と確認

複数の Elasticsearch ノードをセットアップする場合には、それぞれの EC2 インスタンス上で、同バージョンの Elasticsearch 、同じ Plugin のインストール、同等の設定を行った上で、Elasticsearch を起動します。

$ sudo service elasticsearch start

起動を終えたら、クラスタの確認を行います。curl コマンドを用いて、クラスタの状態を取得します。

$ curl __ES_IP_ADDR__:9200/_cluster/health?pretty

__ES_IP_ADDR__ は、Elasticsearch をインストールした、いずれかの EC2 インスタンスのプライベート IP アドレスです。 クラスタの起動に成功した場合には、以下のように statusgreen、セットアップした EC2 インスタンス数が number_of_nodes のレスポンスに反映されます。

{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 8,
  "active_shards" : 16,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

statusgreen になっていない、または number_of_nodes がセットアップしたノード数と異なる場合には、VPC のセキュリティグループの設定や、各 EC2 インスタンスの /var/log/elasticsearch 以下に出力されている Elasticsearch のログファイルなどを確認してください。

以上で Elasticsearch クラスタのセットアップは完了です。

Kibana のインストールと設定

続いて Kibana をインストールします。Kibana は、Elasticsearch を実行する EC2 インスタンスにインストールが可能ですが、異なる EC2 インスタンスでも可能です。インターネット経由で Kibana にアクセスする場合には、該当する EC2 インスタンスが、適切なサブネットに配置される必要があることに注意してください。Kibana は、以下のコマンドでインストールします。

$ sudo rpm -i https://download.elastic.co/kibana/kibana/kibana-4.5.0-1.x86_64.rpm

yum を利用してインストールする場合は、こちら の手順を参照してください。

Marvel と Sense Plugin をインストールします。

$ cd /opt/kibana
$ sudo bin/kibana plugin --install elasticsearch/marvel/latest
$ sudo bin/kibana plugin --install elastic/sense/latest

Kibana を Elasticsearch を実行中の EC2 インスタンスと異なる EC2 インスタンスにセットアップした場合には、Elasticsearch クラスタに接続するための情報を設定します。/opt/kibana/config/kibana.yml を vi 等のエディタで開き、以下のような設定を追加します。初期値では http://localhost:9200 に接続します。

elasticsearch.url: "http://__ES_IP_ADDR__:9200"

__ES_IP_ADDR__ は、Elasticsearch をインストールした EC2 インスタンスのうち、いずれか一つのプライベート IP アドレスです。

Kibana は 5601/tcp ポートを使用します。本ポートに接続が可能なように、Kibana をインストールした EC2 インスタンスのセキュリティグループを変更してください。以下のコマンドで Kibana を起動します。

$ sudo service kibana start

ウェブブラウザで http://__KIBANA_PUBLIC_IP_ADDR__:5601 を開き、Kibana が表示されることを確認してください。__KIBANA_PUBLIC_IP_ADDR__ は、Kibana をインストールした EC2 インスタンスのパブリック IP アドレスです。

まとめ

Amazon EC2 インスタンスに Elasticsearch をインストールすると、新しい世代の AMI が利用でき、最新の Elastic Stack や Plugin を自由にインストール・設定できます。MarvelBeats を使用すると、Elasticsearch クラスターの利用状況を監視することが可能です。また、自身の組織が運用する VPC にセットアップすることができることも、セキュリティ面での利点があります。Amazon EC2 インスタンスを使用しての Elasticsearch クラスタのセットアップは非常に簡単ですので、ぜひご利用ください。