はじめに
システム開発でPaaSの Render(無料プラン) を利用しているのですが、以下の2つの課題に直面しました。
- スリープ問題: 15分間アクセスがないとインスタンスが停止し、次の起動(コールドスタート)に時間がかかる。
-
監視の誤検知: 一般的な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無料枠での運用を考えている方の参考になれば幸いです。