今回の環境は以下の通り。最新版の 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
# 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 コンテナを起動します。
# 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 が表示されれば成功です。
# 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
# 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呼び出しで必要とするので控えておいてください。
# 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...)を入力してログインできれば成功です。
# 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 と似たデータ構造を持ちますが、用語がかなり異なります。
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] で参照することができます。
下記のようなサンプルデータを用意します。
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リファレンスは下記にあります。
curl -s \ -X GET \ -H "Content-Type: application/json" \ http://localhost:9200/people/_search \ -d '{ ... }'
結果の JSON を整形して表示するには jq コマンドが便利です。
# dnf -y install jq curl -s .... | jq
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 '{ ... }'
[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 で扱える型は下記を参照してください。
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.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" }
次の例は、/var/log/httpd/access_log を読み取り、grok というプラグインでログ構文を解析し、Elasticsearch に投入するサンプルです。
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 } }