GKE+Waker+Twilioでアラートエスカレーションシステムを構築してみた

# 

## 経緯

- zabbixのアラートだけだとメールに気づかないので電話かけさせたいなーという要望が運用側からあったので

## 目指すところ

![waker.jpg](https://qiita-image-store.s3.amazonaws.com/0/88290/0ecfa076-5936-e299-348c-6a508751acdb.jpeg)


1. zabbixがアラート契機でWakerのAPIをキックする
1. WakerがIncidentを作成してTwilioのAPIをキックする
1. Twilioが電話かける
1. 電話出たら1を押してACK返す
  - 返ってこなければ次の人に電話かける
1. TwilioがCallbackでWakerのAPIをキックする
1. WakerがIncidentのステータスをAcknowlegedに変更

### Wakerについて

[アラートエスカレーションシステム"Waker"の紹介 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2015/11/18/170634_1)
[ryotarai/waker: Wake someone up!](https://github.com/ryotarai/waker)

### Twilioについて

[Twilio for KDDI Web Communications | コミュニケーションAPI](https://twilio.kddi-web.com/)

- 電話かけたりSMS送ったりできるAPIを提供してくれているサービス
- ドキュメントやSDKが結構充実しているので使いやすそう
  - 今回はWakerの機能使って利用しているので、実際にコーディングはしてない

## Twilioアカウント作成・設定

- [Twilio for KDDI Web Communications | コミュニケーションAPI](https://twilio.kddi-web.com/) のサインアップボタンから作成
- チュートリアルに従ってTwilio用の電話番号1つ購入
  - Trialの範囲内で購入可能
  - 有料だと月額108円
- コンソールの左の#→Verified Caller IDsと進んで、Twilioからかける先の電話番号を登録
  - Trialだと認証してない番号へは電話かけられないので、登録必須

### Twilioの費用

- [料金 | Twilio for KDDI Web Communications](https://twilio.kddi-web.com/price/)
- 今回のシステムだと、432円/月くらい
  - 電話番号*1: 108円
  - 発信*20: 16.2*20=324円
    - 通話時間が1分以上かかるようならもっとかかる

## Wakerサーバの構築

- 今回はGKEで構築
  - Teraform用のTFファイルとDeploymentとService用のサンプルは以下
    - [waker/gke at master · uu4k/waker](https://github.com/uu4k/waker/tree/master/gke)
  - docker-composeファイルも用意したのでこちらでもOK
    - [waker/docker-compose.yml at master · uu4k/waker](https://github.com/uu4k/waker/blob/master/docker-compose.yml)
- Wakerイメージは自作
  - [uu4k/waker - Docker Hub](https://hub.docker.com/r/uu4k/waker/)
  - 一応イメージ用意されていたが、githubの最新のコード積んでないっぽかったので自分用に色々修正して作成(20171116時点)
  - あとGoogleの認証使わないのでUserを手動で作れるようにしたかったので

## Waker設定

### 1. アラートの通知を行うUserを作成

- メニューのUsers→New Userから作成できる
  - なぜか最初はDeactiveになっているので、ユーザ一覧からActivateする
- 電話番号はあとで記載するNotifierのほうで設定

### 2. Twilio用のNotifier provider(アラートの通知手段)を作成

- メニューのNotifier Providers→New Notifier Provierから作成できる
  - KindをTwilioに設定
  - Settingsに先ほど取得したTwilioの電話番号とAPI用のSIDとTOKENを設定
    - SIDとかはコンソールトップで確認できる
      - [Twilioクラウドコミュニケーション | 音声通話とSMSアプリケーション構築用のWebサービスAPI](https://jp.twilio.com/console)

```yaml
account_sid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
auth_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
from: 810000000000
```

### 3. Notifier(通知先の設定)を作成

- 上のメニューのNotifiers→New Notifierから作成できる
  - UserにNotifierに関連づけたいUserを設定
  - Topicは空で
  - Providerは先ほど作ったNotifier Providerを設定
  - Settingsには送信先の電話番号(to)を設定
    - 平日勤務時間は通知をしないようにも設定できる
  - Notify after secにはエスカレーションされてから何秒後に通知するかの設定
    - エスカレーションされてから=Notifierに紐づいたEscalationが呼ばれてから
      - Escalation側にもインシデント発生してから何秒後に通知するかの設定ができるので、それと合わせて秒数後に通知が行われる
    - 通知前に誰かしらがインシデントをACK(確認済み)にした場合は通知行われない

```yaml
to: "+81xxxxxxxxx"
# 平日9:30~18:30まで通知しない設定
or_conditions:
- japanese_weekday: true
  not_between: 9:30+0900-18:30+0900
- not_japanese_weekday: true
```

### 4. Escalation Series(Escalationの集合)を作成

- 上のメニューのEscalation Series→New Escalation seriesから作成できる
  - とりあえず名前だけでOK

### 5. Escalation(エスカレーションの設定)を作成

- 上のメニューの(ry
  - Escalate toに通知を行うUserを設定
  - Escalate after secにインシデント発生から何秒後にエスカレーションするかを設定
  - Escalation seriesには先ほど作ったのを設定
- エスカレーションルールを入れ替える際には各EscalationのUser設定を変更してあげれば良さそう
  - GoogleCalendar連携使えばカレンダー経由で変更できるが今回は使ってないので

### 6. Topic(アラートを受信するためのエンドポイント)を作成

- 上のメニューの(ry
  - KindはAPIを設定
  - Escalation seriesには先ほど作ったのを設定
- 作成後、EndpointのURLが確認できるのでアラート発生元からここのEndpoint叩いてやればIncidentが作成されて、アラートエスカレーションが行われる
  - 動作確認 `curl -X POST http://xxx.xxx.xxx.xxx:8080/topics/1/mailgun.json  -d "subject=sample&body-plain=sample"`
    - 電話出て1ボタン押すとACKになってエスカレーション止まる。すごい

### 注意

- GoogleCalendar連携は使用しない
  - Oauth2の認証の関係でWakerにドメイン設定してあげないといけなかったので
  - ついては、エスカレーションの順番の変更は手動でやる
    - cronで変更するスクリプト作っても良いかもね

## Zabbix設定

- この辺り参考にしてAPIキックできるようにすれば良さそう(まだやってない)
  - [ZabbixからSlackに通知を送る - Qiita](https://qiita.com/takashyx/items/3c9becf345cd58ca69bf)

## 課題

- WakerへアクセスできるIPを制限かけようと思ったが、TwilioのCallback元のIPが固定化されてないので無理
  - とりあえずBasic認証でお茶にごす方向で
- エスカレーションルールの自動切り替え
  - GoogleCalendar使わずともできる仕組みが欲しい

## 終わりに

- zabbixから電話かけるだけなら良さそうなのが後から見つかった
  - [Zabbix電話通知プラグイン「zabbix-twilio」とは - Zabbix 電話通知プラグイン 「zabbix-twilio」 ドキュメント](http://begood-technology.github.io/zabbix-twilio/index.html)
- ただ、通知方法を切り替えたり、アラートの発生源が複数あるとかの場合はWakerのようなツール使ったほうがいいかもね