Raspberry Pi 4 Model Bでelasticsearch+kibanaを構成したので、備忘録を残したいと思います。
ここに記載した操作を行うと、カレントディレクトリにelasticsearch+kibanaのDockerコンテナ環境を作成することが出来ます。
1、構築準備
構築予定のディレクトリで以下のコマンドを実行し、必要なディレクトリ・Dockerイメージを作成します。
OS・Dockerのインストールは以下の記事「3-1」「3-2」を参照してインストールしてください。
1-1、ディレクトリ作成
カレントディレクトリにelasticsearch+kibanaのデータを保存するディレクトリを作成します。
#作業内で使用する変数もここで定義します。
ELASTIC_PASSWORD="Passw0rd!"
ELASTIC_VERSION="7.8.0"
#ディレクトリ作成
mkdir -p ./data/cert ./data/elasticsearch/data ./data/kibana
mkdir -p ./dockerfile/rpi-elasticsearch ./dockerfile/rpi-kibana
chmod -R 777 ./data
1-2、docker-composeファイル作成の作成
lasticsearch+kibanaのコンテナを起動するためのdocker-composeファイルを作成します。
cat <<EOF > ./docker-compose.yaml
version: "3"
services:
elasticsearch:
image: rpi-elasticsearch:${ELASTIC_VERSION}
privileged: true
restart: always
environment:
- discovery.type=single-node
- "ELASTIC_PASSWORD=${ELASTIC_PASSWORD}"
ports:
- 9200:9200
- 9300:9300
volumes:
- ./data/elasticsearch/data:/usr/share/elasticsearch/data
- ./data/cert:/usr/share/elasticsearch/config/cert
- ./data/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
kibana:
image: rpi-kibana:${ELASTIC_VERSION}
volumes:
- ./data/kibana/kibana.yml:/opt/kibana/config/kibana.yml
- ./data/cert:/etc/kibana
restart: always
ports:
- 5601:5601
depends_on:
- elasticsearch
EOF
1-3、elasticsearch設定ファイル作成
elasticsearchの動作を制御する設定ファイルを作成します。同様の設定はDocker-composeファイルの環境変数を使用して定義することもできます。
今回は、設定ファイルを作成し、Dockerのマウント機能を使用してコンテナ内のelasticsearchに設定ファイルを読み込ませます。
設定ファイルの詳細な内容については以下のリンクを参照します。
Configuring Elasticsearchedit
cat <<EOF > ./data/elasticsearch/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/cert/elastic-stack-ca.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/cert/elastic-certificates.p12
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/cert/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/cert/elastic-certificates.p12
EOF
chmod 666 ./data/elasticsearch/elasticsearch.yml
1-4、kibana設定ファイル作成
「1-3」同様kibana用の設定ファイルも作成します。
設定ファイルの詳細な内容については以下のリンクを参照します。
cat <<EOF > ./data/kibana/kibana.yml
server.host: "0.0.0.0"
i18n.locale: "ja-JP"
elasticsearch.hosts: ["https://elasticsearch:9200"]
elasticsearch.username: "elastic"
elasticsearch.password: "${ELASTIC_PASSWORD}"
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/elastic-stack-ca.pem"]
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: /etc/kibana/kibana-server/kibana-server.key
server.ssl.certificate: /etc/kibana/kibana-server/kibana-server.crt
EOF
chmod 666 ./data/kibana/kibana.yml
1-5、elasticsearch用DockerFile作成
elasticsearchをdocker buildするための、Dockerファイルを作成します。
配布元から提供されているDockerイメージには、日本語解析用のプラグインが含まれていません。そのため、ここで日本語解析用のプラグインを含めたDockerイメージを作成します。
cat <<EOF > ./dockerfile/rpi-elasticsearch/Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION}
RUN \
elasticsearch-plugin install --batch analysis-icu && \
elasticsearch-plugin install --batch analysis-kuromoji
EOF
1-6、kibana用DockerFile作成
配布元では、ラズベリーパイ用のDockerイメージが現時点で提供されていません。そのため、ラズベリーパイ用のDockerイメージを作成するためのDockerFileを作成します。
cat <<EOF > ./dockerfile/rpi-kibana/Dockerfile
FROM node:10.21.0
COPY ./dockerfile/rpi-kibana/kibana-${ELASTIC_VERSION}-linux-x86_64.tar.gz /opt
RUN tar xzf /opt/kibana-*.tar.gz -C /opt && \
rm /opt/kibana-*.tar.gz && \
ln -s /opt/kibana-* /opt/kibana && \
rm /opt/kibana/node/bin/node && \
ln -sr \`which node\` /opt/kibana/node/bin/node
ENV NODE_OPTIONS=--max-old-space-size=512
CMD ["/opt/kibana/bin/kibana","--allow-root"]
EOF
1-7、kibanaソースファイルをダウンロード
ラズベリーパイ用のDockerイメージを作成するために必要な、kibanaのソースファイルをダウンロードします。
wget -P ./dockerfile/rpi-kibana https://artifacts.elastic.co/downloads/kibana/kibana-${ELASTIC_VERSION}-linux-x86_64.tar.gz
1-8、elasticsearch・kibanaのDockerイメージ作成
「1-5」・「1-6」で作成したDockerFileでラズベリーパイ用のDockerイメージを作成します。
docker build -t rpi-elasticsearch:${ELASTIC_VERSION} -f ./dockerfile/rpi-elasticsearch/Dockerfile .
docker build -t rpi-kibana:${ELASTIC_VERSION} -f ./dockerfile/rpi-kibana/Dockerfile .
2、自己証明書の作成
2-1、証明書作成用Dockerコンテナ起動
以下のコマンドを実行し、証明書作成用のDockerコンテナを起動します。
※このコンテナは、証明書作成後に削除します。
#Dockerコンテナ起動
docker run \
--name Elasticsearch -d \
--privileged \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-v `pwd`/data/cert:/usr/share/elasticsearch/config/cert \
rpi-elasticsearch:${ELASTIC_VERSION}
2-2、証明書の作成
Dockerコンテナへログイン
docker exec -it Elasticsearch bash
opensslとunzipを使えるようにする
yum install -y openssl unzip
認証局を作成
bin/elasticsearch-certutil ca
#ダイアログは何も入れずenterを押し続ける(お好みで入力してもいい)
秘密鍵を生成
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
#ダイアログは何も入れずenterを押し続ける(お好みで入力してもいい)
証明書を作成
openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-stack-ca.pem
Kibanaをhttps化するのに必要なサーバ証明書と秘密鍵を生成
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --pem --name kibana-server
#ダイアログは何も入れずenterを押し続ける(お好みで入力してもいい)
unzip certificate-bundle.zip
諸々をホスト側に移動してコンテナを抜ける
mv elastic-* ./config/cert
mv kibana-server ./config/cert
exit
証明書作成用Docker削除
docker stop Elasticsearch
docker rm Elasticsearch
証明書ファイルの権限変更
chmod 644 ./data/cert/elastic-certificates.p12
chmod 644 ./data/cert/elastic-stack-ca.p12
4、起動
以下のコマンドを実行し、elasticsearch・kibanaを起動する。
docker-compose up -d
5、kibanaへログイン・各種設定
ブラウザーでkibanaのIPアドレスを入力し、ログインします。
https://ホストIPアドレス:5601/
ログイン名・パスワードは以下を入力します。
ユーザー名:elastic
パスワード:「1-1、」で設定した「ELASTIC_PASSWORD」
その他
ここで作成した証明書は、オレオレ証明書のため、外部ツールなどと連携して使用する場合は注意が必要です。
必要に応じて、ssl証明書発行機関が発行した証明書を使用したり、nginxを間に挟み、証明書を適用するなどしましょう。
nginxのDockerコンテナ設定方法は以下リンクの「3-3、Docker環境の準備」「3-4、nginx-proxyの作成」に記載しています。