とほほのELK入門

目次

ELKとは

インストール

今回の環境は以下の通り。最新版の v8.5 と、AWS の OpenSearch と枝分かれする直前の v7.10 で試してみます。下記を参考にインストールしていきます。

ホストOS:Windows 10
VM:Rocky Linux 8.6 / 2vCPU / 4GBメモリ
インストール方式:Podman
Elasticsearch:7.10.2 / 8.5.2
Kibana:7.10.2 / 8.5.2

Elasticsearchをインストールする(v7.10)

# dnf -y install podman
# touch /etc/containers/nodocker
# sysctl -w vm.max_map_count=262144
# docker network create --subnet 192.168.200.0/24 elastic
# docker run -d --name elasticsearch --net elastic --ip 192.168.200.2 -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.2
# docker logs -f elasticsearch

docker logs でログが出力されなくなれば起動完了です。docker logs は Ctrl-C で停止してください。

Kibanaをインストールする(v7.10)

Kibana コンテナを起動します。

# docker run -d --name kibana --add-host elasticsearch:192.168.200.2 --net elastic -p 5601:5601 \
  docker.elastic.co/kibana/kibana:7.10.2
# docker logs -f kibana

下記のメッセージが表示されれば起動完了です。

{..."message":"Server running at http://0:5601"}

ブラウザから http://{サーバアドレス}:5601/ にアクセスして Welcome to Elastic が表示されれば成功です。

Logstashをインストールする(v7.10)

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/logstash.repo
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum -y install logstash

Elasticsearchをインストールする(v8.5)

# dnf -y install podman
# touch /etc/containers/nodocker
# sysctl -w vm.max_map_count=262144
# docker network create elastic
# docker run -d --name es01 --net elastic -p 9200:9200 -it docker.elastic.co/elasticsearch/elasticsearch:8.5.2
# docker logs -f es01

docker logs でログが出力されなくなれば起動完了です。docker logs は Ctrl-C で停止してください。

# docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y

Password for the [elastic] user successfully reset.
New value: MXOoKw=bkIEOUorgHHZP

ユーザ名(elastic)とパスワード(例:MXO...)はログインやAPI呼び出しで必要とするので控えておいてください。

Kibanaをインストールする(v8.5)

# docker run -d --name kb01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.5.2
# docker logs -f kb01

下記のメッセージが表示されれば起動完了です。

i Kibana has not been configured.

Go to http://0.0.0.0:5601/?code=418933 to get started.

ブラウザから http://{サーバアドレス}:5601/code=418933 にアクセスすると Enrollment token の入力を求められます。下記でトークンを生成してください。

# docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjUuMiIsImFkciI6WyIxMC44OS4wLjI6OTIwMCJdLCJmZ3IiOiJmOTcxMmJkZGFjODRkZmJmZDMyNjVhMGU2N2Ez
NzNjMzFiNzU1NzgwNzdlMjlkNTNhZDQ1NGNmMTQ0MjA1YTJmIiwia2V5IjoiMHBybHNJUUJOU014WmpmLXBFV0U6UlowcXJvRHRS
NTZUWkZWWEFfWEFnZyJ9

生成されたトークンを画面にコピペ入力して [Configure Elastic] ボタンを押してください。ログイン画面が表示されるので [Username] に elastic、[Password] に上記で生成したパスワード(例:MXO...)を入力してログインできれば成功です。

Logstashをインストールする(v8.5)

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/logstash.repo
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum -y install logstash

用語

RDB と似たデータ構造を持ちますが、用語がかなり異なります。

Kibana

サンプルデータを見る

v7.10 は [Add data]-[Sample data] から、v8.5 は [Add Integrations]-[Sample data]-[Other sample data sets] から Eコマース、フライトデータ、Webログのサンプルデータを取り込むことができます。取り込んだデータは v7.10 は [Home]-[Kibana]、v8.5 は [Home]-[Analytics] から [Dashboard] や [Discover] で参照することができます。

ファイルをアップロードする

下記のようなサンプルデータを用意します。

people.csv
name,age,address
Yamada,26,Tokyo
Suzuki,32,Osaka
Tanaka,45,Nagoya

v7.10 は [Home]-[Upload a file]、v8.5 は [Home]-[Add Integrations]-[Upload a file] から上記で作成したCSVファイル(people.csv)をドラッグ&ドロップでアップロードして [Import]。[Index name] に people などの名前をつけて [Import]。

アップロードしたデータを見る

v7.10 の場合は [Home]-[Kibana]-[Discover]、v8.5 の場合は [Home]-[Analytics]-[Discover] から左上の選択肢からデータビュー(people)を選択。検索欄に [name:Yamada] を入力して検索するとデータを絞りこむことができます。

インデックスの一覧を管理する

[Home]-[左メニュー]-[Management]-[Stack Management]-[左メニュー]-[Data]-[Index Management]。

インデックスパターン/データビューの一覧を管理する

[Home]-[左メニュー]-[Management]-[Stack Management]-[左メニュー]-[Kibana] から、v7.10 の場合は [Index Patterns]、v8.5 の場合は [Data Views]

ダッシュボードを作成する

v7.10 は [Home]-[Kibana]、v8.5 は [Home]-[Analitics] から、[Dashboard]-[Create dashboard]-[Save] で名前をつけて [Save]。

ダッシュボードにビジュアライゼーションを追加する

v7.10 の場合はダッシュボードを表示した状態で、[Edit]-[Create new]-[Vertical Bar] から kibana_sample_data_logs を選択し、右上の時計マークから [Last 7 days] を選択。[Buckets]-[Add]-[X-axis] で [Aggregation] に [Date Histogram] を選択して [Update]。[Save] で Access Count などのタイトルをつけて [Save and return]-[Save]。

v8.5 の場合は [Create visualization] から右側の選択欄で [Bar vertical]、[Kibana Sample Data Logs] を選択。[Horizontal axis] で [Data Histogram]、[timestamp] を選択して [Close]。[Vertical axis] で [Count] を選択して [Close]。上部のカレンダーアイコンから [Last 7 days] を選択して [Save and return]-[Save]。

ビジュアライゼーションの一覧を管理する

v7.10 は [Home]-[左メニュー]-[Kibana]-[Visualize]、v8.5 は [Home]-[左メニュー]-[Analytics]-[Visualize Library] でビジュアライゼーション/ビジュアライズライブラリの一覧を表示できます。一覧が表示されない場合は左上のパンくずリストから [Visualize] をクリック。v8.5 の場合はビジュアライズライブラリとして登録したもののみが表示されます。

インデックスからデータビューを作成する

APIからインデックス登録した場合など、インデックスに対応するデータビューが作成されていないことがあります。インデックスパターン/データビュー管理画面から [Create index pattern] または [Create data view] を選択するとデータソース(インデックス)が表示されている。[Name] にデータビュー名(例:people)を、[Index pattern] にデータソース名 (例:people*) を指定して [Save data view to Kibana]。

Elasticsearch

APIリファレンス

Elasticsearch の APIリファレンスは下記にあります。

Curlから呼び出す例(v7.10)

curl -s \
  -X GET \
  -H "Content-Type: application/json" \
  http://localhost:9200/people/_search \
  -d '{ ... }'

結果の JSON を整形して表示するには jq コマンドが便利です。

# dnf -y install jq
curl -s .... | jq

Curlから呼び出す例(v8.5)

v8.x からはセキュリティが強化され、クライアント証明書(http_ca.crt)、ユーザ名(例:elastic)、パスワード(例:MXO...) が必要となりました。

# docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
# curl --cacert http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic':MXOoKw=bkIEOUorgHHZP
curl -s \
  -X POST \
  -H "Content-Type: application/json" \
  --cacert http_ca.crt -u elastic:MXOoKw=bkIEOUorgHHZP \
  https://localhost:9200/xxx \
  -d '{ ... }'

Web画面からAPIを発行する

[Home]-[左メニュー]-[Management]-[Dev Tools] で左ペインに下記のような API を入力し、入力した行にカーソルをあてて ▶ ボタンを押すと右ペインにその結果が表示されます。

PUT /people/_doc/1
{"name":"Yamada", "age":26, "address":"Tokyo"}

カテゴリ

# カテゴリの一覧を得る
GET /_cat

インデックス

インデックスは RDB のテーブルに相当する概念です。

# インデックスを作成する
PUT /people
{
  "mappings": {
    "properties" : {
      "name" : {"type": "text"},
      "age" : {"type": "integer"},
      "address" : {"type" : "text"}
    }
  }
}

# インデックスを削除する
DELETE /people

ドキュメント

ドキュメントは RDB のレコードに相当する概念です。

# ドキュメントを登録する(ID指定)
PUT /people/_doc/1
{"name":"Yamada", "age":26, "address":"Tokyo"}

# ドキュメントを登録する(ID省略)
POST /people/_doc/
{"name":"Tanaka", "age":32, "address":"Osaka"}

# ドキュメントを更新する
PUT /people/_doc/1
{"name":"Yamada", "age":27, "address":"Tokyo"}

# ドキュメントを得る
GET /people/_doc/1

# ドキュメントにフィールドを追加する
POST /people/_update/1
{"doc": {"blood_type":"A"}}

# ドキュメントを一括登録する
POST /people/_bulk?pretty
{"index": {"_id": "1"}}
{"name":"Yamada", "age":26, "address":"Tokyo"}
{"index": {"_id": "2"}}
{"name":"Suzuki", "age":32, "address":"Osaka"}
{"index": {"_id": "3"}}
{"name":"Tanaka", "age":45, "address":"Nagoya"}

# ドキュメントを検索する
GET /people/_search

# ドキュメントを条件付きで検索する
GET /people/_search
{"query": {"match":{"name":"Yamada"}}}

# ドキュメントを条件付きで検索する(OR検索)
GET /people/_search
{"query": {"match":{"name":"Yamada Suzuki"}}}

# ドキュメントを削除する
DELETE /people/_doc/1

マッピング

マッピングは RDB のカラム定義に相当する概念です。

# マッピングの一覧を得る
GET /people/_mapping

# マッピングを追加する
PUT /people/_mapping
{"properties": {"blood_type":{"type":"text"}}}

Elasticsearch で扱える型は下記を参照してください。

SQL

RDB のように SQL を発行することもできます。

# SQLを発行する
POST /_sql
{"query":"SELECT * FROM people ORDER BY age" }

# 結果をテキストモードで表示する
POST /_sql?format=txt
{"query": "SELECT * FROM people ORDER BY age"}

SQLに関しては下記を参照してください。

Logstash

標準入力から標準出力に送り込む

下記の内容の logstash.conf ファイルを作成してください。入力元は標準入力、出力先は標準出力であることを示しています。

logstash.conf
input {
    stdin {}
}
output {
    stdout {}
}

下記の様に logstash を起動します。

# /usr/share/logstash/bin/logstash -f ./logstash.conf

The stdin... のメッセージが出力された後、標準入力から Hello world! とタイプして Enter キーを押すと Logstash がこれを読み取り、時刻情報などを付加して標準出力に書き出します。

  :
The stdin plugin is now waiting for input:
  :
Hello world!
{
       "message" => "Hello world!",
      "@version" => "1",
    "@timestamp" => 2022-12-03T04:31:00.772Z,
          "host" => "localhost.localdomain"
}

ApachログからElasticsearchに送り込む

次の例は、/var/log/httpd/access_log を読み取り、grok というプラグインでログ構文を解析し、Elasticsearch に投入するサンプルです。

logstash.conf
input {
    file {
        path => "/var/log/httpd/access_log"
    }
}
filter {
    grok {
        match => {
            "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}'
        }
    }
    date {
        match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
        locale => "en"
    }
}
output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "log"
    }
}

Elasticsearch 8.x 以上の場合は、下記の様にクライアント証明書(http_ca.crt)、ユーザ名(elastic)、パスワード(MXO...)を指定してください。

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "log"
        cacert => "/root/http_ca.crt"
        user => "elastic"
        password => "MXOoKw=bkIEOUorgHHZP"
        ssl => true
    }
}

その他

Elastic社とAWS社の紛争