どうもこんにちは、agiです。
最近は仕事が忙しかったり、インプットに時間を割くことが多かったり、資格勉強をしたりとなかなかこちらのブログを更新できなかったのですが、最近落ち着いてきたのでまた週1くらいのペースで投稿できればと考えています。今回はLightsail上で稼働させているサーバーの話です。
7 月 20 日午後、Lightsail上で定期実行しているYouTube収集Botが応答していないことに気づきました。
本記事では調査の経緯・原因・対策をサクッと残しておきます。
発端:Bot が沈黙
ping
… 要求タイムアウト- SSH接続 … 不可
- ⇒ サーバーダウンを疑う
応急対応:再起動 → 復旧
インスタンスを再起動したところ、すぐに復旧。
SSHもBotも正常動作を確認できました。
原因調査:journalctlを覗く
# 直近 5 時間のログを確認
sudo journalctl --no-pager --since "5 hour ago"
抜粋ログ
Jul 20 06:00:01 CRON[...] (agi) CMD (... youtube.py && discord_bot.py ...)
Jul 20 06:36:56 systemd-networkd-wait-online[...] Timeout occurred while waiting for network connectivity.
Jul 20 07:16:16 systemd-networkd-wait-online[...] Timeout occurred while waiting for network connectivity.
- cronは動作→サーバー本体はハングしていなかった
systemd-networkd-wait-online
がタイムアウトを繰り返し記録を確認できた。
結論:ネットワークが断続的に不安定
- サーバーは稼働(cronが証拠)
- ネットワークが不安定 →
ping
/SSH/Botが全滅
対策
対策 1:systemd-networkd-wait-online を無効化
sudo systemctl disable systemd-networkd-wait-online.service
対策 2:自己監視スクリプトで自動再起動
・外部に2回pingを送り、両方失敗したら「ネットにつながらない」と判定。失敗時にログを残してから即再起動し、SSHやアプリが止まったままになる時間を防ぎます。
#!/bin/bash
ping -c 2 google.com >/dev/null
if [ $? -ne 0 ]; then
echo "$(date): Network unreachable, rebooting..." >> /var/log/self-reboot.log
sudo /sbin/reboot
fi
cron に登録
# /etc/crontab など
*/5 * * * * /path/to/self_check.sh
今後の方針
- 上記 2 つの対策を適用し、様子を見る
- 必要に応じてCloudWatchで外形監視を追加(するかもしれないししないかもしれない)
補足:systemd-networkd-wait-online とは?
OS 起動時に「ネットワークがオンラインになるまで待機」するユニット。
仮想環境では NIC 認識が遅れ、状態を誤判定してタイムアウト→ネットワークが 落ちたように見える 事例が散見される、、らしいです。
・参考文献↓
起動中に systemd-networkd-wait-online サービスがタイムアウトする問題を修正する方法 |Linux上のBaeldung
まとめ
- ネットワークのタイムアウトが原因で「サーバーダウン」と誤認していた
- システムは生きていたが、外部接続が断続的にダウン
systemd-networkd-wait-online
無効化 & 自己監視スクリプトで再発防止へ