Apacheのアクセスログを、FluentdでtailしてElasticsearchに放り込む

# やりたいこと

* Apacheのアクセスログを、可視化・分析するための環境を作りたい

ということをお題に、

* ApacheのアクセスログをFluentdでtailして
* Elasticsearchに放り込み、Kibanaで参照可能な状態にする

というところまでをやってみます。

# 環境
Ubuntu Linux 18.04 LTSで行っています。

```shell
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```

なお、サーバーについては

* ApacheおよびFluentd … `172.17.0.2`
* ElasticsearchおよびKibana … `172.17.0.3`

で稼働させるものとします。

# Apacheのインストール
なにはともあれ、まずはApacheのインストール、それから起動。

```shell
$ sudo apt install apache2
$ sudo service apache2 start
```

インストールされたApacheのバージョン。

```shell
$ /usr/sbin/apache2 -v       
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2018-10-10T18:59:25
```

表示するコンテンツがないので、とりあえずApacheのドキュメントを放り込んでみます。

```shell
$ cd /var/www/html
$ sudo -E wget https://archive.apache.org/dist/httpd/docs/httpd-docs-2.4.33.ja.zip
$ sudo unzip httpd-docs-2.4.33.ja.zip
$ sudo mv httpd-docs-2.4.33.ja/* ./.
```

選択しているApacheのバージョンは、`apt`でインストールしたものよりも、若干新しいですが…。

![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/309669/5508d89b-c159-4b00-65d1-9403c85ce313.png)

tail対象にする、アクセスログの確認。

```shell
$ sudo tail -f /var/log/apache2/access.log
172.17.0.1 - - [11/Dec/2018:11:52:14 +0000] "GET /getting-started.html HTTP/1.1" 200 4746 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:16 +0000] "GET /filter.html HTTP/1.1" 200 2425 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:51 +0000] "GET /misc/security_tips.html HTTP/1.1" 200 7814 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:53 +0000] "GET /server-wide.html HTTP/1.1" 200 3075 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:01 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2839 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:02 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2838 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:03 +0000] "GET /vhosts/fd-limits.html HTTP/1.1" 200 3281 "http://172.17.0.2/vhosts/index.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
```

# Fluentdのインストール
続いて、Fluentdをインストールします。

こちらを参照して、実行。

[Installing Fluentd Using deb Package](https://docs.fluentd.org/v1.0/articles/install-by-deb)

```shell
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
```

起動。

```shell
$ sudo service td-agent start
```

設定は後でやりましょう。

# ElasticsearchとKibanaのインストール

続いて、ElasticsearchとKibanaをインストールして起動します。

```shell
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
$ tar xf elasticsearch-6.5.2.tar.gz
$ cd elasticsearch-6.5.2
$ vim config/elasticsearch.yml     # 設定変更
$ bin/elasticsearch
```

設定はほぼデフォルトですが、外部からのネットワークアクセスの許可と、Single Node設定にします。

config/elasticsearch.yml

```yaml
network.host: 0.0.0.0
discovery.type: "single-node"
```

続いて、Kibanaのインストールと起動。

```shell
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.2-linux-x86_64.tar.gz
$ tar xf kibana-6.5.2-linux-x86_64.tar.gz
$ cd kibana-6.5.2-linux-x86_64
$ vim config/kibana.yml      # 設定変更
$ bin/kibana
```

Kibanaについても、外部からアクセスできるように設定します。

config/kibana.yml

```yaml
server.host: "0.0.0.0"
```

# Fluentdの設定をする
では、Fluentdを設定していきましょう。

Apacheのアクセスログを、Elasticsearchに放り込むように構成します。

まず最初に、インストールしたApacheのデフォルトのログのパーミッションでは、Fluentdから読み込めないため権限変更…。

```shell
$ sudo chmod o+rx /var/log/apache2
$ sudo chmod o+r /var/log/apache2/*
```

では、Fluentdの設定を行います。ほぼドキュメント通りですが、tail Input PluginとElasticsearch Output Pluginを設定します。

* [tail Input Plugin](https://docs.fluentd.org/v1.0/articles/in_tail)
* [Elasticsearch Output Plugin](https://docs.fluentd.org/v1.0/articles/out_elasticsearch)

/etc/td-agent/td-agent.conf

```
<source>
  @type tail
  path /var/log/apache2/access.log
  pos_file /var/log/td-agent/apache2-access.log.pos
  tag apache2.access
  format apache2
</source>

<match apache2.access>
  @type elasticsearch
  host 172.17.0.3
  port 9200
  logstash_format true
</match>
```

Apacheのアクセスログの読み込みの設定はこちらで、ファイル`/var/log/apache2/access.log`をtailし、読み込んだポジションを`/var/log/td-agent/apache2-access.log.pos`に保存、ファイルフォーマットは`apache2`で設定します。

```
<source>
  @type tail
  path /var/log/apache2/access.log
  pos_file /var/log/td-agent/apache2-access.log.pos
  tag apache2.access
  format apache2
</source>
```

Apacheのアクセスログに関しては、パースがプラグインとして提供されていて良いですね。

[apache2 Parser Plugin](https://docs.fluentd.org/v1.0/articles/parser_apache2)

読み込んだ内容は、「apache2.access」タグを付与します。

そして、タグ「apache2.access」にマッチしたら、Elasticsearchに放り込むようにOutput Pluginを設定します。

```
<match apache2.access>
  @type elasticsearch
  host 172.17.0.3
  port 9200
  logstash_format true
</match>
```

[Elasticsearch Output Plugin](https://docs.fluentd.org/v1.0/articles/out_elasticsearch)

接続先とポートは見たままですが、`logstash_format`というのは取り込む時のElasticsearchのインデックス名を`logstash-%Y.%m.%d`にするかどうかですね（`true`の場合、`logstash-%Y.%m.%d`となります）。

このように、Fluentdはデータの取り込みやパース、変換、出力をプラグインを使用して行います。

どのようなプラグインがあるかは、ドキュメントを参照しましょう。

* [Input Plugins](https://docs.fluentd.org/v1.0/articles/input-plugin-overview)
* [Output Plugins](https://docs.fluentd.org/v1.0/articles/output-plugin-overview)
* [Filter Plugins](https://docs.fluentd.org/v1.0/articles/filter-plugin-overview)
* [Parser Plugins](https://docs.fluentd.org/v1.0/articles/parser-plugin-overview)
* [Formatter Plugins](https://docs.fluentd.org/v1.0/articles/formatter-plugin-overview)
* [Buffer Plugins](https://docs.fluentd.org/v1.0/articles/buffer-plugin-overview)
* [Storage Plugins](https://docs.fluentd.org/v1.0/articles/storage-plugin-overview)

ここまで設定したら、Fluentdを再起動します。

```shell
$ sudo service td-agent restart
```

Apacheで公開しているコンテンツにアクセスすると、

![範囲を選択_005.png](https://qiita-image-store.s3.amazonaws.com/0/309669/024ed491-b69a-ea05-367a-5f5c9c27f17d.png)

ポジションファイルが更新されていきます。

```shell
/var/log/td-agent/apache2-access.log.pos 
/var/log/apache2/access.log	000000000000122b	000000000024981e
```

すると、Elasticsearchにデータが入るようになるので、KibanaでDiscoveryの設定を行います。データが入るように設定できていれば、アクセスログが出力されて少しすると、`logstash-〜`というインデックスが参照可能になっているはずです。

![範囲を選択_002.png](https://qiita-image-store.s3.amazonaws.com/0/309669/53f1c702-82cc-3642-9c94-ffa8aad0f3b1.png)

あとは、これを登録して

![範囲を選択_003.png](https://qiita-image-store.s3.amazonaws.com/0/309669/5c9ccb04-0079-acad-7ab3-da6b4b6a7801.png)

![範囲を選択_004.png](https://qiita-image-store.s3.amazonaws.com/0/309669/262cf359-7bf3-64aa-ba0b-92d9fbf66166.png)

参照できるようにすればOKです。

![範囲を選択_006.png](https://qiita-image-store.s3.amazonaws.com/0/309669/870ebd76-981e-a6b0-1b73-3fbe4ff197ea.png)

ここから先は、Kibanaで好きなようにVisualizeしましょう。