GASで実装した死活監視コードの紹介、あるいはclasp管理の設定例


webサイトの死活監視をGoogleAppsScript(GAS)で実装してみました。

soramugi/gas-health-check: GooglaAppsScriptで死活監視

1分毎にhttpステータスコードを確認して、ステータスコードの変更があった場合メール送信をしてお知らせしてくれます。

使用方法

git clone [email protected]:soramugi/gas-health-check.git
cd gas-health-check
npm i
npm i -g clasp
npm run setup # ブラウザで認証 & GoogleAppsScript API認証をON 等の初期設定
npm run push # GoogleAppsScriptのアップロード
clasp open # ブラウザでアップロードしたGoogleAppsScriptのページが開きます

1 . スクリプトプロパティにメールアドレス、監視URLの指定
ファイル -> プロジェクトのプロパティ -> タブ名「スクリプトのプロパティ」

プロパティ to で監視結果の送信先メールアドレス
プロパティ http で始まるものは監視URL対象です

2 . 実行権限の付与 & スケジュールの作成
setScheduling の関数を実行、認証をする。

3 . 終了
1分毎に死活監視されるようになります。httpステータスコードに変更があればメールが届きます。

コード

このコードをコピペで動きます。TypeScriptでビルド後のコード。
GoogleAppsScriptはブラウザ操作だけでも設定出来るのが強みでもあるので、コピペできるようにしとく方がいいのかなと。

こちらのコードは変更時に反映するつもりはないので、こちらのリポジトリで使うことを推奨です。(やってることは単純なので不要かもですが)

soramugi/gas-health-check: GooglaAppsScriptで死活監視

function setScheduling() {
    var triggers = ScriptApp.getProjectTriggers();
    triggers.forEach(function (t) { return ScriptApp.deleteTrigger(t); });
    ScriptApp.newTrigger("execution")
        .timeBased()
        .everyMinutes(1)
        .create();
}
var scriptProperties = PropertiesService.getScriptProperties();
function execution() {
    var properties = scriptProperties.getProperties();
    for (var key in properties) {
        if (/^http/.test(key)) {
            fetchUrl(key, properties[key]);
        }
    }
}
var fetchUrl = function (url, statusPreCode) {
    var statusCode = 0;
    try {
        var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
        statusCode = response.getResponseCode();
    }
    catch (err) {
        statusCode = 999;
    }
    if (statusCode !== parseInt(statusPreCode)) {
        scriptProperties.setProperty(url, String(statusCode));
        sendMail(url, statusCode);
    }
};
var sendMail = function (url, statusCode) {
    var state = (/^2/.test(String(statusCode))) ? "OK" : "ALARM";
    var to = scriptProperties.getProperty("to");
    var subject = "[gas-health-check] [" + state + "] " + statusCode + ": " + url;
    var body = state + "\n" + statusCode + "\n" + url;
    MailApp.sendEmail(to, subject, body);
};

参考: https://qiita.com/9steps/items/91df1b8bd641ab44fd25

作成した動機

今まで死活監視をawsのCloudWatchでしていたのですが、監視数が増えるとそこそこに料金がかかるので削減したいなと。無料で死活監視しているサーバーの死活監視が必要ない構成にしたかったので、外部サービスにお任せ & 通知方法を柔軟に変更させるためにGoogleAppsScriptを使ってみました。

GoogleAppsScriptは便利で最高なのですが、コードの共有が不便で、良いものがないかと調べると今年(2018年)の1月に clasp というgoogle公式のGoogleAppsScript管理ツールが発表されたので使用、これを使うことによってGitHubでのリポジトリ管理と、TypeScriptを使うことも出来るので、それなりに複雑な機能も実装しやすい構成になっているかなと思います。

作ってみての感想

clasp便利。

ローカル環境でシュッと作ってピッとアップ出来るので速度が違います。すごく簡単になった。

「これできたよ」と自慢する時にコードコピペするのが若干辛かったんですよね、もしくは全体共有用のGoogleAppsScriptをコピーして置いておくとか。それだとコード変更時の反映が面倒なのが分かりきっていたので、全然やれてなかった。これなら時間使って良いもの作れる気分になれるので、「俺最強」が出せる。割と重要。

claspのgithubページには解説がある clasp run が、ローカル環境から関数実行出来るっぽいので、それも出来ると大満足ですね。現状だと動かないっぽい?ですが。

clasp参考資料

Command Line Interface using clasp  |  Apps Script  |  Google Developers
google/clasp: 🔗 Develop Apps Script projects locally.
claspを使い、Google Apps Scriptプロジェクトをgitでバージョン管理する - Qiita