Elastic社公式の Docker イメージに Logstash が追加されていました
こんにちは、藤本です。
以前、下記エントリで 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 を利用することができます。