Amazon DevOps Guru で NAT Gatewayの異常負荷を検出してみた

DevOps Guruの機械学習を利用した監視対象としてNAT Gatewayを設定。NAT Gatewayの過負荷利用を再現して、監視の挙動を確認してみました。
2023.03.08

Amazon DevOps Guru、通常から逸脱した動作を機械学習 (ML) を利用して検出することが可能なサービスです。

今回、DevOps Guru監視対象のリソースとして NAT Gatewayを設定。 同時接続数上限を超えるNAT Gatewayの負荷がDevOps Guruのインサイトとして異常検出できる事と、 NAT Gatewayの増強を試す機会がありましたので、紹介させていただきます。

検証環境

構成概要図

VPC

VPCウィザードを利用、1つのAZに NATゲートウェイを配置したVPCを作成しました。

NAT Gateway

Amazon DevOps Guru の監視対象とする NAT Gateway にタグを追加しました。

  • タグエディタを利用、リソースタイプとして「AWS::EC2::NatGateway」を指定して、リソースを検索

  • 監視対象とするリソースを指定

  • タグ追加

以下設定としました。

  • タグキー: devops-guru-cm-202303
  • タグ値: test-vpc-1

DevOps Guru の監視対象とするタグのキーは「DevOps-Guru-」に前方一致する必要があります。

複数のVPCが存在するアカウントの場合、タグ値をVPCの判別ができる内容とすることで、 DevOps Guruの検出結果が判別しやすくなります。

DevOps Guru

特定のNAT Gatewayのみを監視対象とするため、分析するリソースの選択は「タグ」を指定します。

  • タグキー: devops-guru-cm-202303
  • タグ値: test-vpc-1

先に設定したタグキー、タグ値で設定しました。

分析されたリソースとして、監視対象となる NAT Gatewayが反映されました。

ALB

固定レスポンス応答を戻すALBを、NAT Gatewayとは異なるVPC (デフォルトVPC) に設置しました。

EC2

キープアライブ時間を延長するオプション指定したcurlコマンドを、NAT Gatewayに負荷をかけるアプリケーションとして利用しました。

別VPCのALBに対し、NAT Gateway経由で接続するスクリプトを用意しました。

time for i in `seq 0 10000` ; do 
 ( curl --keepalive-time 60 -s xxxx-xxxx.us-west-2.elb.amazonaws.com > /dev/null &)
done

NAT Gatewayを利用するプライベートサブネットに複数のEC2インスタンスを起動。 NAT ゲートウェイの最大 55,000 件の同時接続上限を超える通信を再現させました。

結果

事後的インサイト

DevOps Guru の事後的インサイトとして、 「NATGateway ErrorPortAllocation Anomalous」が検出されました。

集約されたメトリクス

インサイトの詳細画面では、「集約されたメトリクス」として 異常値が検出されたメトリクスと検出時間が確認できました。

  • AWS/NATGateway:ActiveConnectionCount
  • AWS/NATGateway:ErrorPortAllocation
  • AWS/NATGateway:IdleTimeoutCount

グラフ化された異常

「グラフ化された異常」として、異常値を示したグラフが確認できました。

継続して稼働している環境であれば、グラフの表示期間を変更する事により、過去の再発状況を把握することが可能です。

対処

NAT Gateway 性能増強

セカンダリIPの関連付けの追加による、NAT Gatewayの性能増強を試みました。

セカンダリIPの設定後、同等の負荷テストを実施して、NAT Gateway の「ConnectionEstablishedCount」が倍増した事を確認できました。

今回、NAT GatewayはシングルAZ配置のままセカンダリIPを追加する事で性能向上を図りましたが、 NAT GatewayをシングルAZ配置で利用しているシステムは、AZ障害で大きな影響を受ける可能性があるため、 まずNAT GatewayのマルチAZ配置をご検討ください。

また、NAT Gatewayの多用は通信コストの増加要因となる場合があります。

適切なキープアライブ利用や、コネクションプールの活用などアプリケーションの改修、 AWSのエンドポイントとの通信が多いワークロードの場合、VPCエンドポイントの活用などもあわせてご検討ください。

まとめ

NAT Gateway 性能のボトルネックがサービス影響に直結するシステムでは、 CloudWatch を使用した監視アラーム設定が可能ですが、多数のアラーム管理が課題となったり、 負荷変動が大きなワークロードではしきい値の設定が難しい場合があります。

Amazon CloudWatch による NAT ゲートウェイのモニタリング

今回の作成直後の NAT Gateway に対し性能限界を超えた負荷をかけた検証を試みましたが、 長期稼働中の NAT Gateway を監視対象とした DevOpsGuru のインサイトでは、「ErrorPortAllocation」が発生しない段階で、「ActiveConnectionCount」「IdelTimeoutCount」の異常変化を捉えた事もありました。

DevOps Guruを利用した NAT Gatewayの監視、簡単な設定で 1時間あたり0.0042 ドル、月額約3ドルで利用可能です。 NAT Gatewayの過負荷や、異常な利用を検出する手段の一つとして、ぜひお試しください。