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

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

[soramugi/gas-health-check: GooglaAppsScriptで死活監視](https://github.com/soramugi/gas-health-check)

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

# 使用方法

    git clone git@github.com: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の指定
ファイル -> プロジェクトのプロパティ -> タブ名「スクリプトのプロパティ」

<img width="320" alt="68747470733a2f2f692e6779617a6f2e636f6d2f63386139386361353138653062373462613265613238343837373038636236332e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/6406/db2edabf-1515-14f7-d93c-0f818b252555.png">

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

<img width="687" alt="68747470733a2f2f692e6779617a6f2e636f6d2f64333233303231373766396639623464363735653162636465343332336361382e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/6406/90d23b6f-625a-de64-2e7b-153cd48f8319.png">

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

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

# コード

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

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


[soramugi/gas-health-check: GooglaAppsScriptで死活監視](https://github.com/soramugi/gas-health-check)

```js
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](https://developers.google.com/apps-script/guides/clasp)
[google/clasp: 🔗 Develop Apps Script projects locally.](https://github.com/google/clasp)
[claspを使い、Google Apps Scriptプロジェクトをgitでバージョン管理する - Qiita](https://qiita.com/rf_p/items/7492375ddd684ba734f8)