Skip to content

Instantly share code, notes, and snippets.

@minazou67
Last active April 4, 2017 17:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minazou67/5eeca1d6e7549cf77b2aa117fdcccd78 to your computer and use it in GitHub Desktop.
Save minazou67/5eeca1d6e7549cf77b2aa117fdcccd78 to your computer and use it in GitHub Desktop.
How to Install ELK Stack + Filebeat on Debian

How to Install ELK Stack + Filebeat on Debian

Debian に ELK Stack + Filebeat をインストールする方法です。
最新版では、すべて Debian パッケージからインストールすることが可能です。
Apache のアクセスログを収集・分析することを前提としています。

Environment

  • Debian jessie 8.6
  • Java SE Runtime Environment 8
  • Elasticsearch 2.4.1
  • Elasticsearch Curator 4.1.2
  • Logstash 2.4.0
  • Kibana 4.6.1
  • Filebeat 1.3.1

Overview

ELK Stack

Name Overview Implementation
Elasticsearch Apache Lucene (全文検索エンジン) を基盤とするスケーラブルな検索エンジン Java
Logstash データの収集と転送のための高機能なツール JRuby
Kibana データの分析と可視化ための Web フロントエンドツール Node.js
Beats データの収集と転送ための軽量なツール Golang

Elasticsearch

Name Overview
Cluster 同じ名前を持つひとつ以上のノードの集合
Node Elasticsearch のインスタンス(クラスターを構成するサーバー)
Index 論理的なデータの保存単位(RDB のデータベースに相当)
Type インデックスに格納するドキュメントの種類(RDB のテーブルに相当)
Document 情報の基本単位(RDB のレコードに相当)
Field ドキュメントが持つ項目(RDB のカラムに相当)
Mapping ドキュメントの個々のフィールドに対する振る舞い定義(RDB のテーブルスキーマに相当)
Analyzer ドキュメントの解析装置(Tokenizer と Filter によって構成される)
Tokenizer 文字列の解析装置(多数の実装が存在)
Filter 文字列の解析前後の加工処理(前処理は Character filters、後処理は Token filters)
Shard インデックスの分割保存場所(分散処理に対応)
Primary Shard 書き込み可能なシャード(デフォルトでは5個のシャードが作成される)
Replica Shard プライマリ・シャードのコピー(別ノードに保存される待機系シャード)

Installation of JRE

Elasticsearch と Logstash の稼働には、Java 7 以上が必要なので最新版の JRE をインストールします。
JRE 8 のインストールには、backports リポジトリの追加が必要です。

$ echo "deb http://http.debian.net/debian jessie-backports main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get install openjdk-8-jre
$ java -version

Installation of Elasticsearch

Elasticsearch をインストールします。

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update
$ sudo apt-get install elasticsearch

パッケージのアップデートに失敗した場合は、apt-transport-https をインストールしてください。

$ sudo apt-get update
E: メソッドドライバ /usr/lib/apt/methods/https が見つかりません。
N: パッケージ apt-transport-https はインストールされていますか?

$ sudo apt-get install apt-transport-https

OS 起動時に自動起動するように設定します。

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable elasticsearch.service

Setting of Elasticsearch

Elasticsearch の設定ファイルを編集します。
クラスタ名、ノード名の設定は任意です。 メモリがスワップしないように JVM 起動時にメモリを確保するようにし、外部から HTTP 接続できるようにネットワークホストを変更します。

$ sudo vi /etc/elasticsearch/elasticsearch.yml
cluster.name: elasticsearch
node.name: ${HOSTNAME}
bootstrap.memory_lock: true
network.host: 0.0.0.0

もうひとつの設定ファイルでは、Elasticsearch が使用する Java のヒープサイズを設定します。

$ sudo vi /etc/default/elasticsearch
ES_HEAP_SIZE=2g

サービスを再起動し、稼働状態を確認します。

$ sudo service elasticsearch restart
$ curl localhost:9200
{
  "name" : "debian86",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "_pcf0vKBSEuJYuFwHycXSw",
  "version" : {
    "number" : "2.4.1",
    "build_hash" : "c67dc32e24162035d18d6fe1e952c4cbcbe79d16",
    "build_timestamp" : "2016-09-27T18:57:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.2"
  },
  "tagline" : "You Know, for Search"
}

Registration of the Index template

Apache のアクセスログ用のインデックステンプレートを作成します。
ログデータなどは日付毎にインデックス化されることが多いため、インデックステンプレートの登録が必要になります。
template の値にマッチする Index が作成されると、このテンプレートが自動で適用されます。
下記の例では、refresh_interval を10秒に変更することにより負荷を軽減し、すべての string 型の項目を解析の対象から外しています。

$ vi ~/apache_template.json
{
  "template": "apache-*",
  "settings": {
    "index.refresh_interval": "5s"
  },
  "mappings": {
    "_default_": {
      "dynamic_templates": [ {
        "strings": {
          "match": "*",
          "match_mapping_type": "string",
          "mapping": {
            "type": "{dynamic_type}",
            "index" : "not_analyzed",
            "omit_norms": true,
            "ignore_above": 256
          }
        }
      } ],
      "properties": {
        "@version": {
          "type": "string",
          "index": "not_analyzed"
        },
        "bytes": {
          "type": "integer"
        },
        "clientip": {
          "type": "ip"
        },
        "response": {
          "type": "short"
        },
        "timestamp": {
          "type": "date",
          "format": "dd/MMM/YYYY:HH:mm:ss Z"
        }
      }
    }
  }
}

作成したインデックステンプレートを Elasticsearch に登録します。

$ curl -XPUT localhost:9200/_template/apache_template?pretty -d "`cat ~/apache_template.json`"

Elasticsearch に登録されているインデックステンプレートを確認します。

$ curl -XGET localhost:9200/_template/?pretty

Installation of elasticsearch-head

Elasticsearch cluster のための Web フロントエンドである elasticsearch-head をインストールします。
Web ブラウザ上でクラスターやノード、インデックスの情報が簡単に閲覧でき、検索クエリの発行などが可能です。

$ cd /usr/share/elasticsearch
$ sudo bin/plugin install mobz/elasticsearch-head

ブラウザから下記のURLにアクセスし、正常に稼働していることを確認します。

http://domain:9200/_plugin/head/

Installation of Elasticsearch Curator

Elasticsearch をインストールしたサーバーに Elasticsearch Curator をインストールします。
Elasticsearch Curator は、Elasticsearch のインデックスやスナップショットの管理ツールです。
このツールを使用して、定期的に古いインデックスをクローズしたり削除したりします。

$ echo "deb https://packages.elastic.co/curator/4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install elasticsearch-curator

Setting of Elasticsearch Curator

実行ユーザーのデフォルトパスに設定ファイルを作成します。

$ mkdir ~/.curator
$ vi ~/.curator/curator.yml
client:
  hosts:
    - 127.0.0.1
  port: 9200
  url_prefix:
  use_ssl: False
  certificate:
  client_cert:
  client_key:
  ssl_no_validate: False
  http_auth:
  timeout: 30
  master_only: False

logging:
  loglevel: INFO
  logfile:
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

任意の場所にアクションファイルを作成します。
下記の例では、apache- プリフィックスの古いインデックスを削除するアクションを定義しています。

$ vi ~/.curator/action.yml
actions:
  1:
    action: delete_indices
    description: "Delete old indices of apache- prefix"
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: apache-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 90
      exclude:

作成したアクションを試運転します。

$ curator --dry-run ~/.curator/action.yml
2016-10-12 21:24:39,670 INFO      Preparing Action ID: 1, "delete_indices"
2016-10-12 21:24:39,677 INFO      Trying Action ID: 1, "delete_indices": Delete old indices of apache- prefix
2016-10-12 21:24:39,712 INFO      DRY-RUN MODE.  No changes will be made.
2016-10-12 21:24:39,712 INFO      (CLOSED) indices may be shown that may not be acted on by action "delete_indices".
2016-10-12 21:24:39,713 INFO      DRY-RUN: delete_indices: apache-2016.07.10 with arguments: {}
2016-10-12 21:24:39,713 INFO      DRY-RUN: delete_indices: apache-2016.07.11 with arguments: {}
2016-10-12 21:24:39,713 INFO      Action ID: 1, "delete_indices" completed.
2016-10-12 21:24:39,713 INFO      Job completed.

config オプションで設定ファイルのパスを指定することも可能です。

$ curator --dry-run --config ~/.curator/curator.yml  ~/.curator/action.yml

crontab でジョブをスケジューリングします。

$ sudo crontab -e
0 5 * * * curator ~/.curator/action.yml > /dev/null 2>&1

設定を反映させるため cron を再起動します。

$ sudo service cron restart

Installation of Logstash

Elasticsearch をインストールしたサーバーに Logstash をインストールします。

$ echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install logstash

OS 起動時に自動起動するように設定します。

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable logstash.service

Setting of Logstash

Logstash の設定ファイルを編集します。
メッセージのフォーマットやインデックス名などは必要に応じて変更してください。
date を指定することで @timestamp の値を指定した項目の値に設定可能です。デフォルトではデータを読み込んだ日付がセットされます。 また、outputindexapache-%{+YYYY.MM.dd} にすることにより、日毎に Index が作成されるようにします。

$ sudo vi /etc/logstash/conf.d/01-beats.conf
input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
    locale => en
  }
  useragent {
    source => "agent"
    target => "useragent"
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "apache-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

設定ファイルに問題がないかチェックした後、サービスを再起動し、稼働状態を確認します。

$ sudo service logstash configtest
Configuration OK
$ sudo service logstash restart
$ sudo service logstash status

パッケージに同梱されている Logstash plugins は、下記のコマンドで簡単に確認できます。

$ /opt/logstash/bin/logstash-plugin list --verbose
logstash-codec-collectd (2.0.4)
logstash-codec-dots (2.0.4)
logstash-codec-edn (2.0.4)
logstash-codec-edn_lines (2.0.4)
...

Installation of Kibana

Elasticsearch をインストールしたサーバーに Kibana をインストールします。
Kibana 4 には、HTTP サーバがバンドルされているため、別途インストールする必要はありません。

$ echo "deb https://packages.elastic.co/kibana/4.6/debian stable main" | sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install kibana

OS 起動時に自動起動するように設定します。

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable kibana.service

サービスを起動し、稼働状態を確認します。

$ sudo service kibana start
$ sudo service kibana status

ブラウザから下記のURLにアクセスし、正常に稼働していることを確認します。

http://domain:5601/

Installation of Filebeat

Apache が稼働しているログ収集元のサーバーに Filebeat をインストールします。
パッケージのアップデートに失敗した場合は、apt-transport-https をインストールしてください。
Filebeat の稼働には JRE は必要ありません。

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://packages.elastic.co/beats/apt stable main" |  sudo tee -a /etc/apt/sources.list.d/sources.list
$ sudo apt-get update && sudo apt-get install filebeat

OS 起動時に自動起動するように設定します。

$ sudo /bin/systemctl daemon-reload
$ sudo /bin/systemctl enable filebeat.service

Setting of Filebeat

Filebeat の設定ファイルを編集します。
収集するログファイルのパスを任意のパスに変更します。 また、デフォルトでは Elasticsearch にアウトプットするようになっている為、Logstash にアウトプットするように変更します。

$ sudo vi /etc/filebeat/filebeat.yml
############################# Filebeat ######################################
filebeat:
  # List of prospectors to fetch data.
  prospectors:
    paths:
      - /var/log/apache2/access.log

    document_type: access-log

############################# Output ########################################
output:
  ### Elasticsearch as output
  #elasticsearch:
    #hosts: ["localhost:9200"]

  ### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["XXX.XXX.XXX.XXX:5044"]

サービスを再起動し、稼働状態を確認します。

$ sudo service filebeat restart
$ sudo service filebeat status
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment