3
3

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 で Render.com のスリープ対策

Last updated at Posted at 2024-11-15

前置き

  • Render.com の無料枠での利用におけるデプロイしたアプリのスリープ対策について調査していた → 以前書いた記事
  • こちらの記事から監視ツールを利用する以外に GAS でも対策が可能であることを知った
  • 検証した結果問題なく使用でき実用性もあると判断できたため記事にまとめた

本題

実装事項について

今回の実装要件
(1) 15分間サーバーにアクセスしないと Web アプリが停止してしまうため、今回は10分毎にサーバーにアクセスさせる
(2) GAS の利用制限事項に引っかからないようにスクリプトの処理は簡単し、実行済みのトリガーも消去する

ファイル構成

ファイル構成名 処理内容
main.gs トリガーの生成および削除を担う
request_to_render.gs Render.comへのリクエストを行う

手順

  1. https://developers.google.com/apps-script/guides/projects?hl=ja#create-and-delete の手順通りにプロジェクトを作成する
  2. 以下に示すソースコードをコピペ
  3. 関数 "setMinTrigger" をドロップダウンリストから選択して実行

以上で自動化完了

実装

main.gs
/******************************************************************
 * 参考資料: https://data-x.jp/blog/gassetmintrigger/#index_id4 
 ******************************************************************/
 
// セットおよび削除するトリガー名
const TRIGGER_FUNC_NAME = 'requestRenderTrigger'

/*=================================================================
・トリガーを定期的に設定および削除するプロセス
=================================================================*/
// 既存の同名のトリガーを削除した後、
// 10mおきにトリガーをセットする処理
function setMinTrigger() {
  let triggers = ScriptApp.getScriptTriggers();
  for(let trigger of triggers){
    let funcName = trigger.getHandlerFunction();
    if(funcName == TRIGGER_FUNC_NAME){
      ScriptApp.deleteTrigger(trigger);
    }
  }
  // 年月日と現在時刻の取得
  let now = new Date();
  let y = now.getFullYear();
  let m = now.getMonth();
  let d = now.getDate();
  let hh = now.getHours();
  let mm = now.getMinutes();
  // 現在時刻から10分後に実行されるトリガーを生成
  let date = new Date(y, m, d, hh, mm + 10);
  ScriptApp.newTrigger(TRIGGER_FUNC_NAME).timeBased().at(date).create();
}

/*=================================================================
・「対象のURLにリクエストを送る」処理のトリガーのセットおよび既存の実行済みトリガー削除
=================================================================*/
function requestRenderTrigger() {
  request_to_render(); // request_to_render.gs > function request_to_render()
  setMinTrigger(); //上記内容が処理し終える度にトリガーをセットする
}
request_to_render.gs
/******************************************************************
 * 参考資料: https://zenn.dev/sdb_blog/articles/002-render-okosu
 ******************************************************************/

// 【変更必須】ここにデプロイしたWebアプリのURLを指定する
const APP_URL = 'デプロイしたWebアプリのURL'; 

/*=================================================================
・Renderへのリクエスト
=================================================================*/
function request_to_render() {
  // レスポンスコードを取得するだけ
  const HTTP_STATUS = UrlFetchApp.fetch(APP_URL).getResponseCode();
  // console.log(HTTP_STATUS); // デバッグ用
}

補足

  • 関数が 3 つだけなのでファイルを分ける必要はありませんが、手動で実行する際に指定する関数を誤ってしまうことが私個人多かったので関数指定ミス防止のためにファイルを分けています
  • こちらの記事で「GAS のエラーもたまに起こる」という点を言及されていますが、私の憶測になりますが GAS の利用制限事項に触れているからなのかもしれません → 以前書いた記事
  • 目的がスクリプト利用だけだったためスプレッドシートは利用していませんが、シートへログのように何か記録するような処理を施しても良いかもしれません

所感など

  • こちらの資料大変参考になりました。トリガーを削除するメソッドがあることを知れました。ありがとうございました
  • いずれこういった小細工も対策されてしまうかもしれませんね
  • 今回は「Render.com の無料枠のスリープ対策」が目的となっていましたが、GAS を上手く利用すればオリジナルの監視アプリが出来るかもしれないと可能性を感じることができました

参考資料

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?