Open Distro for Elasticsearchを作ってみた！

## はじめに
2019年3月13日にAWSが突如別ディストリビューションのElasticsearchを**Open Distro for Elasticsearch**としてGithubにソースコードを公開しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2abb0c56-d596-4b2f-2c7b-5a4020da5e16.png)

Elastic社とは全く関係のない別のElasticsearchとして、以下の機能を無償で提供しています。
※Elasticの有償サブスクリプションが無くても、やりたいことが色々出来ちゃいそうですね。。

**①セキュリティ**
 ・通信暗号化
 ・ユーザ認証
 ・ロール制御
 ・Index、Field、Documentレベルの制御
 ・監査ログ
 ・LDAP/AD、SAML認証連携
 ・Cross-cluster search
 ・Kibanaのマルチテナント
**②アラート通知**
**③SQLアクセス**
**④パフォーマンスアナライザー**

おそらく今後、Amazon Elasticsearch Serviceに機能が追加されていくことが想定されますし
せっかくなので、試してみました。すでにアラート機能は追加されているっぽい。。

**【参考】**
・[新登場 Open Distro for Elasticsearch][00]
・[AWS OSSだけで構成される「Open Distro for Elasticsearch」公開][01]

## 前提
Dockerコンテナでライトに動かしている記事はいくつか見かけていますが
RPMでOSに導入している人はあまり見かけていないので、クラスタを組むことを想定して
今回はEC2(シングル構成)にRPMで構築してみました！

## 利用環境
| product | version |
|---------|---------|
| Open Distro for Elasticsearch | 0.8.0 |
| Elasticsearch | 6.6.2 |
| Java | 1.8.0-openjdk-devel |
| OS(EC2) | Amazon Linux2 (t3.large) |
| AMI ID | ami-06b382aba6c5a4f2c |

※2019年4月時点の最新版である0.8.0はElasticsearch6.6.2が対応バージョンになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/f3d37814-7283-d937-cce0-08cabdee9fb8.png)

**【参考】**
・[About Open Distro for Elasticsearch][03]

## Javaバージョンについて
今後、同じEC2上にLogstashも入れる予定のため、Javaバージョンは11ではなく8にしています。
> 
Logstash requires Java 8. Java 9 is not supported. Use the official Oracle distribution or an open-source distribution such as OpenJDK.

`1.8.0-openjdk-devel`ではなく`1.8.0-openjdk`とかを入れるとエラーでElasticsearchが起動しないので
注意してください。マニュアル通り、正しくJavaをインストールしましょうw

**【参考】**
・[Installing Logstash][04]

## 実施内容
以下の手順で構築を実施しました。
　1. Javaのインストール
　2. Open Distro for Elasticsearch(Elasticsearch)のインストール
　3. Elasticsearchの設定
　4. Open Distro for Elasticsearch(Kibana)のインストール
　5. Kibanaの設定
　6. アクセス確認

#### 1. Javaのインストール
- Java8をインストールします。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo yum install java-1.8.0-openjdk-devel
```
- 念のためバージョンを確認しておきます。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
```
- Java8を利用する場合は、以下のコマンドでシンボリックリンクを張ります。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo ln -s /usr/lib/jvm/java-1.8.0/lib/tools.jar /usr/share/elasticsearch/lib/
```

#### 2. Open Distro for Elasticsearch(Elasticsearch)のインストール
- Open Distro for ElasticsearchはOSS版Elasticsearchにアドオンされる形でPluginが入ります。
- OSS版ElasticsearchとOpen Distro for Elasticsearchのリポジトリを登録します。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo vi /etc/yum.repos.d/elastic.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/oss-6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

[opendistroforelasticsearch-artifacts-repo]
name=Release RPM artifacts of OpenDistroForElasticsearch
baseurl=https://d3g5vo6xdbdb9a.cloudfront.net/yum/noarch/
enabled=1
gpgkey=https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch
gpgcheck=1
repo_gpgcheck=1
autorefresh=1
type=rpm-md
```
- Elasticsearchをインストールします。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo yum install opendistroforelasticsearch
```

- 上記コマンドでインストールすると以下のパッケージが導入されるようです。

```
================================================================================================================================================
 Package                                    アーキテクチャー  バージョン             リポジトリー                                          容量
================================================================================================================================================
インストール中:
 opendistroforelasticsearch                 noarch            0.8.0-1                opendistroforelasticsearch-artifacts-repo            2.7 k
依存性関連でのインストールをします:
 elasticsearch-oss                          noarch            6.6.2-1                elasticsearch-6.x                                     33 M
 opendistro-alerting                        noarch            0.8.0.0-1              opendistroforelasticsearch-artifacts-repo            2.9 M
 opendistro-performance-analyzer            noarch            0.8.0.0-1              opendistroforelasticsearch-artifacts-repo             11 M
 opendistro-security                        noarch            0.8.0.0-1              opendistroforelasticsearch-artifacts-repo             26 M
 opendistro-sql                             noarch            0.8.0.0-1              opendistroforelasticsearch-artifacts-repo            5.9 M
```

#### 3. Elasticsearchの設定
- elasticsearch.ymlはOSS版のデフォルト設定の下に以下の内容が追記されています。

```yaml
######## Start OpenDistro for Elasticsearch Security Demo Configuration ########
# WARNING: revise all the lines below before you go into production
opendistro_security.ssl.transport.pemcert_filepath: esnode.pem
opendistro_security.ssl.transport.pemkey_filepath: esnode-key.pem
opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
opendistro_security.ssl.transport.enforce_hostname_verification: false
opendistro_security.ssl.http.enabled: true
opendistro_security.ssl.http.pemcert_filepath: esnode.pem
opendistro_security.ssl.http.pemkey_filepath: esnode-key.pem
opendistro_security.ssl.http.pemtrustedcas_filepath: root-ca.pem
opendistro_security.allow_unsafe_democertificates: true
opendistro_security.allow_default_init_securityindex: true
opendistro_security.authcz.admin_dn:
  - CN=kirk,OU=client,O=client,L=test, C=de

opendistro_security.audit.type: internal_elasticsearch
opendistro_security.enable_snapshot_restore_privilege: true
opendistro_security.check_snapshot_restore_write_privileges: true
opendistro_security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
cluster.routing.allocation.disk.threshold_enabled: false
discovery.zen.minimum_master_nodes: 1
node.max_local_storage_nodes: 3
######## End OpenDistro for Elasticsearch Security Demo Configuration ########
```
※ESノード間、Kibana等のクライアントとの通信がデモ用証明書でTLS暗号化されています。

- JVMヒープサイズをメモリ容量に応じて変更します。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo vi /etc/elasticsearch/jvm.options
<抜粋>
-Xms4g 
-Xmx4g
```
※今回はOSに8GBのメモリを用意しているので、JVMヒープには半分の4GBとしています。

- Elasticsearchを起動します。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl start elasticsearch
```

- 以下のステータス確認になります。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2019-04-22 04:01:07 UTC; 2s ago
     Docs: http://www.elastic.co
 Main PID: 402 (java)
   CGroup: /system.slice/elasticsearch.service
           └─402 /bin/java -Xms4g -Xmx4g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -De...

 4月 22 04:01:07 ip-10-0-0-71.ec2.internal systemd[1]: Started Elasticsearch.
 4月 22 04:01:07 ip-10-0-0-71.ec2.internal systemd[1]: Starting Elasticsearch...
 4月 22 04:01:08 ip-10-0-0-71.ec2.internal elasticsearch[402]: java.security.policy: error adding Entry:
 4月 22 04:01:08 ip-10-0-0-71.ec2.internal elasticsearch[402]: java.net.MalformedURLException: unknown protocol: jrt
 4月 22 04:01:08 ip-10-0-0-71.ec2.internal elasticsearch[402]: java.security.policy: error adding Entry:
 4月 22 04:01:08 ip-10-0-0-71.ec2.internal elasticsearch[402]: java.net.MalformedURLException: unknown protocol: jrt
[ec2-user@ip-10-0-0-71 ~]$ curl -XGET https://localhost:9200 -u admin:admin --insecure
{
  "name" : "TJb2jgV",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "WYms_LtSR_aypB0U1ax5dg",
  "version" : {
    "number" : "6.6.2",
    "build_flavor" : "oss",
    "build_type" : "rpm",
    "build_hash" : "3bd3e59",
    "build_date" : "2019-03-06T15:16:26.864148Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
[ec2-user@ip-10-0-0-71 ~]$ curl -XGET https://localhost:9200/_cat/nodes?v -u admin:admin --insecure
ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1           10          32  26    0.40    0.11     0.04 mdi       *      TJb2jgV
[ec2-user@ip-10-0-0-71 ~]$ curl -XGET https://localhost:9200/_cat/plugins?v -u admin:admin --insecure
name    component                       version
TJb2jgV opendistro_alerting             0.8.0.0
TJb2jgV opendistro_performance_analyzer 0.8.0.0
TJb2jgV opendistro_security             0.8.0.0
TJb2jgV opendistro_sql                  0.8.0.0
```
※systemctl status elasticsearchでJava8にしたことで4行エラーが表示されますが、起動していればOKだそうです。

- 自動起動の設定をしておきます。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl enable elasticsearch.service
```

#### 4. Open Distro for Elasticsearch(Kibana)のインストール
- Kibanaをインストールします。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo yum install opendistroforelasticsearch-kibana
```
- 導入されるパッケージはOpen DistroのKibanaのみでした。

```
================================================================================================================================================
 Package                                      アーキテクチャー  バージョン           リポジトリー                                          容量
================================================================================================================================================
インストール中:
 opendistroforelasticsearch-kibana            x86_64            0.8.0-1              opendistroforelasticsearch-artifacts-repo             65 M
```

#### 5. Kibanaの設定
- .kibanaymlはOSS版のデフォルト設定は一切書いてありません。以下の内容のみです。

```yaml
#Default Kibana configuration for opendistro

elasticsearch.url: https://localhost:9200
elasticsearch.ssl.verificationMode: none
elasticsearch.username: kibanaserver
elasticsearch.password: kibanaserver
elasticsearch.requestHeadersWhitelist: ["securitytenant","Authorization"]

opendistro_security.multitenancy.enabled: true
opendistro_security.multitenancy.tenants.preferred: ["Private", "Global"]
opendistro_security.readonly_mode.roles: ["kibana_read_only"]
```
- なので、ローカル以外からもKibanaにアクセス出来るように設定を追加します。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo vi /etc/kibana/kibana.yml
server.host: 0.0.0.0
<以下、省略>
```
※`elasticsearch.ssl.verificationMode: none`となっているので、証明書をKibanaに配置しなくてもアクセス可能です。
※デフォルトでマルチテナント設定になっています。

- kibanaを起動します。(Elasticsearch同様にstatusも確認しておきます)

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl start kibana
```

- 自動起動の設定をしておきます。

```console
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-71 ~]$ sudo systemctl enable kibana.service
```

#### 6. アクセス確認
- EC2のIPアドレスに対して、別マシンから5601ポートでWebアクセスします。(http://[KibanaのIP]:5601)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/d60d91b5-fefd-fecb-be1d-3ba865a3f371.png)

※初期はIDもPWも`admin`です。

- 以下の赤枠あたりがOpen Distro for Elasticsearchならではの項目になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/8686f117-8e71-703b-1493-79aef2570140.png)


## まとめ
いかがでしょうか。
Alerting、Security、SQLなどの機能の紹介や使い勝手は別途記事にまとめていこうと思いますが
OSS版との差異を中心に構築手順を紹介してみました。

デフォルトでユーザ認証機能が有効されますし、Alertingを使いこなして
Slackにほしい情報を通知することもできるので、便利です。

先日のGoogle Cloud Next 2019でまた新たな動きがあったので、今後の動向に注目ですね。
Open Distro for Elasticsearchも、是非一度は試してみてはいかがでしょうか^^

**【参考】**
・[GoogleがMongoDB、Redis、Elastic、Kafkaと協業、OSS開発元の収益を重視][06]

[00]: https://aws.amazon.com/jp/blogs/news/new-open-distro-for-elasticsearch/ "新登場 Open Distro for Elasticsearch"
[01]: https://www.itmedia.co.jp/news/articles/1903/22/news104.html "AWS OSSだけで構成される「Open Distro for Elasticsearch」公開"
[02]: https://opendistro.github.io/for-elasticsearch/ "Open Distro for Elasticsearch"
[03]: https://opendistro.github.io/for-elasticsearch-docs/ "About Open Distro for Elasticsearch"
[04]: https://www.elastic.co/guide/en/logstash/6.6/installing-logstash.html "Installing Logstash"
[05]: https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html "Setting the heap size"
[06]: https://ascii.jp/elem/000/001/843/1843345/ "GoogleがMongoDB、Redis、Elastic、Kafkaと協業、OSS開発元の収益を重視"