この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、藤本です。
以前、下記エントリで Elastic社公式の Docker イメージをご紹介しました。
Elastic社公式のDockerイメージ(Beta版)が提供されるようになりました
当時は Elasticsearch、Kibana のイメージのみが提供されていましたが、Logstash のイメージも追加されていたようです。
Elastic 社のドキュメントにも利用方法が記載されています。
試してみた
環境
今回はローカルの Docker for Mac を利用しています。
Docker for Macに関しては以下のエントリをご参照ください。
Public BetaになったDocker for Macを使ってみる
Logstash のコンテナを起動する
下記パスがイメージのパスとなります。
docker.elastic.co/logstash/logstash:5.1.1
5.1.1
はバージョン番号ですので、利用したいバージョンに置き換えてください。
デフォルト設定は Beats から受け取ったデータを標準出力します。まずはデフォルト設定のまま立ち上げて、ローカルで起動した Metricbeat からの CPU使用状況を Logstash のコンテナへ送信し、標準出力してみます。
それではサクッと立ち上げてみましょう。
$ docker run --rm -it -p 5044:5044 docker.elastic.co/logstash/logstash:5.1.1
Unable to find image 'docker.elastic.co/logstash/logstash:5.1.1' locally
5.1.1: Pulling from logstash/logstash
af49a5ceb2a5: Pull complete
8f9757b472e7: Pull complete
e931b117db38: Pull complete
47b5e16c0811: Pull complete
9332eaf1a55b: Pull complete
f66096422874: Pull complete
399f52f454b5: Pull complete
9786aa3ba20c: Pull complete
2c4ef0d26e32: Pull complete
59794fdc2ba3: Pull complete
02cebb6ad2b6: Pull complete
08d7e1c78288: Pull complete
Digest: sha256:1fbb0178023a4fb5ae2662e43409b77bea9db92bf13fedf8d4137239833ef62f
Status: Downloaded newer image for docker.elastic.co/logstash/logstash:5.1.1
Sending Logstash's logs to /usr/share/logstash/logs which is now configured via log4j2.properties
[2016-12-27T01:40:43,872][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"}
[2016-12-27T01:40:43,896][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"7b1cbb42-dac2-4bc0-ace6-fb9b8f876c4b", :path=>"/usr/share/logstash/data/uuid"}
[2016-12-27T01:41:51,453][INFO ][logstash.inputs.beats ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
[2016-12-27T01:41:51,526][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
[2016-12-27T01:41:51,531][INFO ][logstash.pipeline ] Pipeline main started
[2016-12-27T01:41:51,590][INFO ][org.logstash.beats.Server] Starting server on port: 5044
[2016-12-27T01:41:51,749][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
起動しました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bf0a375d1c5 docker.elastic.co/logstash/logstash:5.1.1 "logstash -f /usr/sha" 2 minutes ago Up 2 minutes 0.0.0.0:5044->5044/tcp determined_heisenberg
次に別ターミナルを立ち上げて Metricbeat を起動します。
$ wget https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-5.1.1-darwin-x86_64.tar.gz
$ tar xzf metricbeat-5.1.1-darwin-x86_64.tar.gz
$ cd metricbeat-5.1.1-darwin-x86_64
$ echo 'metricbeat.modules:
- module: system
metricsets:
- cpu
enabled: true
period: 10s
output.logstash:
hosts: ["localhost:5044"]' > metricbeat.yml
$ ./metricbeat
metricbeat を起動すると 10秒毎に、Logstash コンテナの標準出力に CPU使用状況のメトリクスが表示されます。
{
"@timestamp" => 2016-12-27T03:39:41.678Z,
"system" => {
"cpu" => {
"system" => {
"pct" => 0.0
},
"softirq" => {
"pct" => 0.0
},
"steal" => {
"pct" => 0.0
},
"idle" => {
"pct" => 0.0
},
"irq" => {
"pct" => 0.0
},
"iowait" => {
"pct" => 0.0
},
"user" => {
"pct" => 0.0
},
"nice" => {
"pct" => 0.0
}
}
},
:
非常に簡単に利用できました。
任意の設定で Logstash コンテナを起動する
デフォルト設定では Beats から受け取った値の標準出力しかできません。次に独自のパイプライン設定の Logstash コンテナを立ち上げてみます。
Logstash コンテナは/usr/share/logstash/pipeline/
配下にある設定ファイルを読み込んで起動するため、ローカルにパイプライン設定ファイルを作成し、データボリュームとしてマッピングしてあげれば、独自のパイプライン設定を利用できます。
Elastic社の Github リポジトリにサンプルがありますので、そちらを使って説明します。
このサンプルで Logstash -> Elasticsearch -> Kibana の各コンテナの接続も確認することができます。
Github リポジトリからダウンロードします。
$ git clone https://github.com/elastic/logstash-docker.git
Cloning into 'logstash-docker'...
remote: Counting objects: 237, done.
remote: Total 237 (delta 0), reused 0 (delta 0), pack-reused 237
Receiving objects: 100% (237/237), 36.60 KiB | 0 bytes/s, done.
Resolving deltas: 100% (118/118), done.
$ cd logstash-docker
$ tree .
.
├── LICENSE
├── Makefile
├── README.md
├── build
│ └── logstash
│ ├── Dockerfile
│ ├── config
│ │ ├── log4j2.properties
│ │ └── logstash.yml
│ └── pipeline
│ └── default.conf
├── docker-compose.demo.yml
├── docker-compose.yml
├── examples
│ └── elastic-stack-demo
│ └── logstash.conf
└── test
├── constants.py
├── helpers.py
├── requirements.txt
└── test_basics.py
7 directories, 14 files
今回利用するファイルはdocker-compose.demo.yml
、examples/elastic-stack-demo/logstash.conf
の2つです。
docker-compose.demo.yml
Docker Compose の設定ファイルです。Logstash、Elasticsearch、Kibana、Redis のコンテナを立ち上げます。Logstash は Elasticsearch、Redis のコンテナをリンクしています。Kibana は Elasticsearch コンテナをリンクしています。パイプライン設定は./examples/elastic-stack-demo
を/usr/share/logstash/pipeline
にマッピングしています。./examples/elastic-stack-demo
内にあるlogstash.conf
にパイプライン設定が記述されています。
---
# A demonstration of running Logstash in Docker, with Elasticsearch, Kibana
# and various example Logstash input plugins.
version: '2'
services:
logstash:
image: docker.elastic.co/logstash/logstash:${VERSION_TAG}
volumes:
- ./examples/elastic-stack-demo:/usr/share/logstash/pipeline
links:
- elasticsearch
- redis
ports:
# Beats input -- https://www.elastic.co/guide/en/logstash/5.0/plugins-inputs-beats.html
- '5044:5044'
# UDP input -- https://www.elastic.co/guide/en/logstash/master/plugins-inputs-udp.html#plugins-inputs-udp-codec
- '43448:43448/udp'
# Monitoring APIs -- https://www.elastic.co/guide/en/logstash/5.0/monitoring.html
- '9600:9600'
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION_TAG}
kibana:
image: docker.elastic.co/kibana/kibana:${VERSION_TAG}
ports: [ '5601:5601' ]
links: [ elasticsearch ]
redis:
image: redis
ports: [ '6379:6379' ]
examples/elastic-stack-demo/logstash.conf
パイプラインの設定ファイルです。4つのインプットプラグインが指定されています。これらは全てのそのまま Elasticsearch に送信しています。今回は 2つ目の heartbeat インプットプラグインで 5秒毎に送られるメッセージがインデキシングされていることを確認します。取得した値をそのまま Elasticsearch へインデキシングしています。
input {
file {
path => '/mnt/log/syslog'
}
heartbeat {
interval => 5
message => 'Hello from Logstash ?'
}
redis {
key => 'logstash'
data_type => 'list'
host => 'redis'
}
udp {
port => 43448
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
user => 'elastic'
password => 'changeme'
}
}
コンテナ起動
それではコンテナを立ち上げましょう。docker-compose
コマンド一発で起動します。
$ docker-compose -f docker-compose.demo.yml up
:
標準出力がずらずら出力されます。起動までしばらく待ちます。。
標準出力が落ち着いたところで Kibana へアクセスしてみて、データが入っているか見てみましょう。
Webブラウザから localhost:5601
へアクセスします。
デフォルトで X-Pack が有効になっているのでログイン画面が表示されます。デフォルトユーザーのユーザー名elastic
、パスワードchangeme
でログインします。
パイプライン設定の elasticsearch でインデックス名は指定していないので、logstash-YYYY.MM.DD でインデキシングされています。インデックス設定はそのまま logstash-*
で設定します。
Discover からインデキシングされているドキュメントを見てましょう。
うん、ドキュメントが入っていますね。heartbeat プラグインにより 5秒毎に「Hello from Logstash ?」のメッセージがインデキシングされています。
まとめ
いかがでしたでしょうか。
Elasticsearch、Kibana に加えて Logstash も公式イメージが提供されるようになりました。軽く試すだけなら Docker をそんなに知らなくても、サンプルや、ドキュメントがあるので、簡単に素早く Elastic Stack を利用することができます。