データベースバックアップを監視する

リストア中ではなく、毎晩のバックアップが動かなかった瞬間にアラートを受け取る。

問題点

バックアップは典型的なサイレント障害です。cronジョブが動き、ダンプが失敗します — ディスクがいっぱい、認証情報の期限切れ、ネットワーク障害 — しかし何も教えてくれません。数週間後、インシデントの最中に、必死に必要なリストアが空か完全に欠落していることがわかります。

SteadyCron による解決方法

  1. 1 バックアップスケジュールに合ったハートビートチェックを作成し(例: 毎日02:00)、通常の変動を吸収するグレースピリオドを設定します。
  2. 2 バックアップスクリプトの末尾で成功時に SteadyCron に ping します — ダンプコマンドがエラーになった場合は明示的に失敗の ping も送ります。
  3. 3 グレースピリオド内に成功の ping が届かない場合、SteadyCron がメール、Slack、Discord、Telegram、または webhook でアラートを送ります。
#!/usr/bin/env bash
TOKEN=<your-ping-token>
if pg_dump "$DATABASE_URL" | zstd | age -r "$KEY" > /backups/db.sql.zst.age; then
  curl -fsS https://ping.steadycron.com/$TOKEN
else
  curl -fsS https://ping.steadycron.com/$TOKEN/fail
fi
app.steadycron.com/jobs

Jobs

New job
Search jobs…
All HTTP Heartbeat
Status Group: env
env:prod 5 jobs 1 failing
weekly-digest-email HTTP 0 9 * * 1 in 2 days 3 days ago
nightly-db-backup Heartbeat 0 2 * * * in 19 h 5 h ago
stripe-reconciliation HTTP 0 */4 * * * in 38 min 3 h ago
cache-warmup HTTP */15 * * * * in 11 min now
search-index-sync Heartbeat */30 * * * * in 6 min 24 min ago
env:dev 3 jobs
seed-test-data HTTP 0 4 * * * in 14 h 10 h ago
preview-env-cleanup Heartbeat 0 */6 * * * in 2 h 4 h ago
trial-expiry-sweep HTTP 0 6 * * * yesterday

すべてのジョブのステータス、スケジュール、最終実行 — ひと目でわかる。

なぜ終了コードではなくハートビートなのか

スクリプトの終了コードは何かが監視している場合のみ重要です — 孤独な VM では何も監視していません。ハートビートは「動いたか?」という問いを、ダウンしているかもしれないマシン自体から切り離します。サーバーが再起動したり、ディスクがいっぱいになったり、cron が誤って設定されたりすると、ping が単純に届かず、SteadyCron がそれを教えてくれます。

ハングしたバックアップも検出する

スクリプトの先頭で /start ping を送信します。バックアップが開始されてもロックでハングしたりメモリ不足で /success または /fail を送れなかった場合、SteadyCron はその実行を遅延ではなくスタックとしてフラグを立てます。

関連ドキュメント

気づいたときには手遅れにならないために

無料プランで始めましょう — クレジットカード不要。

無料で始める