FastlyとDatadog Log Managementを連携する


# はじめに
[Fastly](https://www.fastly.com/)には[Remote Log Streaming](https://docs.fastly.com/ja/guides/streaming-logs/setting-up-remote-log-streaming.html)という機能があり、CDNの莫大なログをAmazon S3やGoogle Cloud Storageに置いて長期保存したり、ログ管理サービスで **リアルタイムに集約・分析** することが可能です。

後者のリアルタイムな分析では、[logentries](https://logentries.com/)を利用するのが一般的かもしれません。
しかし、DatadogにはFastlyとのインテグレーションがあり、ログも[Datadog Log Management](https://docs.datadoghq.com/logs/)でまとめると相性が良く非常に便利でした。
本記事ではその設定をシェアします。

## 注意事項
本記事執筆時点（2018/06/11）では、FastlyとDatadog Log Managementのインテグレーションは、公式なものが存在しません。そのため、特殊な設定方法で接続したことを本記事にメモしています。
しかし、どちらも非常に人気なサービスであり、 **明日にでも公式なものがリリースされるかもしれません。** その場合は、本記事を無視して公式なものを利用しましょう。

# 設定方法
まどろっこしい書き方をしていますが、それは非公式な接続方法のためです。
なるべく手順を自分で追って、最新のオフィシャルな情報にあたってください。

## Datadog側で情報確認
予めDatadogでLog Management(以下、**`Logs`**)を契約しておきましょう。
本記事執筆時点ではプレビュー扱いなので、ちょっと手間がかかります。

Fastlyと連携するにあたり、以下の情報を入手します。

* APIKey
* TLS接続Endpoint
* TLS公開鍵

### APIKeyの入手
Logsにアクセスできるようになると、管理画面の`Logs -> Docs`より、接続方法のドキュメントが表示されるようになります。
`Other -> rsyslog` と辿り、rsyslog用の設定を表示します。
![datadog-log-management-docs.png](https://qiita-image-store.s3.amazonaws.com/0/82212/64d4ea16-8746-1422-3d4f-f47cabb40835.png)

図の項番3のあたりに注目しましょう。設定例が表示されています。

```text:表示される設定例
$template DatadogFormat,"xxxxxxxxxxxxxx <%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% - - - %msg%\n"

*.* @@intake.logs.datadoghq.com:10514;DatadogFormat
```

上記で「`xxxxxxxxxxxxxx`」と潰しているのは、**APIKey**です。
**この情報が必要ですので、メモしましょう。**

なお、上記例では接続先も例示されていますが、TLS接続したいので無視します。

### TLS接続Endpoint情報を取得

更に、上の画像では見切れている項番5のあたりに「`(Optional) Use TLS Encryption`」というドキュメントがあります。こちらを開きましょう。
その中の`Rsyslog`という項目に移動します。

リンク切れするかもしれませんが、直接リンクは[こちら](https://docs.datadoghq.com/logs/log_collection/rsyslog/)です。

そのページに、TLSの接続先情報が設定例で書かれています。
2018/06/11の時点では以下のように記されています。

```text:接続先
intake.logs.datadoghq.com:10516
```

### TLS公開鍵情報を取得
TLS暗号で送信するにあたり、公開鍵情報が必要です。
先ほどのドキュメントを辿ると、`public key for TLS encryption`というリンクがありますので、それをダウンロードしましょう。
いつまで機能するかわかりませんが、[直接リンクはこちら](https://docs.datadoghq.com/crt/intake.logs.datadoghq.com.crt)です。

### (Option) Pipelinesの設定
他の用途で既にLogsを利用している場合は、この時点でLog PipelinesをFastlyが送ってくるデータを推定して設定しておいたほうが良いでしょう。
本記事では私の設定メモということで、あとで設定しています。

## Fastly側でRemote Log Streamingを設定
Fastlyの対象のドメインの設定メニューより、`Logging`を選びます。
Datadogでrsyslogの設定を見ていたのでお分かりと思いますが、`Syslog logging endpoint`を選択します。

設定には以下のように入力します。

* Log format: 下記
* Syslog address: `intake.logs.datadoghq.com` : `10516` (TLSのドキュメントに書いてあったもの)
* Token: 先ほど入手したAPIKeyの後に **半角スペースを1つ付ける**
* TLS: `Yes`
* TLS hostname: `*.logs.datadoghq.com`
* TLS CA certificate: 先ほど入手したTLS公開鍵
* Advanced options: `Log line format = Classic`

**最重要ポイントは、Tokenです。**
**<font color=#F00>半角スペース</font>** を忘れないようにしましょう。(例: 「`xxxxxxxxxxxxxx `」)

以下はLog Format例です。カンマ区切りのラベル付きフォーマットにしています。
Fastly(varnish)はログに様々な情報を出力できますので、項目は適時設定しましょう。

```text:LogFormat例
timestamp:%{now.sec}V,client_ip:"%{req.http.Fastly-Client-IP}V",country:"%{geoip.country_code}V",status:%{resp.status}V,method:"%{req.request}V",host:"%{req.http.host}V",url:"%{req.url}V",ua:"%{User-Agent}i",fastly_region:"%{server.region}V",cache_state:"%{fastly_info.state}V",obj_ttl:%{obj.ttl}V,obj_grace:%{obj.grace}V,elapsed:%{time.elapsed.msec}V,size:%{resp.bytes_written}V,conn_status:"%X",referer:"%{req.http.referer}V"
```

以上で、Fastly側の設定は完了です。

### Datadog側でLog Pipelinesを設定
上記のログが転送されるのを確認したら、Pipelinesを設定します。
目的は、先ほどのカンマ区切りのログをパースすることです。

Grok Parserを以下のように設定します。

```text:GrokParser
Fastly_Log_Rule %{data::keyvalue(":", ",")}
```

コロン区切りのKeyValue形式のデータが、カンマ区切りで流れてくる、という設定値です。

他の用途でLogsを利用している場合、**入力条件もしっかり設定する必要がある** でしょう。
また、利便性のためにその後に`User-Agent Parser`や`Url Parser`を設定するのもお勧めですが、ここでは割愛します。

# 確認
といっても、単にFastlyにアクセスするだけです。
設定が正しければどんどんDatadog Logsにログが流れ込みます。
※ 本物のログなので、ここでは例をお見せできません。

Pipelinesが正しく機能すれば、ログは以下のように綺麗にパースされていることでしょう。

![LogExample.png](https://qiita-image-store.s3.amazonaws.com/0/82212/8053a181-b610-6e4c-f0cf-dbff36e31d96.png)

Attributeを`facet`に追加すれば、Logsはどんどん統計してくれます。
Datadogのモニターも設定すれば、キャッシュヒット率や異常なアクセスをトリガーにアラートを上げることもできます。

# 最後に
ということで、FastlyとDatadog Log Managementの強引な連携を紹介しました。
繰り返しになりますが、きっとオフィシャルな連携がリリースされるので、そのときはこの手順を無視してオフィシャルな設定を利用しましょう。