SendGridのメンテナンス情報をChatWorkに通知する方法

2015年4月、Sendgridのメンテナンス情報や障害情報を確認するためのステータスページstatuspage.io 上に移行されました。これにより、statuspage.ioが提供する様々な通知方法を、SendGridのステータスの通知に使えるようになりました。

そこで今回は、SendGridのステータスをChatWorkに自動通知する方法をご紹介したいと思います。ChatWorkに通知することで、SendGridのメンテナンス情報の更新をいち早く知り、必要な対策を講じることができるようになります。

今回紹介するシステムの概要を以下に示します。

SendGridステータスのチャットワークへの通知システム図

SendGridステータスのチャットワークへの通知システム

  • SendGridは障害などが発生すると、ステータスページを更新します。status.sendgrid.comにステータスの更新を登録します。
  • ステータスページは、ステータスが更新されると現在登録されている通知先に通知を行います。直接ChatWorkに通知できれば良いのですが、Webhookの形式の変換(後述)が必要なため、reflector.ioを間にかませます。通知方法には、メール、Twitter、Webhook、RSS Readerなどいろいろなものがありますが、今回はWebhookを用いてreflector.ioに通知するようにします。
  • reflector.ioは、SendGrid Labsが運営するWebhookの転送サービスです。入力としてHTTPベースのWebhookを受け、あらかじめ登録された変換処理を実行し、別のHTTPベースのエンドポイント(REST APIなど)に転送します。今回はステータスページのWehbookをreflector.ioで受け、ChatWorkのメッセージ投稿APIを呼び出します。

それでは、作業を始めましょう。

reflector.ioの設定

1. Webhookの作成

まずは、ステータスページへ登録するreflector.ioのエンドポイントを作りましょう。reflector.ioにアクセスし、「SIGN ME UP」を押しアカウントを作成します。SendGrid Labによるサービスですが、SendGridの使用有無にかかわらず誰でも使うことができます。

メールの認証を済ませてreflector.ioにログインしましょう。トップ画面の「Add First Webhook」ボタンを押してWebhookを作成します。Webhook名には好きな名前を入れてください。ここでは「チャットワークへの通知」としました。

Webhookの新規作成画面

「Save」を押すと、次のような画面になります。左上のテキストボックスに表示されているURLが入力のエンドポイントとなります。このエンドポイントをステータスページに登録します(方法は後で示します)。

エンドポイントURL

2. 通知先グループ(Destination Group)の作成

次に、「Add First Group」を押して、通知先グループ(Destination Group)を作ります。通知先グループとは、転送ルール(Path-thru または Failover)で関連づけられた、転送先エンドポイントのグループです。”path-thru”は登録された通知先すべてに通知をし、”failover”では最も優先度の高い宛先に通知を行います。今回はデフォルトのままpath-thruを選びます。グループ名は「チャットワークへの通知グループ」としました。

通知グループ(Destination Group)の作成

3. 通知先の設定

次に、転送前に行う変換処理(Pipeline)と転送先を設定します。
「Add First Destination」を押します。

Destinationには、ChatWorkのメッセージ投稿のAPIを指定します。ChatWork の APIの仕様はこちらで確認できます。なお、ChatWorkのAPIを利用するには利用申請をし、ChatWork Tokenを入手しておく必要があります。ルームIDは、ChatWorkのルームにアクセスした際にURLに表示される“rid”に続く数字です。

通知先の作成

Type, Retries, Timeout, Outbound limitはとりあえずそのままにしておきます。

4. Pipelineの設定

最後にPipelineを設定します。Pipelineは入力から出力への間に実行される変換処理のことです。ここでは、ステータスページの通知形式からChatWork APIの形式に変換するためのPipelineを追加します。「Add first pipeline」を押してください。

Pipelineの名前は「status.sendgrid.comからChatWorkへ」としました。変換処理は、Javascriptを使って記述します。引数で渡されたrequestオブジェクトに、HTTPリクエストの内容が格納されてくるので、適宜requestの中身を修正し結果を返します。

パイプラインの設定

プログラム欄に以下のプログラムをコピー&ペーストしてください。

request.headers['X-ChatWorkToken'] = '<Your ChatWork Token>'; // 1
var obj = JSON.parse(request.body); // 2

var body = "";
body += "[To:<UserID1>][To:<UserID2>]"; // ChatWorkで TO: するユーザのユーザIDを指定する.  // 3

body += "[info]";

if( "incident" in obj ){ // 4
    var latest = obj.incident.incident_updates[0]; // 5
    body += "[title] Incident 通知 : "+obj.incident.name+" ("+obj.incident.status+")[/title]n";
    body += "更新日時:"+latest.updated_at + "n";
    body += "状  態:"+latest.status + "nn";
    body += latest.body + "n";

}else if("component_update" in obj){ // Componentの更新通知
    body += "[title]"+"Component 更新通知"+"[/title]";
}else{
    body += "[title]"+"不明な状態通知" +"[/title]n";
}

body += "[hr]";
body += "詳細は http://status.sendgrid.com/ を確認して下さい."
body += "[/info]";


request.body = "body="+encodeURI(body); // 6
request.headers['Content-Type'] = "application/x-www-form-urlencoded"; // 7

return request;

  • X-ChatWorkToken HTTPヘッダにChatWork Tokenを指定します。
  • ステータスページからのWebhookのデータはrequest.bodyにJSON文字列(オブジェクトではないので注意)として格納されています。ステータスページからの通知の形式についてはこちらを参照してください。
  • 関係者をTOに入れておくと、ChatWorkから関係者へさらに通知が飛ぶので便利です。
  • 通常の状態の更新は”incident”として、コンポーネントの状態の更新は”component”として通知されます。componentは通知を行う単位を表していますが、SendGridのステータスページでは現在使用されていないので特に通知内容はキャプチャしません。incident通知の方は、incidentの名称や状態、コメントをキャプチャして出力するようにします。
  • 直近の更新内容である0番目の要素のみをChatWorkに投稿するようにしています。
  • request.bodyをChatWorkのAPI呼び出しの形式に変換します。”body=”に続けて投稿内容の文字列を設定します。
  • ChatWorkのエンドポイントはapplication/jsonは受け付けないので、強制的にapplication/x-www-form-urlencodedに設定します。

これでreflector.ioの設定は完了です。「Save」を押して作成したPipelineが選択されていることを確認し、「Add」ボタンでDestinationを保存します。なお、ChatWorkの投稿先のグループチャットには、必ずTokenの所有者をメンバとして追加するようにしてください。メンバが存在しないと投稿が失敗してしまいます。

ステータスページとreflector.ioの接続

ステータスページにreflector.ioの入力エンドポイントを登録します。ステータスページにアクセスし、「SUBSCRIBE TO UPDATES」からWebhook(“<>”)を選んで、エンドポイントのURLを指定します。また、reflector.ioのエンドポイントへの通知がうまくいかない場合に、通知を送るメールアドレスも指定しておきます。

ステータスページへのreflector.io エンドポイントの登録

完成!

お疲れ様です。これで、全ての設定が終わりました。あとは、ステータスページが更新されるのを待つのみです。

設定が正しければ、ChatWorkに以下のようにメッセージが投稿されます。

ChatWorkへの投稿例

うまくいかない場合には、reflector.ioにログインして、入力と出力のログを見てみましょう。なお、ChatWorkへの通知が失敗すると、Webhookが無効化されてしまうので、デバッグしたのち再度有効化しましょう。また、statuspage.ioのアカウントを別途取得し、今回作成したreflector.ioのエンドポイントに接続すれば、好きなようにIncidentを発生させることができるのでデバッグに役立つでしょう。

おわりに

ステータスページからreflector.ioを介してChatWorkにSendGridの状態を通知する方法を紹介しました。

Webhook、reflector.io、各種WEBサービスのAPIを組み合わせると、いろいろな通知システムが簡単に組めてしまいます。

みなさんもいろいろと試してみてくださいね!