やること
- DockerでELK(Elasticsearch Logstash Kibana) を構築してみました – Qiita をやってみる。
- Docker で Nginx サーバを立てる。このサーバへのアクセスログを ELK スタックで収集・閲覧する。
- Docker で ELK スタック ("Elasticsearch" 、 "Logstash" そして "Kibana" によるログ収集管理システム) を構築する。
- 今回は Docker のみで操作する。 Docker Compose は使わない。
実践
sample_elk というディレクトリを適当な場所に作成し、そこで操作します。
mkdir sample_elk
cd sample_elk
## 設定ファイルや共有ディレクトリ等を作成
mkdir -p data/nginx/log data/elasticsearch data/logstash/pipeline
# Nginx 起動
docker run -d --restart always -v $(pwd)/data/nginx/log:/var/log/nginx -p 80:80 --name nginx nginx:latest
# http://localhost にアクセスする。
# Elasticsearch起動
docker run -d --restart always -v $(pwd)/data/elasticsearch:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0
# http://localhost:9200 にアクセスする。
# Logstash設定ファイル配置
cat > data/logstash/pipeline/logstash.conf << 'EOF'
input {
file {
path => "/var/log/nginx/access.log"
start_position => beginning
}
}
filter {
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
remove_field => "message"
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
}
date {
match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"
}
useragent {
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "[nginx][access][geoip]"
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
index => "access_log1"
}
}
EOF
# Logstash 起動
docker run -d --restart always -v $(pwd)/data/logstash/pipeline:/usr/share/logstash/pipeline -v $(pwd)/data/nginx/log:/var/log/nginx --link elasticsearch:elasticsearch --name logstash docker.elastic.co/logstash/logstash-oss:7.0.0
# http://localhost:9200/_cat/count/access_log1 にアクセスしてログ転送が行われていることを確認する。
# Kibana 起動
docker run -d --restart always -p 5601:5601 --link elasticsearch:elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 --name kibana docker.elastic.co/kibana/kibana-oss:7.0.0
# http://localhost:5601 にアクセスし、
# 左サイドメニューの "Dev Tools" を開いて、
# "Console" に `GET /access_log1/_search?pretty=true` を入力、
# 緑色の "▶" をクリックして、右側に Nginx のアクセスログが表示されることを確認する。
学んだこと
- イメージは oss バージョンを使用した。たとえば、
elasticsearch:7.0.0
ではなくelasticsearch-oss:7.0.0
を、logstash:7.0.0
ではなくlogstash-oss:7.0.0
を、kibana:7.0.0
ではなくkibana-oss:7.0.0
を、使用した。- Install Elasticsearch with Docker | Elasticsearch Reference [7.0] | Elastic を見ると、 30 日間のトライアルとある。
- ELK Stack (Elasticsearch, Logstash, Kibana) で ELB のログを分析する を見ると、 OSS バージョンがあるとわかる。
- いろいろ検索してみて、次のページが一番よくまとまっており、指針となりそう。 -> Elasticsearch 6.0.0 の Docker イメージで X-Pack 不要なときのアレ(追記あり) – 休刊 ボルシチは食べ物です。
今後やっていきたいこと
- Docker Compose で動かす
- Docker コンテナのログを ELK スタックで扱えるようにしたい。
- たとえば Laravel で構築したアプリのログを標準出力し、それを ELK スタックで扱えるようにしたい。 The Twelve-Factor App (日本語訳) で述べられていることをしたい。
おわりに
最近ずっと Docker Compose を使っていたため、 Docker コマンドをすっかり忘れてしまいました。それで、次のページには助けられました♪
また、具体的な手順は最終的にたどり着いたものであって、それまでに様々確認、調べながら行ってきました。その中で見てきたページをメモしておきます。
- ELK Stack (Elasticsearch, Logstash, Kibana) で ELB のログを分析する
- Running the Elastic Stack on Docker | Getting Started [7.0] | Elastic
以上です。