Google Apps Scriptでウェブサイトの死活監視をしてSlackに通知するbotの作り方

技術情報・ノウハウ

Google Apps Scriptでウェブサイトの死活監視をしてSlackに通知するbotの作り方をご紹介します。サーバにホスティングする必要もなく、簡単にウェブサイトの監視を行えます。

ウェブサイトが正常に動いているのかを監視するツールは沢山あります。

弊社ではAWSのRoute53にあるHealthCheckを使っていたのですが、こちらは秒間のチェック数が半端なくて、弱いサーバだとHealthCheckの負荷でサーバダウンするっていう笑えない状況もありました。

そこでGoogle Apps Scriptを使ってウェブサイトの状態をチェックをして、さらにはSlackに通知しちゃおうと思いました。

Google Apps Scriptって?

Google Apps Script、略称GASは、Googleが提供しているサービスです。
GoogleドライブでGoogle Apps Scriptのドキュメントをちょろちょろっと書けば、それで動きます。

Goole関係のサービスや、その他のウェブサービスと連携させて、世の中を便利にできてしまう、そんな素敵なツールです。
基本はJavascriptで書くので、とっかかりも楽ちんですね。
GASリファレンス:https://developers.google.com/apps-script/referenc...

やってみましょう

ではさっそく取り掛かります。
まずはGoogle Apps Scriptのドキュメントを新規作成しましょう。

Googleドライブの新規作成からGoogle Apps Scriptを選びます。
ない場合は、「アプリを追加」でGoogle Apps Scriptを探して「接続」してください。

さて、Google Apps Scriptが作れたら、下準備をします。

Slackと連携をする

Slackに投稿するには、Slackとの連携が必要です。Slackとの連携を行うには、slackAppという便利なライブラリが公開されていますので、こちらを利用させていただきます。

こちらでライブラリキーを取得します。
https://github.com/soundTricker/SlackApp

そして、Google Apps Scriptのリソースメニューからライブラリを選択し、「ライブラリを検索」のフォームに先ほどのキーを記入して選択ボタンをクリックすると、ライブラリが追加されます。バージョンを選択して、保存してください。

画像にはScriptが記入されていますが、後で追加しますので気にしないで進めて下さい。

次はSlackのTeamとの連携です。
https://api.slack.com/web
こちらのページから「Generate test tokens」に移動します。
Teamの一覧が表示されますので、投稿したいTeamを選んで、「Create token」をします。

Slackへの再パスワードが求められるので、パスワードを記入すると、「Confirm」状態になります。

Confirmをクリックするとトークンが発行されますので、トークンをコピーします。


そして、Google Apps Scriptのファイルメニューからプロジェクトのプロパティを開き、「スクリプトのプロパティ」タブに、先ほどのトークンを追加します。プロパティ名は「SLACK_ACCESS_TOKEN」にします。

Scriptを書く

それではScriptを書きましょう。

function websiteWatchAlert() {
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var slackApp = SlackApp.create(token);
var options = {
channelId: "#general",
userName: "bot",
mention: "@hoge"
};
var url = "http://www.example.com/"
var message = '';
var response = UrlFetchApp.fetch(url);
var response_code = response.getResponseCode();
if(response_code==200){
// ここで対象ページのhtmlを検証してください
var content = response.getContentText("UTF-8");
var reg = /fugafuga/;
if(!reg.exec(content)){
message = url+" ページが正しく表示されていません";
}
}else{
message = url+" 不正なレスポンスコードが返されました: "+response_code;
}
if(message.length>0){
slackApp.postMessage(options.channelId, (options.mention.length>0 ? options.mention+": " : "")+message, {username: options.userName});
}
}

上記のスクリプトを適宜修正してペーストしてください。
ページのレスポンスコード200を確認するだけでは、DBが落ちていた場合など、コンテンツが正しく表示されているのかまではわからないので、DBから取得して表示するデータをreg = /fugafuga/の箇所で、正規表現などで確認するようにすれば、より監視が正確になるかと思います。

ではテストしてみましょう。

ページ上部にある実行ボタン(右矢印)をクリックします。
すると、最初だけ承認を求められますので、許可を確認し、承認してください。


さあ、これでスクリプトが走ります。
Slackにメッセージは飛んだでしょうか。

ジョブをセット

後は、一定間隔ごとにスクリプトを叩いて、チェックを繰り返します。

これで完了です。
お疲れ様でした。


参考
http://tech.camph.net/slack-bot-with-gas/#sub1

将積 哲哉

将積 哲哉

1978年生まれ。信州大学繊維学部感性工学科卒。 船舶エンジンメーカーで基幹システムの運用に携わり、その後株式会社インフォアスリート設立に参画。 サーバ管理からシステム構築の他、企業ロゴやデザインなど幅広くカバー。知的財産権にも明るい。