faultline-jsを使ってJavaScriptのエラートラッキングにfaultlineを利用する

## faultlineとは

オープンソースのエラートラッキングツールです。

- https://github.com/faultline/faultline
- [サーバーレスアーキテクチャなエラートラッキングツール faultline](http://k1low.hatenablog.com/entry/faultline)

## faultline-js

JavaScriptのエラートラッキングにfaultlineを利用するときには、[faultline-js](https://github.com/faultline/faultline-js) が利用できます。

### インストール

Webpack等を利用している場合はnpmでインストールしてください

```
$ npm install faultline-js --save
```

レガシーな感じで設置する場合は `dest/client.min.js` と `dest/client.min.map`  を設置してください。

```html
<script src="path/to/faultline-js/dist/client.min.js"></script>
```

### 使い方

`<head>` などで以下のようなコードを読みこめばOKです。

```js
var faultline = new faultlineJs.Client({
                  project: 'faultline-js', 
                  apiKey: 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX', // clientApiKeyを設定してください
                  endpoint: 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0',
                  notifications: [
                    {
                      type: 'slack',
                      endpoint: 'https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq',
                      channel: '#random',
                      username: 'faultline-notify',
                      notifyInterval: 10,
                      threshold: 1,
                      timezone: 'Asia/Tokyo'
                    }
                  ]
                });
```

Webpackなどを利用しているのであれば

```js
var faultlineJs = require('faultline-js');
var faultline = new faultlineJs({
                  project: 'faultline-js', 
                  apiKey: 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX', // clientApiKeyを設定してください
                  endpoint: 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0',
                  notifications: [
                    {
                      type: 'slack',
                      endpoint: 'https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq',
                      channel: '#random',
                      username: 'faultline-notify',
                      notifyInterval: 10,
                      threshold: 1,
                      timezone: 'Asia/Tokyo'
                    }
                  ]
                });
```

などでもOKです。

## `notifications` の設定を暗号化する

GitHub Issueの連携にはGitHubのAPI Tokenが必要です。

SlackのIncoming WebhookのURLならまだしも、GitHubのAPI Tokenが外部に漏れるのはかなりマズいです。

そのため [faultline](https://github.com/faultline/faultline) v0.7.0 からKMSによる暗号/復号化機構を搭載しました。
（config.yml で `useKms` を true にすることで利用可能です）

### 暗号化

faultlineをデプロイしたAWSのprofileで、 aws-cliの `aws kms encrypt` でnotificationsの設定を暗号化します。

例えば、先ほどのSlackの設定を暗号化するには

```sh
$ AWS_PROFILE=XXxxXXX aws kms encrypt --key-id alias/faultline --plaintext '{"type":"slack","endpoint":"https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq","channel":"#random","username":"faultline-notify","notifyInterval":10,"threshold":1}' --query CiphertextBlob --output text --region ap-northeast-1
```

で暗号化できます。

また、faultline v0.8.0 からAPIに `/encrypt` を提供していますので、AWSのprofileを共有せずにfautlineの `apiKey` のみ　( `clientApiKey` ではありません ) での暗号化も可能です。

基本的にAPIを利用するほうが簡単で良いでしょう。

```sh
$ curl -X POST -H "x-api-key:0123456789012345678901234567890" -H "Content-Type: application/json" https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0/encrypt -d '{"type":"slack","endpoint":"https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq","channel":"#random","username":"faultline-notify","notifyInterval":10,"threshold":1}'
{
  "status": "success",
  "encrypted": "VJrcSNSvM/KxZ3IIa/+aaEZMfYQgKrGqmGwzgAAASYwggEiBgkqhkiG9w0BBwagggETMIIBDwIBADCCAQCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMkrC8qGdnuIcfRlX9AgEQgIHaanVWXANlr/QkgYFIpSRy5QLmJohU4ltwGKwOFA/uRZfKw3kAMCuH7H/QJJyVA0mxzqMnQT/WUf6nG2AckhPQ4fTmgQgpXzw7jF4ToUvXL49a"
}
```

取得した暗号化されたテキストをnotificationsに追加するだけで、通常通り利用できます。

```js
var faultline = new faultlineJs.Client({
                  project: 'faultline-js', 
                  apiKey: 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX', // clientApiKeyを設定してください
                  endpoint: 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0',
                  notifications: [
                    'VJrcSNSvM/KxZ3IIa/+aaEZMfYQgKrGqmGwzgAAASYwggEiBgkqhkiG9w0BBwagggETMIIBDwIBADCCAQCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMkrC8qGdnuIcfRlX9AgEQgIHaanVWXANlr/QkgYFIpSRy5QLmJohU4ltwGKwOFA/uRZfKw3kAMCuH7H/QJJyVA0mxzqMnQT/WUf6nG2AckhPQ4fTmgQgpXzw7jF4ToUvXL49a'
                  ]
                });
```

簡単ですね！

## 結果

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/808/5b40a9f0-7bab-aa2d-78c5-d0cb8446f056.png)


というわけでJavaScriptでも安全にfaultlineが使えますよ！