Mackerel の Webhook と Twilio を使ったエスカレーション

Posted on

この記事は Mackerel Advent Calendar 2016 の 25 日目です。

参加しようと思ってカレンダーを見たら最終日しか空いていなくて、取りをつとめることになりました。今年は Mackerel 尽くしの 1 年になりました :-)

Mackerel の Twilio 連携機能

Mackerel の Twilio 連携機能

先月ついに、Mackerel が Twilio に対応しました! 夜間の手薄になる時間帯は確実に通知したいので、待ちわびていた方も多いのではないでしょうか。

この Twilio 連携は管理画面からいくつかの項目を入力するだけで使える反面、必要最低限の機能のためエスカレーションや時間帯の制限などはできません。

Mackerel Meetup #8 Tokyo に登壇したときも、複数の方から「どうやってエスカレーションを実装していますか?」と質問を受けました。他の監視ツールから乗り換えるとき特に気になるポイントだと思います。

今回は freee のエスカレーション方法をご紹介します。

freee のエスカレーション方法

アラートのエスカレーションといえば PagerDuty が有名ですが、freee の場合はそこまでの機能は必要なくて、シンプルなエスカレーション機能があれば充分です。クックパッドさんも同様の理由から、Waker というエスカレーションシステムを自社開発していますね。

freee では簡単なエスカレーションスクリプトを Python で書いて、それを Webhook 経由で実行しています。 Webhook を受け付ける App サーバは Sinatra で書いて、外部コマンドとして Python スクリプトを実行しています。

この Python スクリプトは、次の機能を持っています(コメントや空白行を除くと 100 行くらい)。

  • 電話をかける時間帯の制限
    • 夜間の時間帯に発生したアラートのみ Twilio から電話をかける
  • 担当者をランダムに選択
  • 5 回コールしても電話に出なければ、次の人にエスカレーション
  • アラートが通知される Slack チャンネルで誰かが反応したら電話をかけるのを止める

Twilio から電話をかけるところは、公式のヘルパーライブラリを使っています。

freee にはインフラエンジニアが 3 人しかいないため、複雑なエスカレーションフローは存在しません(参考: 60 万事業所が使うクラウドサービスを 3 人で運用するために心がけている 3 つのこと)。そもそも、安定したインフラ運用に力を尽くしているため、夜間の時間帯にアラートが飛ぶことはほとんどありません。

Webhook のセキュリティ対策

Webhook の Source IP は公開されているので、Security Group などで制限することをお忘れなく。

Mackerel からの Webhook などの Alert の通知元 IP アドレスは?

Mackerel からの通知のリクエスト元 IP アドレスレンジは、 59.106.108.64/26 です。変更する際は事前に告知を行います。

また、必要に応じて SSL/TLS 通信にしておくと良いでしょう。

まとめ

エスカレーションルールは各社違うので、すべての要望を Mackerel に実装するのは難しいと思います。 Twilio の API は簡単に使えるので、Webhook と組み合わせて自分たちでハックするのも楽しいです。

エスカレーションも大切ですが、何より安定したインフラ運用こそがインフラエンジニアの腕の見せどころであり本質的な課題です。そのことを忘れないように心がけています。

それでは、メリークリスマス!