[GCP]Connection TimeoutがCloud NATによって発生した例
-
2024年6月4日
はじめに
こんにちは。ココネでビリングシステムを担当しているサーバエンジニアのSです。
過去に担当しているサービスの本番環境でアクセスが集中した際に外部APIとのやりとりで大量のConnection Timeoutが発生することがありました。
当時、原因の特定に時間を要してしまいご迷惑をおかけしてしまった経験がありました。同じ問題にぶつかっている開発者の助けになればと思い記事にしました。
原因
結論から書くとタイトルの通り原因はCloud NATの設定でした。

PrivateサブネットからCloud NAT経由で外部通信していたのですが、Cloud NATにおいて紐付けられたVMインスタンスに割り当てられるポート数はデフォルトのままだと64のため、アクセスが集中した際に割り当てられたポート数が枯渇してConnection Timeoutが発生しました。
解決方法
いくつか対処法があります。
1. Cloud NATのVMインスタンスあたりの最小ポート数を増やす
システムの需要に合わせて最小ポート数を64から増やします。
Cloud NATは使用するVMインスタンス数の他にトラフィック量でも料金が加算されるのでコスト面で考慮が必要です。
2. VMインスタンスにPublic IPを付与してCloud NATを経由させない
今回は対象のCloud NATが他のプロジェクトと共有されていたため、影響を考えてこちらの方法で対処しました。
Cloud NATを使わなくなることでインスタンスが直接インターネットに公開されるためファイアウォールルールなど適切なセキュリティ対応が必要です。
Cloud NATが怪しい時は、Cloud Loggingを有効にして以下の検索条件で該当のログがあるかを検索してみてください。
resource.type="nat_gateway" jsonPayload.allocation_status="DROPPED"
(参考:Cloud NAT is dropping or limiting egress connectivity)
おわりに
ここまで読んでいただきありがとうございます。
添付した構成図を見ていただければ分かる通り真っ先にCloud NATを疑うべきだったのですが、「アプリケーションのHttpClientの設定に問題があるのではないか」「APIのRate Limitに引っかかったんじゃないか」等かなり遠回りしてしまいました・・・
今回のようなケースもあると頭の片隅に置いていただき、いつかこの記事が問題解決のお役に立てれば幸いです。