Ubuntu18へのElasticStackインストール

# 概要
久々にElasticsearch達をインストールしたら思わずハマったので、記録に残します。

以下の想定となっています。

- OS
    - Ubuntu18
- ElasticStack
    - Elasticsearch 6.3.2
    - Kibana 6.3.2
    - Logstash 1:6.3.2-1
      - リポジトリを足して入れる。アップデートしやすい、はず？

# エグゼクティブサマリ(?)

- Javaを入れる場合、openjdk-8-jdk を使う事
    - openjdk-11-jdkやdefault-jdk(中身はopendjk-11)を利用すると、 **logstashのインストール** に失敗します。
- JAVA_HOME、なくても動くっぽい
- リポジトリ追加する方法の方が、安全だしアップデートしやすそう

# インストール

## Javaのインストール
まずはJavaを入れる必要がある。

- openjdk-11-jdk を入れると、Elasticsearch, Kibana までは問題ないが、logstashを入れる際に `/etc/logstash/..にアクセス権がない` のようなエラーメッセージで、 `apt-get install` ができない。

openjdk-11の中身は10.0.1系のようだが、少なくとも「リポジトリを使ったlogstashのインストール」では問題が出るようだ。tar.gz版は試していませんので、問題ない可能性もあります。
サポートマトリックスを見ると、Logstashはopenjdk9以降には対応していないですね。Jun Ohtaniさん、指摘をありがとうございます！

なので、openjdk8を使いましょう！(これが言いたくてこの記事書いた)


- https://packages.ubuntu.com/bionic/openjdk-11-jre-headless
- https://www.elastic.co/support/matrix#matrix_jvm

```bash:install-Java
$ sudo apt-get install openjdk-8-jdk
$ java -version
```

## Elasticsearchのインストール
`apt-get install` でエラーが出る場合は、Javaを入れていないはず。

```bash:install-elasticsearch
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
$ sudo vi /etc/elasticsearch/elasticsearch.yml
# add configuration
network.host:0.0.0.0
$ sudo systemctl start elasticsearch
$ systemctl status elasticsearch
$ sudo systemctl enable elasticsearch
```

一応稼働確認として `curl "http://localhost:9200/"` でアクセスができることを確認。
IPv6が有効な場合、503が返ってアクセスできていないことがある。その際は、IPv6無効とか、調整が必要。

```bash:ipv6Disable
$ sudo vi /etc/sysctl.conf
# add configuration
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
$ sudo sysctl -p
(うまく行かないようなら、reboot）
```

## Kibanaのインストール
これは特にエラーは出ないはず。インストール直後のタイミングによっては503が返るので、その場合はealsticsearchがきちんと動いていることを確認する。

```bash:install-kibana
$ sudo apt-get install kibana
$ sudo vi /etc/kibana/kibana.yml
server.host: "0.0.0.0"
$ sudo systemctl start kibana
$ systemctl status kibana
$ sudo systemctl enable kibana
```

確認は、`http://localhost:5601/`などへのアクセス。

## Logstashのインストール
インストール時にエラーが出る場合、openjdk-8-jdkを使っているか（openjdk-11やdefault-jdkを使っていない事）を確認する。
パッケージでjavaを入れると JAVA_HOME環境変数 が無いが、動く。

```bash:install-logstash
$ sudo apt-get install logstash
$ sudo systemctl start logstash
$ systemctl status logstash
$ sudo systemctl enable logstash
```
### syslogを受ける場合

syslogを受信する場合は logstashが `514/UDP` のポートにbindされる必要が有る。
しかしながら、非rootが特権ポートにプログラムをbindすることができないため、起動後に 514/UDP のbindが失敗する。

```
[YYYY-MM-DDTHH:MM:SS,NNN][INFO ][logstash.inputs.udp      ] Starting UDP listener {:address=>"0.0.0.0:514"}
[YYYY-MM-DDTHH:MM:SS,NNN][ERROR][logstash.inputs.udp      ] UDP listener died {:exception=>#<SocketError: bind: name or service not known>, :backtrace=>["org/jruby/ext/socket/RubyUDPSocket.java:200:in `bind'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:116:in `udp_listener'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:68:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:409:in `inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:403:in `block in start_input'"]}
[YYYY-MM-DDTHH:MM:SS,NNN][WARN ][logstash.runner          ] SIGTERM received. Shutting down.
```

回避策は2つ有り、1.　rootでlogstashを動かす、2. iptablesで別ポート(5514/UDP等)に転送してしまう。

- logstashをrootで動かす
    - パッケージの場合、Ubuntuなどの場合は/etc/systemd/system/logstash.service などに起動ユーザが「logstash」とされている。その為、これを `User=root` などとして、root起動に変更する
    - logstashがroot権限で動くので、一義的なリスクは増加する可能性あり
- iptables
    - スマートじゃないよね。


# 終わりに

今後のJavaはどうなるかよくわからないが、現時点ではopenjdk-8 を使うのが安全。
Logstashがopenjdk-11で動くなら移行してもいいかもしれない。

また、たまたま私の環境とタイミングでopenjdk-11では動かなかっただけかもしれないので、まずはjdk11でトライしてみるのが良いかもしれないです。

- `apt-get remove openjdk-11-jdk openjdk-11-jre ; apt autoremove` で消しされる。その後 `$ java` がエラーになれば、消え去ったはず（ゴミファイルは気にしない）。