0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Render無料枠の「スリープ問題」と「監視エラー」をGAS+UptimeRobotで解決する

0
Posted at

はじめに

システム開発でPaaSの Render(無料プラン) を利用しているのですが、以下の2つの課題に直面しました。

  1. スリープ問題: 15分間アクセスがないとインスタンスが停止し、次の起動(コールドスタート)に時間がかかる。
  2. 監視の誤検知: 一般的なPing監視だと、コールドスタートの待機時間を「タイムアウト(ダウン)」と誤判定してしまう。さらに、FastAPIなどの構成によっては 405 Method Not Allowed が発生する。

これらを Google Apps Script (GAS)UptimeRobot を組み合わせることで、「スリープさせず、かつDB接続まで含めた精密な監視を無料で行う」構成を構築しました。その知見を共有します。

システム構成

  • Backend: FastAPI (Python)
  • Database: Supabase
  • Deploy: Render (Free Tier)
  • Monitoring: UptimeRobot
  • Keep Alive: Google Apps Script (GAS)

1. FastAPI側にヘルスチェック用エンドポイントを作成

まずはアプリケーション側で、サーバーの生存確認とデータベース接続確認を行う軽量なエンドポイント /health を用意します。

ルート (/) へのアクセスは処理が重くなる可能性があるため、専用のエンドポイントを作るのがベストプラクティスです。

@app.get("/health")
def health_check():
    # データベース(Supabaseなど)への接続状態を確認
    # db_clientはご自身の環境に合わせて調整してください
    status = "connected" if database.db_client else "uninitialized"
    
    # 軽量なJSONを返す
    return {"status": "ok", "database": status}

2. GASで定期的にアクセスしてスリープを防ぐ

Renderのスリープ(15分無操作で停止)を防ぐため、GASを使って10分おきに /health を叩くトリガーを設定します。

function wakeUpRender() {
  // ヘルスチェック用のURLを指定
  const url = "https://your-service-name.onrender.com/health";
  
  try {
    // GETリクエストを送信
    const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
    console.log("Wake Up Access: " + response.getResponseCode());
  } catch (e) {
    console.error("Access Failed: " + e.message);
  }
}

このスクリプトをGASの「トリガー」機能で 「時間主導型 → 分ベースのタイマー → 10分ごと」 に設定すれば、サーバーは常に起きた状態(Warm Standby)になります。

3. UptimeRobotでの監視設定(ここが重要)

通常のHTTP監視を行うと、UptimeRobotのデフォルト挙動(HEADリクエスト)が原因で 405 Method Not Allowed エラーになったり、タイムアウトの誤検知が発生したりしました。

これを回避し、さらに**DB接続エラーまで検知できる「Keyword Monitor」**の設定を行います。

設定のポイント

モニターの種類を「HTTP(s)」ではなく 「Keyword」 に設定します。これにより強制的にGETリクエストが送信され、レスポンスの中身までチェックできます。

設定項目
Monitor Type Keyword
URL https://your-service-name.onrender.com/health
Keyword to look for connected(※APIが返すDB状態の文字列)
Alert When Keyword Not Exists(重要!)

なぜこの設定が最強なのか?

405エラーの回避: Keyword監視はGETメソッドを使うため、FastAPI側でHEADメソッドの対応をしていなくてもエラーになりません。

「死活」だけでなく「健康」を監視: サーバーが生きていても、DB接続が切れていればキーワード(connected)が返ってきません。この設定なら「サーバーは動いているがDBが死んでいる」というゾンビ状態も即座に検知できます。

まとめ

この構成により、クレジットカード登録不要の無料構成でありながら、以下の環境が整いました。

  • 常時稼働: GASのおかげでスリープ待ち時間ゼロ。
  • 高精度な監視: 誤検知(False Positive)をなくし、DB接続断も検知可能。

Render無料枠での運用を考えている方の参考になれば幸いです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?