Zabbix/Mackerel の障害通知を電話で輪番通知
はじめに
こんにちは。KDDI ウェブコミュニケーションズ(KWCPLUS)の小原です。
Zabbix や Mackerel で監視しているシステムで障害が発生した際、Slack や Teams に通知が送られても気づかないことがあります。特に深夜や休日においては、スマートフォンの通知音が鳴っても見逃してしまうケースが少なくありません。
このような状況において、幸か不幸か電話による呼び出し音は気づきやすいものです。
本記事では、Zabbix や Mackerel の Webhook に指定できる電話発信プログラム Susanoo をオープンソースで開発したため、その概要と使い方について紹介します。
Susanoo とは
Susanoo は、電話番号と流したいメッセージを POST/GET で受け取って電話発信を行うプログラムです。名前の由来は、島根県で開催された JANOG に展示したことから、出雲の神様「スサノオ」にちなんでいます。
POST/GET で呼び出せるため、curl からも呼び出すことができます。
curl -X POST https://your-lambda-url.on.aws \
--json '{"to": "080-0000-0000,090-0000-0000", "loop": 5, "text": "Zabbix を確認してください"}'
この例では 080-0000-0000 と 090-0000-0000 にランダムに発信します。どちらかが応答するまで 5 回繰り返します。
カンマで区切られた電話番号にランダムに発信するため、080-0000-0000 が毎回最初に呼び出される不公平がありません。
受話したら「応答するには 1 を押してください。応答できない場合は 9 など 1 以外の数字を押してください」と流れます。これは留守番電話対策です。留守番電話は 1 を押すことがありません。5 秒以内に 1 を押さないと電話を切断し、自動で次の番号に発信します。
1 を押したら「Zabbix を確認してください」というメッセージが流れた以降、電話発信をしません。
仕組み
電話の発信には Vonage(ボネージ) を使用しています。Vonage は電話や SMS、ビデオを REST API で容易に実現できるサービスです。
弊社 KDDI ウェブコミュニケーションズで再販と日本語サポートを提供しています。Vonage の活用方法を Zenn で公開しています。
Vonage も POST で電話発信をすることができます。Node.js や PHP など、各種言語の SDK もあります。
JWT=(vonage jwt create --app-id $VONAGE_APP_ID --private-key $VONAGE_PRIVATE_KEY)
curl -X POST https://api.nexmo.com/v1/calls \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{"to":[{"type": "phone","number": "'$VOICE_TO_NUMBER'"}],
"from": {"type": "phone","number": "'$VONAGE_VIRTUAL_NUMBER'"},
"ncco": [
{
"action": "talk",
"language": "ja-JP",
"text": "障害が発生しました。ダッシュボードを確認してください"
}
]}'
技術スタック
- FastAPI
- AWS Lambda
- DynamoDB
- Vonage
ローカルの開発環境では ngrok で動作します。
クイック・インストール
もし Vonage に慣れていれば次の手順で終わりです。
git clone git@github.com:kwcplus/susanoo.git
cd susanoo
cp .env.example .env
$EDITOR .env # Vonage の API キーを設定
direnv allow
uv sync
uv run fastapi run
ngrok http 8000
curl -X POST https://your.ngrok-free.app \
--json '{"to": "080-0000-0000,090-0000-0000", "text": "Zabbix を確認してください"}'
詳細なインストール方法や Zabbix/Mackerel の設定方法は GitHub を参照してください。
コスト
運用コストは以下の通りです。
| 項目 | 料金 | 備考 |
|---|---|---|
| 電話番号 | 165円/月 | Vonage を契約して 050 番号を取得してください |
| 携帯電話宛 | 18.0円/分 | 秒課金のため 30 秒なら 9.0 円 |
| 固定電話宛 | 5.5円/分 | 秒課金 |
| 音声合成 | 0.11円/100文字 | テキストの音声化。通話単位。30 文字でも 100 文字に切り上げ |
初期費用や電話番号以外の月額費用はないため、もし障害のない月があれば 165円/月です。
サーバコストですが、Lambda 関数 URL を利用しているため、API Gateway のコストが発生しません。そのため、Lambda と DynamoDB の無料枠があれば 0 円になります。
まとめ
Zabbix や Mackerel の障害通知を電話で受け取れるようになることで気づきやすくなります。特に深夜の障害対応においては、Slack や Teams の通知を見逃すリスクを大幅に低減できます。
- Webhook で電話発信: Zabbix や Mackerel の Webhook 機能から呼び出すことができます。Susanoo は POST/GET で呼び出せるため curl からも可能
- ラウンドロビンで繰り返し発信: 複数の通知先を指定でき、ランダムに発信します。これにより、毎回同じ担当者が初回に電話連絡を受けることを回避できます
- 留守番電話対応: 1 を押さないとメッセージが流れません。留守番電話が応答した場合は自動で次の番号に発信されます。
- 安価: 障害がなければ電話番号の 165 円/月です。障害があれば音声合成と通話料金が秒課金されます。AWS Lambda + DynamoDB でも動くため無料枠があればコストがかかりません
Discussion