Twilio+CloudFunctions+Stackdriverで障害アラートを電話で通知してみる

# はじめに(モチベーション)
商用環境だけど、外部委託とかの大した監視いらないからURLの疎通が出来なかったらアラート飛ばしたいってときがある。
イベントログとかパフォーマンスとかどうでもいいから、サービスが本当に使えなくなったときだけアラートがほしい。

かといって、深夜にslackとかメールで気づけるわけがないから、電話がほしい。
でも、stackdriverとかだとメールとかslackにしか通知できない。
URLの疎通が出来なかったら電話かけてきてほしい。

## twilio(トゥイリオ)って何？
webAPIによって自動で電話をかけたり、SMS送ったりするやつ。

https://twilio.kddi-web.com/

本社はアメリカのtwilio社がやっていて、日本ではKDDIが代理店としてサービスを提供している。
用途としては、自動の音声案内とかにも使われてたりする。

料金はざっくり以下となる。がトライアルで500円分が最初にもらえる。

* 電話番号 108円/月
* 発信(携帯宛) 16.2円/分
* 着信(0120/0800宛) 21.6/分 

詳しくはWebでhttps://twilio.kddi-web.com/price/

## 今回試すこと
twilioとgoogle cloud functionsを使って、サーバレスなアラート発報する仕組みを作る。
なんでCloudFunctionsを使ったかというと、内容によってアラートの送り先とか、電話の内容を変えたりするにはCloudFunctionsとかの関数で
自由に設定できたほうがいいんじゃないかと思ったから。

![twilio_alerting (1).png](https://qiita-image-store.s3.amazonaws.com/0/33101/375c2f90-d3e1-b996-a234-4bf766009abd.png)

## twilioアカウント作成

https://twilio.kddi-web.com/
ここから普通にアカウント作る。

### ログイン後の画面
<img width="1426" alt="スクリーンショット 2018-07-30 19.19.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/0421284c-b040-3221-0336-f09dfa87c8af.png">

### プロジェクトを作成
<img width="673" alt="スクリーンショット 2018-07-30 19.20.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/a880fbcc-705a-1a8a-cf69-d5574807a2bc.png">

### ソロ活動ですが何か？
<img width="1278" alt="スクリーンショット 2018-07-30 19.20.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/1438cc57-3c74-83d9-e2c9-dcd114984347.png">

### ログイン後のダッシュボード
![スクリーンショット 2018-07-30 19.20.50_2.png](https://qiita-image-store.s3.amazonaws.com/0/33101/7fa50ece-2cad-0cea-15d5-d7e57ee5d237.png)


### 電話番号を取得する
<img width="1155" alt="スクリーンショット 2018-07-30 19.23.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/1c6652f5-cab6-17e2-59a2-f30b5f1becea.png">

### 電話番号ガチャができる
![スクリーンショット 2018-07-30 19.23.57_2.png](https://qiita-image-store.s3.amazonaws.com/0/33101/63000610-61b7-0b26-f70b-4d796ab983b0.png)

### 取得完了
![スクリーンショット 2018-07-30 19.24.11_2.png](https://qiita-image-store.s3.amazonaws.com/0/33101/0253a961-86a7-125c-a257-86d92cd51021.png)

### 取得した電話番号を確認出来る
<img width="1106" alt="スクリーンショット 2018-07-30 19.24.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/3150de23-7879-200a-8994-8db0499732b5.png">

![スクリーンショット 2018-07-30 19.24.52_2.png](https://qiita-image-store.s3.amazonaws.com/0/33101/26d2e99f-b135-a005-5387-a121b68f99e8.png)

## CloudFunctionの作成
```js:index.js

exports.twiliotest = function(event, context) {
// Download the Node helper library from twilio.com/docs/node/install
// These consts are your accountSid and authToken from twilio.com/user/account
const accountSid = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX';
const authToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX';
const Twilio = require('twilio');
const client = new Twilio(accountSid, authToken);

client.api.calls
  .create({
    url: 'http://demo.twilio.com/docs/voice.xml',
    to: '+XXXXXXXXXXXXX',
    from: '+XXXXXXXXXXXX',
    method: 'GET',
  })
  .then(call => console.log(call.sid));
}
```

```json:package.json
{
    "name": "twiliotest",
    "version": "0.0.1",
    "dependencies": {
      "twilio": "^3.18.0",
      "querystring": "^0.2.0"
    }
}
```

`$ gcloud functions deploy twiliotest --trigger-http`

## 監視対象VMの作成
今回は、GCEでVM(CentOS 7)を作成し、Nginxをインストールしておく。

```
$ sudo yum install -y nginx
$ sudo systemctl start nginx
```

## Stackdriverの設定
### UptimeCheckの設定
![スクリーンショット 2018-07-30 22.49.13.png](https://qiita-image-store.s3.amazonaws.com/0/33101/fa98febc-bb82-8b43-d49d-937fbb30a44d.png)

### Notification設定
`WEBHOOKS`にて先程作成したCloudFunctionを呼び出すようにする。
![スクリーンショット 2018-07-30 22.51.43.png](https://qiita-image-store.s3.amazonaws.com/0/33101/3cf149d4-74c1-e3f7-4f13-a290166dc7ba.png)

![スクリーンショット 2018-07-30 22.54.12.png](https://qiita-image-store.s3.amazonaws.com/0/33101/a3f9661c-bd25-ef12-1a1c-1fde5b42caf4.png)


## 動作確認
### Nginxの停止

```shell
$ sudo systemctl stop nginx
```
しばらく待つと・・・

### かかってきた！
![IMG_0327.png](https://qiita-image-store.s3.amazonaws.com/0/33101/56e424e3-a43e-ba75-b882-5395a17bbec2.png)


## 今後について
今回はトライアル版だったから、「twilio使ってくれてありがとう。お試しの内容じゃなく任意のコールするなら有料版使ってね」的なメッセージになってた。
(イントネーションがすごい片言感ある)

アラートの内容によって電話の内容を変えたい。