概要
久々に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
$ sudo apt-get install openjdk-8-jdk
$ java -version
Elasticsearchのインストール
apt-get install
でエラーが出る場合は、Javaを入れていないはず。
$ 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無効とか、調整が必要。
$ 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がきちんと動いていることを確認する。
$ 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環境変数 が無いが、動く。
$ 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権限で動くので、一義的なリスクは増加する可能性あり
- パッケージの場合、Ubuntuなどの場合は/etc/systemd/system/logstash.service などに起動ユーザが「logstash」とされている。その為、これを
- iptables
- スマートじゃないよね。
終わりに
今後のJavaはどうなるかよくわからないが、現時点ではopenjdk-8 を使うのが安全。
Logstashがopenjdk-11で動くなら移行してもいいかもしれない。
また、たまたま私の環境とタイミングでopenjdk-11では動かなかっただけかもしれないので、まずはjdk11でトライしてみるのが良いかもしれないです。
-
apt-get remove openjdk-11-jdk openjdk-11-jre ; apt autoremove
で消しされる。その後$ java
がエラーになれば、消え去ったはず(ゴミファイルは気にしない)。