Created
August 29, 2026 09:21
-
-
Save blacknon/1973bb846976aa0dded92cd3fc2e2089 to your computer and use it in GitHub Desktop.
elkstack
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| はい。単体 Docker ホストであれば、かなりシンプルに構成できます。 | |
| 以下は Elastic Stack 9.5.2 を使った Elasticsearch + Logstash + Kibana の1ノード構成です。9.5.2 は現時点の公式最新版です。 | |
| 今回はまず動かしやすいように、Elastic の認証機能を無効化した閉域・検証向け構成にしています。 | |
| ディレクトリ構成 | |
| elk/ | |
| ├── docker-compose.yml | |
| ├── .env | |
| └── logstash/ | |
| ├── config/ | |
| │ └── logstash.yml | |
| └── pipeline/ | |
| └── logstash.conf | |
| .env | |
| STACK_VERSION=9.5.2 | |
| docker-compose.yml | |
| services: | |
| elasticsearch: | |
| image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} | |
| container_name: elasticsearch | |
| restart: unless-stopped | |
| environment: | |
| node.name: elasticsearch | |
| cluster.name: elk-single | |
| discovery.type: single-node | |
| # 今回は閉域・検証用として認証を無効化 | |
| xpack.security.enabled: "false" | |
| bootstrap.memory_lock: "true" | |
| # ホストのメモリ容量に応じて変更 | |
| ES_JAVA_OPTS: "-Xms2g -Xmx2g" | |
| ulimits: | |
| memlock: | |
| soft: -1 | |
| hard: -1 | |
| volumes: | |
| - esdata:/usr/share/elasticsearch/data | |
| # Elasticsearchは外部公開しない | |
| ports: | |
| - "127.0.0.1:9200:9200" | |
| networks: | |
| - elk | |
| healthcheck: | |
| test: | |
| [ | |
| "CMD-SHELL", | |
| "curl -fs http://localhost:9200/_cluster/health || exit 1" | |
| ] | |
| interval: 10s | |
| timeout: 5s | |
| retries: 20 | |
| logstash: | |
| image: docker.elastic.co/logstash/logstash:${STACK_VERSION} | |
| container_name: logstash | |
| restart: unless-stopped | |
| environment: | |
| LS_JAVA_OPTS: "-Xms512m -Xmx512m" | |
| volumes: | |
| - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro | |
| - ./logstash/pipeline:/usr/share/logstash/pipeline:ro | |
| # Persistent Queue等を保存 | |
| - logstashdata:/usr/share/logstash/data | |
| ports: | |
| # Beats入力 | |
| - "5044:5044" | |
| depends_on: | |
| elasticsearch: | |
| condition: service_healthy | |
| networks: | |
| - elk | |
| kibana: | |
| image: docker.elastic.co/kibana/kibana:${STACK_VERSION} | |
| container_name: kibana | |
| restart: unless-stopped | |
| environment: | |
| SERVER_NAME: kibana | |
| ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]' | |
| # 再起動しても暗号化済みSaved Objectを利用できるよう | |
| # 必ず固定値にする | |
| XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY: "change-this-to-a-long-random-key-at-least-32-bytes" | |
| ports: | |
| - "5601:5601" | |
| depends_on: | |
| elasticsearch: | |
| condition: service_healthy | |
| networks: | |
| - elk | |
| volumes: | |
| esdata: | |
| logstashdata: | |
| networks: | |
| elk: | |
| driver: bridge | |
| ここで最も重要なのが、 | |
| volumes: | |
| - esdata:/usr/share/elasticsearch/data | |
| です。Elastic 公式も Elasticsearch の /usr/share/elasticsearch/data を永続ボリュームにすることを推奨しています。 | |
| ⸻ | |
| Logstash設定 | |
| logstash/config/logstash.yml | |
| http.host: "0.0.0.0" | |
| config.reload.automatic: true | |
| config.reload.interval: 5s | |
| # メモリキューではなくディスク上のPersistent Queueを使用 | |
| queue.type: persisted | |
| queue.max_bytes: 2gb | |
| dead_letter_queue.enable: true | |
| Logstash の Docker イメージでは /usr/share/logstash/data が永続データ用ディレクトリで、Persistent Queue もこの配下に保存されます。 | |
| そのため Compose 側で、 | |
| - logstashdata:/usr/share/logstash/data | |
| としています。 | |
| ⸻ | |
| Logstash Pipeline | |
| とりあえず Beats → Logstash → Elasticsearch とするなら、 | |
| logstash/pipeline/logstash.conf | |
| input { | |
| beats { | |
| port => 5044 | |
| } | |
| } | |
| filter { | |
| } | |
| output { | |
| elasticsearch { | |
| hosts => [ | |
| "http://elasticsearch:9200" | |
| ] | |
| index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" | |
| } | |
| # 動作確認用 | |
| stdout { | |
| codec => rubydebug | |
| } | |
| } | |
| たとえば Winlogbeat からなら、 | |
| Winlogbeat | |
| | | |
| | TCP/5044 | |
| v | |
| +-----------------------------------------+ | |
| | Docker Host | | |
| | | | |
| | +----------+ +---------------+ | | |
| | | Logstash | ----> | Elasticsearch | | | |
| | | 5044 | | 9200 | | | |
| | +----------+ +-------+-------+ | | |
| | | | | |
| | | | | |
| | +-------v-------+ | | |
| | | Kibana | | | |
| | | 5601 | | | |
| | +---------------+ | | |
| | | | |
| | esdata volume | | |
| | └─ Elasticsearch index | | |
| | ├─ ログデータ | | |
| | └─ Kibana Saved Objects | | |
| | | | |
| | logstashdata volume | | |
| | └─ Persistent Queue | | |
| +-----------------------------------------+ | |
| という形になります。 | |
| ⸻ | |
| Kibanaの設定はなぜ残るのか | |
| ここは少し分かりにくいですが、Kibana に kibanadata のような volume を作る必要は基本ありません。 | |
| Kibana の以下のような情報は、 | |
| * Dashboard | |
| * Visualization | |
| * Data View | |
| * Discover の Saved Search | |
| * Space | |
| * Advanced Settings | |
| * Alert | |
| * Saved Objects | |
| など、Elasticsearch の内部システムインデックスに保存されます。 | |
| したがって、 | |
| Kibana | |
| ↓ | |
| Elasticsearch | |
| ↓ | |
| /usr/share/elasticsearch/data | |
| ↓ | |
| esdata Docker Volume | |
| という関係になっています。 | |
| つまり、 | |
| docker compose restart | |
| しても、 | |
| docker compose down | |
| docker compose up -d | |
| しても、esdata が残っている限り、 | |
| ログデータも Kibana の Dashboard も残ります。 | |
| Elastic公式も docker compose down では Docker volume は保持され、再起動後に再利用されるとしています。 | |
| ただし、 | |
| docker compose down -v | |
| は実行しないでください。 | |
| -v を付けると、 | |
| esdata | |
| logstashdata | |
| まで削除されます。 | |
| ⸻ | |
| ホスト側で必要な設定 | |
| Elasticsearch 9.5 系では、Linux ホスト側で vm.max_map_count=1048576 が必要です。 | |
| 確認: | |
| sysctl vm.max_map_count | |
| 変更: | |
| sudo sysctl -w vm.max_map_count=1048576 | |
| 永続化: | |
| echo 'vm.max_map_count=1048576' \ | |
| | sudo tee /etc/sysctl.d/99-elasticsearch.conf | |
| sudo sysctl --system | |
| ⸻ | |
| 起動 | |
| cd elk | |
| docker compose up -d | |
| 確認: | |
| docker compose ps | |
| Elasticsearch: | |
| curl http://127.0.0.1:9200 | |
| Kibana: | |
| http://Dockerホスト:5601 | |
| Logstashログ: | |
| docker compose logs -f logstash | |
| Elasticsearch: | |
| docker compose logs -f elasticsearch | |
| ⸻ | |
| 1点だけセキュリティ上の注意 | |
| この例では、 | |
| xpack.security.enabled: "false" | |
| なので Kibanaにログイン認証がありません。 | |
| したがって、閉域ネットワークならこの構成でも使えますが、業務環境として使うなら、 | |
| クライアント | |
| ↓ 5044 | |
| Logstash | |
| ↓ | |
| Elasticsearch | |
| 管理端末 | |
| ↓ HTTPS | |
| Kibana | |
| として、Elasticsearch 9200 は外部非公開、Kibana は認証ありにする構成を推奨します。 | |
| 特に「単体ホストのオンプレELK」として使うのであれば、次の段階として Elasticsearch/Kibanaの認証を有効化しつつ、Winlogbeat → Logstash → Elasticsearch をTLS化した構成まで作っておくと、かなり実運用に近い形になります。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment