Google Apps ScriptとTwilioでブログの死活管理をしてみた


こんにちは、@24guchiaです。

先日、僕のブログ読んでください!とお伝えしたところ、
見れないんですけど・・・っていう恥ずかしい事案があったので、
外部サービスを使って、死活管理しました。

利用する外部サービスはGoogle Apps ScriptとTwilioの2つです。
これらサービスを採用した理由は、このブログは個人でレンタルしている
さくらのVPSにWordpressを導入しているため、
サーバの外で管理したかったからです。サーバを触ったことがないときに、
勉強用に借りたサーバでディレクトリ構成がめちゃくちゃなので、
そのうち移行したいです。

Google Apps Scriptでやること

以下GASで。

フェッチして、何かあったら通知するスクリプトの作成

僕のブログのトップページにアクセスして、
エラーが発生したら、TwilioのFunctionsを呼び出すスクリプトを作りました。

function myFunction() {
  var options = {
    'method' : 'get',
    'muteHttpExceptions': true
  };
//  const blog_url = 'http://thisisnotexisturlfortest/'; // non exist url
  const blog_url = 'https://harinoma.info/';
  try {
    Logger.log('おけまる水産');
    UrlFetchApp.fetch(blog_url, options);
  } catch (e) {
    Logger.log('やばたにえん');
    const functions_url = 'https://{your_functions}.twil.io/blog_is_dead';
    UrlFetchApp.fetch(functions_url);
  }
}

コメントアウトしているblog_urlをコメントインすると、
必ずエラーが起こせるのでテストの際はそのようにし、
通知が来ることを確認します。

15分毎にスケジュール起動する

上記GASをスケジュール起動します。
スケジュール起動するには、トリガーと呼ばれるものを設定します。

cronなどを使ったりしなくても、スケジュール起動ができ、ありがたいですね。
Googleのこういうところ好き。

Twilioでやること

TwiML BinsとFunctionsのみを使い、
Twilio内で完結するようにしています。

TwiML Binsの用意

Sayを使って、機械音声が流れるようにします。
これは後でFunctionsで使います。Sayで言わせる言葉は何でもOKです。

TwiML Binsは左側のメニューにあるRuntime(</>のメニューボタン)->
TwiML BInsというメニューを押して、開かれたページで+ボタンを押すと追加できます。


“`say.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say language="ja-jp">お前のブログはもう死んでいる</Say>
</Response>
“`

とりあえず不穏な言葉を言わせるようにしてあります。

Functionsの用意

Twilioエヴァンジェリストの高橋さんの記事のサンプルコードが、
そのまままるっと使えます。

URLは今回は上で作ったTwiML BinsのURLを使用しています。
また、Functionsを外部から呼び出しできるように、
Check for valid Twilio signatureのチェックを外しています。
これで外部からも呼び出すことが出来ますが、
このFunctionsのURLがバレるとイタズラでめちゃくちゃ呼び出されて、
料金がすごいことになり得るので、取扱には注意してください。

デモ動画

深夜だろうがなんだろうが、とにかく15分毎にひたすら
電話かけてくるので否が応でも対応せざるを得なくてつらいです。

まとめ

GASでフェッチして、Twilioに通知。
Twilioが電話して、人間を叩き起こして、
サーバを復活させるってピタゴラスイッチみたいですね。

そもそもこのブログのサーバが死んでいたのは、
海外サーバからアタックされていて、けっこう死んでいたようでした。
各種アタック対策をしたところ、
この死活管理ツールは今の所起動していません。
残念なような嬉しいようななんとも言えない気持ちです。