fastlyのログをAWS Kibanaで可視化する

## 1. 概要
### 1.1. 構成図
![スクリーンショット 2018-06-08 15.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/148868/350b54f5-24a9-b178-efed-f3fd13846d9f.png)
### 1.2. 各構成について
#### (1) fastly
* Syslog形式でログを出力<br />
参考⇒[Log streaming: Syslog](https://docs.fastly.com/guides/streaming-logs/log-streaming-syslog)
* ログフォーマットの設定<br />
```
%h %t "%r" %>s "%{Referer}i" "%{User-Agent}i"
```<br />
参考⇒[Custom log formats](https://docs.fastly.com/guides/streaming-logs/custom-log-formats.html)

#### (2) EC2
* rsyslogd で fastlyからのsyslogメッセージを受け取る
* td-agent(fluentd) で json フォーマットに変換してから Kinesis Firehose へ送る

#### (3) Kinesis Firehose
* 東京リージョンに作成する
* 日次でインデックスをローテーションする

#### (4) Amazon Elasticsearch
* 東京リージョンに作成する
* 古いインデックスの削除は、削除バッチを自前で作成して動かす

## 2. 各構成の作成、設定
### 2.1. Amazon Elasticsearch Service
#### ・ドメインの作成（例）

>リージョン
>>東京

> ドメインの定義
>> Elasticsearchドメイン名：fastly
>> Elasticsearchのバージョン：6.2

> クラスターの設定
>> ノードの設定
>>> インスタンス数：1
>>> インスタンスタイプ：m4.large.elasticsearch
>>> 専用マスターの有効化：チェックしない
>>> ゾーン対応の有効化：チェックしない

>> ストレージ設定
>>> ストレージタイプ：EBS
>>> EBSボリュームタイプ：汎用（SSD）
>>> EBSボリュームサイズ：100GB

### 2.2. Amazon Kinesis Firehose
#### ・Delivery stream の作成（例）
>リージョン
>>東京

>New delivery stream
>>Deliery stream name：fastly-accesslog

>Choose source
>>Direct PUT or other sources

>Proccess records
>>Record transformation：Disabled
>>Record format conversion：Disabled

>Select destination
>>Destination：Amazon Elasticsearch Service
>>Amazon Elasticsearch Service destination
>>>Domain：fastly
>>>Index：fastly-accesslog
>>>Index rotation：Every day
>>>Type：fastly-accesslog
>>>Retry duration：300 seconds

### 2.3. EC2
#### ・EC2インスタンスの作成（例）
>OS
>>Amazon Linux AMI release 2018.03

>インスタンスタイプ
>>c5.large<br />・・・CPU、Memoryの他に、Disk I/O やネットワーク帯域も考慮する

>EBSタイプ
>>100GB<br />・・・fastlyのアクセスログをsyslog経由でファイルに出力して、それをfluentdで読み込ませるので、１日分の無圧縮のアクセスログサイズと、１週間分の圧縮されたアクセスログが保存できるくらいの容量

#### ・EIPを新規に作成して割り当てる

#### ・セキュリティグループの作成
>fastlyから514番ポートへの接続を許可する。<br />
>>fastlyのIPアドレス一覧にあるすべてのIPアドレスからの514番接続を許可する
>>https://api.fastly.com/public-ip-list

#### ・rsyslogd の設定（例）
>インストール（不要）
>>デフォルトでインストールされている rsyslogd を使う

>fastly用の設定を入れる
>>/etc/rsyslog.conf<br /><pre>
〜
＃ Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
〜
＃ Log anything (except mail) of level info or higher.
＃ Don't log private authentication messages!
*.info;!local0.info;mail.none;authpriv.none;cron.none   /var/log/messages
〜
＃ fastly accessl log
local0.info                                             /var/log/fastly/access.log
</pre>
・fastly からの syslog メッセージのプロトコルは TCP という仕様のため、TCPを有効にする
・fastlyから送られてくる syslog メッセージの facility は local0 で、serverity は info
・デフォルトの設定では、/var/log/messages にも出力されてしまうため、「!local0.info」を追加しておく

> rsyslogd 再起動

#### ・logrotate の設定（例）
>fastly用の設定を入れる
>>>/etc/logrotate.d/fastly<br />
/var/log/fastly/access.log
{
    daily
    rotate 7
    create
    missingok
    notifempty
    dateext
    compress
    create 0644 root root
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
</pre>

#### ・td-agent の設定（例）
>インストール
>>＃ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
>>＃ service td-agent start
>>＃ chkconfig td-agent on

>プラグインインストール
>>＃ td-agent-gem install fluent-plugin-kinesis
>>＃ td-agent-gem list 2>/dev/null | grep fluent-plugin-kinesis
>>fluent-plugin-kinesis (2.1.1)

>td-agent 設定
>/etc/td-agent/td-agent.conf

```
<source>
  type         tail
  path         /var/log/fastly/access.log
  pos_file     /var/log/td-agent/fastly-accesslog.pos
  format 	/^2\d{3}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z\scache-[a-z]+\d+\sfastly-log-collect-rsyslog\[\d+\]: (?<host>[^ ]+) \[(?<time>[^\]]+)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
  time_format  %d/%b/%Y:%H:%M:%S %z
  tag          file.output.fastly
  tag          record.reformer.fastly
</source>
<match record.reformer.fastly>
  type record_reformer
  enable_ruby true
  <record>
    @timestamp ${time.strftime('%Y-%m-%dT%H:%M:%S%z')}
  </record>
  tag          firehose.output.fastly
</match>
<match firehose.output.fastly>
  type kinesis_firehose
  delivery_stream_name fastly-accesslog
  region ap-northeast-1
  flush_interval 1
  buffer_chunk_limit 1m
  try_flush_interval 0.1
  queued_chunk_flush_interval 0.01
  num_threads 15
</match>
```
> td-agent 再起動

・インデックス削除バッチ（例）
>/home/ec2-user/scripts/elasticsearch/delete-indices.sh

```
#!/bin/bash
ESDOMAIN="search-fastly-**************************.ap-northeast-1.es.amazonaws.com"
INDEXNAME=(
    "fastly-accesslog-"
)
DATA=`date -d '7 days ago' +"%Y-%m-%d"`
for INDEX in ${INDEXNAME[@]}; do
    echo "######################################################################"
    echo "#"
    echo "#  ${INDEX}${DATA}"
    echo "#"
    echo "######################################################################"
    curl -XDELETE https://${ESDOMAIN}/${INDEX}${DATA}
    echo ""
done
echo "######################################################################"
echo "######################################################################"
echo "##"
echo "##  curl -XGET https://${ESDOMAIN}/_aliases?pretty"
echo "##"
echo "######################################################################"
echo "######################################################################"
curl -XGET 'https://search-fastly-**************************.ap-northeast-1.es.amazonaws.com/_aliases?pretty' | grep -v '}' | sort
exit
```
>cron設定

```
30 21 * * * /home/ec2-user/scripts/elasticsearch/delete-indices.sh
```

### 2.4. fastly
・Logging設定
>logging endpoint
>>Syslog

>Log format	
>>%h %t "%r" %>s "%{Referer}i" "%{User-Agent}i"

>Address
>>EC2のEIP:514

>Log line format
>>Classic


## 3. Kibana
### 3.1. インデックスパターンの作成
Amazon Elasticsearch Service のダッシュボードから、作成したドメインの設定ページに行き、Kibanaのリンクに飛ぶ
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148868/7460e3d9-618c-8da7-d7b6-9fe4d8cb0c6d.png)
↓
**Management ⇒ Index Patterns**
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148868/b7643575-2efd-6328-71fb-024601e479fd.png)
↓
**Create Index**
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148868/96422c03-1dae-8252-4b5d-fe3a0ef14e4a.png)
↓
**Index pattern の欄に "fastly-accesslog-*" を入力する**
↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148868/44e579d4-bbfe-8349-0445-c599b3ea1153.png)
↓
**Time Filter field name の欄から 「@timestamp」を選択する**
↓
・・・
うーむ、、Kibanaのグラフ作成手順載せようとしたら、画像がこれ以上アップロードできないらしい。。