全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / DX経営ゲーム制作記 / Vol.4 本番運用とトラブル

記事 18

GitHub Actionsで死活監視を5分で作った

夜中にサーバーが落ちていたとしても、誰も気づかない。研修の日の朝に「繋がらない」と連絡が来てから初めて知る——これが最悪のシナリオだ。

2026-06-02 公開

夜中にサーバーが落ちていたとしても、誰も気づかない。研修の日の朝に「繋がらない」と連絡が来てから初めて知る——これが最悪のシナリオだ。


要件はシンプル

5分ごとにdxgame.jpとteam.dxgame.jpにHTTPリクエストを送る。200以外のステータスコードが返ってきたら、メールで通知する。これだけだ。


YAMLファイル50行で完成

監視の設定は一つのYAMLファイルで完結する。cron: '*/5 * * * *' でスケジュール実行し、curlでHTTPステータスを取得、200以外ならaction-send-mailでメール送信する構成だ。GitHubのSecretsにGmailのApp Passwordを登録して手動実行で動作確認。合計1時間かからなかった。


「5分で作れる」の本質

死活監視を作ることのハードルが、以前は高かった。専用の監視サーバーを立てる、Nagiosなどの監視ツールを設定する、有料の監視サービスを契約する——どれも時間とコストがかかる。GitHub Actionsは無料枠があり、YAMLを書くだけで動く。「作ろうと思ったその日に完成する」という状況が、監視を当然のものにした。「作るコストが下がれば、やるべきことをやれる」——これがAI時代のインフラ管理の変化だ。

ワークフローYAMLの設計と誤報への対応

実際に使っているGitHub Actionsの監視ワークフローの要点と、運用で遭遇した「誤報問題」を記録しておく。

ワークフローの基本設計

4つのURLを監視している(本番個人編・本番チーム編・ステージング個人編・ステージングチーム編)。ステージングは研修への影響がないため、FAILしても警告レベルに留める設計だ。本番2URLのいずれかがFAILした場合のみ、緊急メール通知を送る。

curlのオプションとして--max-time 15 --retry 2 --retry-delay 3を設定した。15秒以内に応答がなければタイムアウト、2回リトライしてもダメなら異常と判定する。この設定は「一時的なネットワーク遅延で誤報を出さない」ためのものだ。

誤報との戦い

最初の1週間で誤報が3回発生した。全てGitHubのアクション実行環境からEC2への接続が瞬間的に遅延したものだった。サーバーは正常なのに「502」が返ってきた。

原因はcurlのタイムアウト設定が短すぎたことだ(最初は5秒)。サーバーが重い処理をしている瞬間に監視が走ると、5秒以内に返答できなかった。タイムアウトを15秒に伸ばし、リトライを2回に設定してから誤報はほぼゼロになった。

メール通知の改善

最初の通知メールはシンプルすぎた。「dxgame.jp — HTTP 502」だけでは、「何を確認すればいいか」が分からない。対応手順のチェックリストをメール本文に含めるようにした。「1. SSHでEC2に接続 2. systemctl status dxgame を確認 3. ログを確認する手順」を本文に入れた。深夜に通知を受け取っても、半覚醒でも対応できる。

監視は「問題を早く知る」だけでなく「問題を早く解決できる」設計まで含めて価値が出る。


*次回は「緊急融資ボタンが研修を救った話」*

実際に監視が発動した朝の対応記録

死活監視を設置して2週間後、実際に通知メールが届いた。

朝6時47分、件名「[dxgame] 本番障害検知 — dxgame.jp HTTP 502」のメールを受信した。研修は10時から。3時間以上ある。

SSHでEC2にログインし、systemctl status dxgame を確認。サービスは動いている。しかしnginxが502を返している。journalctl でログを確認すると、メモリ不足でuvicornのワーカープロセスが1つ落ちたことが分かった。不要なプロセスを終了し、systemctl restart dxgame を実行。502が解消した。この対応に要した時間は18分だった。

通知メールに「確認すべきコマンドのチェックリスト」を入れておいたことで、半覚醒でも手順を迷わず踏めた。1. SSHでEC2に接続 2. systemctl status dxgame を確認 3. journalctl でログ確認 4. 問題のプロセスを特定 5. 再起動——この手順をメール本文に埋め込んでいた。

誤報への対応も重要だった。設置当初1週間で誤報が3回発生した。curlのタイムアウトが5秒で、サーバーが重い処理中の瞬間に監視が走り502と判定されていた。タイムアウトを15秒に伸ばし、2回リトライして両方失敗した場合のみ通知するように変えた。この設定変更後、誤報はほぼゼロになった。

もし監視がなければ、参加者が10時に「繋がらない」と連絡してから対応が始まっていた。研修が遅延し、参加者の信頼を失っていた可能性が高い。

*シンプルシステム株式会社 代表 伊藤勝彦*