1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GAS(Google Apps Script)の無料枠でサーバーの死活監視を行う

Last updated at Posted at 2025-03-22

GAS(Google Apps Script)の無料枠で死活監視を行う

Google Apps Script(GAS)を利用する際、気になるのは無料でどこまで使えるのかという点だろう。この記事では、GASの無料枠の制限を整理し、実際にバックエンドサーバーの死活監視APIを叩いてスリープさせないようにするケースを紹介しながら解説する。

GASの主な無料枠の制限

GASの無料枠には次のような制限がある。

項目 上限
1回あたりの最大実行時間 6分(360秒)
1日あたりの合計実行時間 90分(5400秒)
トリガーの数 1スクリプトあたり最大 20個
URL Fetchの呼び出し回数 1日あたり 20,000回
メールの送信可能数 1日あたり 100通

詳細は公式ドキュメントを参照:Quotas for Google Services(公式)

死活監視APIを叩いて無料枠サーバーがスリープしない仕組み

今回の例では、無料で運用しているバックエンドサーバーがスリープしないよう、5分間隔で死活監視APIを叩く仕組みをGASで実装した。

実装手順

以下の手順でGASを設定する。

  1. 新規にスプレッドシートを作成する。
  2. 「死活監視用URL一覧」という名前のシートを作成する。
  3. シートのA列に、死活監視したいURLを記入する。
  4. スプレッドシートの「拡張機能」メニューから「Apps Script」をクリックし、GASエディタを開く。
  5. 後述のGAS実装を貼り付けて保存する。
  6. 後述の手順でトリガーを設定する。

GASによる実装例

function main() {
  const urls = getUrlsFromSheet('死活監視用URL一覧');
  Logger.log('===== URLのHTTPステータス一覧 =====');
  urls.forEach((url, index) => {
    const statusCode = fetchHttpStatusCodeWithRetry(url, 3, 30000);
    Logger.log(`${index + 1}. URL: ${url}\n   HTTPステータス: ${statusCode}`);
  });
  Logger.log('================================');
}

// 指定シートのA列にあるURLを取得する
function getUrlsFromSheet(sheetName) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const lastRow = sheet.getLastRow();

  if (lastRow < 1) return [];

  const urlRange = sheet.getRange(`A1:A${lastRow}`);
  const urls = urlRange.getValues()
    .flat()
    .filter(url => url); // 空セルを除外

  return urls;
}

// URLにアクセスしHTTPステータスコードを返す(リトライ機能付き)
function fetchHttpStatusCodeWithRetry(url, retryCount, intervalMs) {
  let statusCode = fetchHttpStatusCode(url);
  let attempts = 1;

  while (statusCode !== 200 && attempts <= retryCount) {
    Logger.log(`Retrying ${url} (${attempts}/${retryCount}) in ${intervalMs / 1000}s...`);
    Utilities.sleep(intervalMs);
    statusCode = fetchHttpStatusCode(url);
    attempts++;
  }

  return statusCode;
}

// URLにアクセスしHTTPステータスコードを返す
function fetchHttpStatusCode(url) {
  const options = { muteHttpExceptions: true };
  try {
    const response = UrlFetchApp.fetch(url, options);
    return response.getResponseCode();
  } catch (e) {
    Logger.log(`Error accessing ${url}: ${e}`);
    return 'Error';
  }
}

トリガーの設定方法

  1. GASエディタの左側メニューから「トリガー」を選択。
  2. 右下の「トリガーを追加」ボタンをクリック。
  3. 実行する関数としてmainを指定。
  4. 実行する頻度を「時間ベースのタイマー」に設定。
  5. 「分ベースのタイマー」を選択し、任意の時間間隔(例:5分)を設定して保存。

無料枠についての検証

実行時間の上限とURL Fetchの上限のどちらが先に達するかはURL数やレスポンス速度に依存するため、実際に自分の環境で確認するとよい。

実行時間

  • スクリプト実行の頻度:5分間隔
  • 1日に実行される回数:24時間 × (60分 ÷ 5分) = 288回/日
  • 1回あたりの実行時間(最長)約6.5秒
    • ※この6.5秒は確認できるログの中で最も長かった実行時間であり、平均値ではない。

1日の合計実行時間の計算は以下の通り。

  • 約6.5秒 × 288回 ≈ 1883秒(約31分)

結果として、実行時間は無料枠の範囲内であることが分かる。

URL Fetchの呼び出し回数についての検証

URL数 1回の呼び出し数 1日あたりの実行回数(5分間隔) 1日の合計呼び出し数 制限内か?
1 1 288 288 ✅ はい
5 5 288 1,440 ✅ はい
10 10 288 2,880 ✅ はい
50 50 288 14,400 ✅ はい
69 69 288 19,872 ✅ はい
70 70 288 20,160 ❌ いいえ(上限超過)

結論

今回のような5分ごとの死活監視は、GASの無料枠内で安心して運用可能であることが確認できた。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?