Elastic社公式の Docker イメージに Logstash が追加されていました

2017.01.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、藤本です。

以前、下記エントリで Elastic社公式の Docker イメージをご紹介しました。

Elastic社公式のDockerイメージ(Beta版)が提供されるようになりました

当時は Elasticsearch、Kibana のイメージのみが提供されていましたが、Logstash のイメージも追加されていたようです。

Elastic 社のドキュメントにも利用方法が記載されています。

Running Logstash on Docker

試してみた

環境

今回はローカルの 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 リポジトリにサンプルがありますので、そちらを使って説明します。

elastic/logstash-docker

このサンプルで 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.ymlexamples/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 へアクセスします。

Kibana

デフォルトで X-Pack が有効になっているのでログイン画面が表示されます。デフォルトユーザーのユーザー名elastic、パスワードchangemeでログインします。

パイプライン設定の elasticsearch でインデックス名は指定していないので、logstash-YYYY.MM.DD でインデキシングされています。インデックス設定はそのまま logstash-* で設定します。

Kibana 2

Discover からインデキシングされているドキュメントを見てましょう。

Kibana 3

うん、ドキュメントが入っていますね。heartbeat プラグインにより 5秒毎に「Hello from Logstash ?」のメッセージがインデキシングされています。

まとめ

いかがでしたでしょうか。

Elasticsearch、Kibana に加えて Logstash も公式イメージが提供されるようになりました。軽く試すだけなら Docker をそんなに知らなくても、サンプルや、ドキュメントがあるので、簡単に素早く Elastic Stack を利用することができます。