DockerでElastic Stack 8.2環境の構築

# 背景

様々なログのデータをデータベースに集積して可視化して解析する用途に「Elastic Stack」を使用していますがDockerで手軽に最新のElastic Stack環境を作成するメモ書きです。

# Elastic Stack

- [Elastic Stack = Elasticsearch、Kibana、Beats、Logstash | Elastic](https://www.elastic.co/jp/elastic-stack/)

詳しくは公式ページの案内にありますが簡潔すると以下の様な機能構成になります。

- Elasticsearch
　データの集積と検索と分析を担います。
- Logstash
　データをElasticsearchに投入する際のパイプライン機能を担います。
- Kibana
　データの可視化で様々なチャートやグラフなどで表現機能を担います。

以前はこれらの頭文字をとって「ELK Stack」とも呼ばれていました。

- [ELK Stack：Elasticsearch開発元が提供するプロダクト | Elastic](https://www.elastic.co/jp/what-is/elk-stack)

基本機能はオープンソースで無料で使用出来ますが、一部に有料ライセンス機能があります。
はじめは試用期間を試して後で無効にする事もできます。

# 動作環境

## ホスト側

- OS:Ubuntu Server 20.04.4LTS
- Docker CE version 20.10.16
- docker compose version v2.6.0

## コンテナ側

- Elastic Stack 8.2.2

# Docker環境の準備

以下のページにて紹介していますので参考にしてみて下さい。

- [Linuxサーバー環境のDockerインストールメモ - Qiita ](https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e)

# ファイアウォール設定(重要)

グローバルIPアドレス環境で構築した場合にはElastic Stackの各サービスがインターネット外部に漏洩してしまうので必ずファイアウォール（セキュリティグループ等）の設定を事前に行いましょう。
今回の場合ではTCP/5601番を作業端末側だけに限定して開放します。
Elastic Stackを狙ったサイバー攻撃は世界中から頻繁に来ていますので数秒たりとも外部開放はしないように。

# Elastic Stackの構築

今回は手軽にDocker Composeで最新のElastic Stackが構築出来る以下のリポジトリを利用します。

- [GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.] (https://github.com/deviantony/docker-elk)

## Githubから取得

必要となる基本のファイルをGithubから入手します。

```
$ git clone https://github.com/deviantony/docker-elk.git
$ cd docker-elk
```

## Docker Composeでコンテナ環境を起動

```
$ docker compose up -d
$ docker compose ps
NAME                         COMMAND                  SERVICE             STATUS              PORTS
docker-elk-elasticsearch-1   "/bin/tini -- /usr/l…"   elasticsearch       running             0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9200->9200/tcp, :::9300->9300/tcp
docker-elk-kibana-1          "/bin/tini -- /usr/l…"   kibana              running             0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
docker-elk-logstash-1        "/usr/local/bin/dock…"   logstash            running             0.0.0.0:5000->5000/tcp, 0.0.0.0:5000->5000/udp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:9600->9600/tcp, :::5000->5000/tcp, :::5000->5000/udp, :::5044->5044/tcp, :::9600->9600/tcp
docker-elk-setup-1           "/entrypoint.sh"         setup               running             9300/tcp
```

## Elastic Stackのログイン画面

環境にもよりますが数分待つとWebブラウザからElastic Stackのログイン画面が表示出来ます。
DockerホストのIPアドレス番号とポート番号はKibanaの5601番を指定します。

　「http://127.0.0.1:5601」

標準のアカウント名は「elastic」パスワードは「changeme」に設定されているので一端はログインして動作確認をしておきます。

## パスワードの初期化と新規作成

標準のアカウントのパスワードをリセットして新規作成します。
使用される3つのアカウントについて実施します。
各コマンド実行時に表示される新しいパスワードを別途記録しておきます。

```
$ docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user elastic
$ docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user logstash_internal
$ docker compose exec elasticsearch bin/elasticsearch-reset-password --batch --user kibana_system
```

## 新規パスワード設定

環境設定ファイル「.env」に先程作成した新規パスワードに修正変更します。

```:docker-elk/.env
ELASTIC_PASSWORD='elasticの新規パスワード'
LOGSTASH_INTERNAL_PASSWORD='logstashの新規パスワード'
KIBANA_SYSTEM_PASSWORD='kibanaの新規パスワード'
```

## Docker Compose 再起動

docker composeでLogstashとKibanaを再起動します。

```
$ docker compose up -d logstash kibana
```

新しいパスワードでElastic Stackに再ログイン出来る事を確認します。

## 日本語化

Elastic Stackの画面を日本語にする場合には設定ファイルを修正します。

```:kibana/config/kibana.yml
i18n.locale: "ja-JP"
```

docker composeでKibanaを再起動します。

```
$ docker compose restart kibana
```