AWS Gateway Load Balancer の TCP フローのアイドルタイムアウト対策

記事タイトルとURLをコピーする

ネットワーク係の手塚です。

はじめに

本記事は、AWS Gateway Load Balancer の TCP フローのアイドルタイムアウトに対するベストプラクティスの紹介です。

AWS Gateway Load Balancer の導入前に一読いただけると幸いです。

AWS Gateway Load Balancer の TCP フローのアイドルタイムアウトとは?

AWS Gateway Load Balancer は自身を経由する TCP フローと転送先のターゲットの紐付けのため、TCP フローを持ちます。

この TCP フローは 350 秒固定のアイドルタイムアウト値が設定されており、この値の変更はできません。

350 秒以上通信が経由しない TCP フローは削除されます。

影響は?

AWS Gateway Load Balancer を経由し、350 秒以上の無通信が発生した TCP アプリケーションについて、以降の通信継続が不可となる可能性があります。

影響を受けるアプリケーションは?

我々が確認した限りでは、次のアプリケーションに対策が必要でした。

  • Active Directory のサイト間レプリケーション
  • DB 接続のコネクションプーリング
  • SAP GUI
  • Oracle データベース・リンク (弊社佐竹の記事) # 2023年6月12日追記
  • RPA ツールの通信 (詳細は不明)
  • OpenSSH (再現検証で使用)

上記は一例で、該当するアプリケーションは無数にあると考えます。

ベストプラクティス

AWS Gateway Load Balancer の TCP フローのアイドルタイムアウト影響を回避するためのベストプラクティスは、「クライアントもしくサーバ」の「アプリケーションもしくはOS」設定により、TCP 通信を 350 秒未満の間隔で発生させること、です。

上記設定により、AWS Gateway Load Balancer 上の TCP フローは維持されつつ、待機時間が 350 秒を超える TCP アプリケーションを、AWS Gateway Load Balancer 経由で利用できます。

次はアプリケーションと OS の設定例です。

アプリケーション設定例

例) SSH クライアントから 60 秒に 1 回、メッセージを送信

ssh username@server -o ServerAliveInterval=60

利用アプリケーションにて、 350 秒未満の TCP キープアライブに該当する設定がない場合、次の OS 設定で対応します。

OS 設定例

OS による TCP キープライブ設定は、クライアントもしくはサーバのどちらか一方に設定があれば、有効になります。

主要 OS のデフォルトは 7,200 秒であるため、これを 350 秒未満に変更します。

例) Linux OS の TCP キープライブ間隔を 60 秒に設定

net.ipv4.tcp_keepalive_time = 60

例) Windows OS の TCP キープアライブ設定

次のサイト記載の「1. TCP コネクションの接続状態管理に利用されるパラメーター / KeepAliveTime 」が該当します。

social.technet.microsoft.com

上記は OS 上の全ての TCP 接続で有効となるため、本番機への投入時は注意です。

より大きな値にすることで負荷は軽減しますが、350 秒未満である必要があります。

他の対策はないか?

「クライアント・サーバ設定の変更は難しい」「AWS 側で対応できないか ?」というリクエストをよくいただきますが、 まず 本記事のベストプラクティスの実施をお願いします。

現状、セカンドベストは無く、アプリケーションもしくは OS の TCP キープアライブ設定が、ベストプラクティスかつ唯一の対策です。

AWS 公式ベストプラクティスについて

次の記事は AWS Gateway Load Balancer の公式ベストプラクティスです。この中の 1 番目の章に、本記事のベストプラクティスが含まれます。

aws.amazon.com

  1. Tune TCP keep-alive or timeout values to support long-lived TCP flows)

ファイアウォールのタイムアウトを 350 秒未満にする案は ?

次の文に記載されている、ファイアウォールのタイムアウト設定と考えますが、本記事では推奨しません。

To prevent this from happening, we recommend configuring the TCP keep-alive setting to less than 350 seconds on either client/server’s application/Operating System (OS) or update your firewall’s timeout settings to less than 350 seconds for TCP and less than 120 seconds for non-TCP flows

Best practices for deploying Gateway Load Balancer | Networking & Content Delivery

これを防ぐには、クライアント/サーバーのアプリケーション/オペレーティングシステム(OS)でTCPキープアライブ設定を350秒未満に設定するか、ファイアウォールのタイムアウト設定をTCPで350秒未満、TCP以外のフローで120秒未満に更新することを推奨します。

DeepL Translate: The world's most accurate translator による翻訳

推測ですが、上記のファイアウォール設定による対策は、次の 2 つの前提条件で成り立つと考えます。

  1. ファイアウォールは、自身の TCP フローのアイドルタイムアウト時に TCP リセットを送信する。
  2. クライアントおよびサーバのアプリケーションは、TCP リセットを受信しても、アプリケーション終了やエラーを発生させず、新規 TCP 接続で通信を継続できる仕様である。

この前提では、対策の可否がファイアウォール仕様に加えてクライアント・サーバ仕様にも依存するため、クライアント・サーバの TCP キープアライブ設定による対策と比較すると汎用性が低く、広く推奨しづらいと考えます。

おわりに

AWS Gateway Load Balancer の導入前に、これを利用するクライアント・サーバ管理者に本記事のベストプラクティスの周知と実施が必要と考えます。 しかし実際には対策漏れも発生しうるため、影響が発生した環境に対して、速やかに本記事のベストプラクティスの情報を提供ができる体制が重要と考えます。

また本記事では、ベストプラクティスが唯一の対策である理由について、説明することができませんでしたが、ネットワークエンジニアは把握したい内容と考えるため、別の記事で共有させていただきます。

以上

手塚 忠 (Tadashi Tetsuka) 記事一覧はコチラ

カスタマーサクセス部所属、2019 年 2 月入社のネットワークエンジニア。シリアルコンソールがマネジメントコンソールに変わったが、スイッチ愛は今も変わらず。 2023 Japan AWS Top Engineers (Networking), 2023 AWS ALL Certifications Engineers