5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

5
Posted at

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

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

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

68747470733a2f2f692e6779617a6f2e636f6d2f63386139386361353138653062373462613265613238343837373038636236332e706e67.png

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

68747470733a2f2f692e6779617a6f2e636f6d2f64333233303231373766396639623464363735653162636465343332336361382e706e67.png

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

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?