クラウドの「見えない門番」NATゲートウェイが、あなたのコネクションを突然切る理由
こんにちは!SREとして日々クラウドのネットワークと格闘していると、時々こんな悲鳴が聞こえてきます。
「昨日まで動いていたバッチ処理が、急にタイムアウトで落ちるようになった」
「長時間待機するデータベース接続が、いつの間にか切断されている」
実はこれ、クラウドのインフラに潜む「NATゲートウェイの気まぐれな掃除」が原因であることがほとんどなんです。今日は、なぜNATゲートウェイが勝手にコネクションを切ってしまうのか、どうすればそれを防げるのかを、身近な例えを交えて紐解いていきましょう。
—
郵便局の「宛先管理簿」をイメージしてみよう
皆さんは、海外の知人に手紙を出すときを想像してみてください。
あなたがプライベートサブネット(外の世界から隠れた部屋)にいるとしましょう。外の世界(インターネット)に手紙を送るには、必ず「NATゲートウェイ」という郵便局を通る必要があります。
郵便局は、あなたの手紙を送り出すときに「誰から、どこへ」というメモ(変換テーブル)を管理簿に書き込みます。そして、返事が返ってきたときに、そのメモを見て「あ、これは〇〇さんの宛先だな」と手渡してくれるわけです。
ここで問題になるのが、「管理簿のスペースには限りがある」という点です。
ずっと返事が来ない、あるいはやり取りがない手紙のメモをいつまでも管理簿に残しておくと、新しい手紙を出すスペースがなくなってしまいますよね?だから郵便局は、「一定時間動きがないメモは、古いものからシュレッダーにかける(=強制切断する)」というルールを設けています。
これが、クラウドにおける「NATゲートウェイのアイドルタイムアウト」の正体です。
—
「アイドルタイムアウト」という名の強制終了
AWSのNATゲートウェイの場合、デフォルトのタイムアウト時間は 350秒 です。これは、最後に通信をしてから350秒間、パケットが一切流れないと「もうこのコネクションは使われていないな」と判断され、容赦なくコネクションが破棄されることを意味します。
もし、データベースとの接続を長時間維持し続けたいアプリの場合、この350秒の壁を超えた瞬間に、コネクションが「死んだ状態」になってしまうのです。
—
解決策:郵便局に「まだ生きてます!」と伝え続ける
では、どうすればこの「強制シュレッダー」を防げるのでしょうか?
一番スマートな方法は、「キープアライブ(Keep-Alive)」という仕組みを使うことです。これは、「何も用事はないけれど、定期的に『私はまだ生きてますよ!』という小さなパケットを相手に送る」というテクニックです。
郵便局の例で言えば、時々「特に用事はないけど、このメモはまだ使うからシュレッダーしないでね!」と窓口に伝言を置いておくようなものですね。
実践:TCPキープアライブの設定例
多くのプログラムやDBドライバーには、この「定期的に生存確認パケットを投げる」機能が備わっています。
1. Linuxのカーネル設定で調整する場合
サーバー全体で設定を効かせたい場合は、/etc/sysctl.conf を編集します。
# 7200秒(2時間)待たずに、60秒ごとに確認パケットを投げ、
# 失敗しても3回繰り返す(=計3分で異常と判断する設定)
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3
※ 設定反映には sudo sysctl -p を実行してくださいね。
2. Python (SQLAlchemy) でDB接続する場合
アプリケーションコード側で設定を制御するほうが、より確実で現場では好まれます。
from sqlalchemy import create_engine
# DB接続設定にキープアライブを組み込む例
engine = create_engine(
"postgresql://user:pass@localhost/dbname",
connect_args={
"keepalives": 1, # キープアライブを有効化
"keepalives_idle": 30, # 30秒間アイドルなら確認パケットを送る
"keepalives_interval": 10, # 10秒間隔で再送
"keepalives_count": 5 # 5回失敗したら切断とみなす
}
)
—
まとめ:ネットワークは「生き物」だと思って接しよう
今回お伝えした「NATゲートウェイのタイムアウト」は、インフラエンジニアなら誰もが一度は通る登竜門です。
- NATゲートウェイは、限られたリソースを守るために、使われていないコネクションを強制終了する。
- その時間は、クラウドサービスごとに決まっている(AWSは350秒が標準)。
- 防ぐには「キープアライブ」で、「まだ生きてます!」と定期的に信号を送る。
ネットワーク上のパケットは、目に見えませんが、郵便配達員のように一生懸命動いています。もしアプリが突然つながらなくなったら、「あ、郵便局がメモをシュレッダーしちゃったかな?」と想像してみてください。きっと、トラブルシューティングの糸口が見つかるはずです。
それでは、また次回の記事でお会いしましょう!Happy Hacking!
コメント