Amazon DevOps Guru で NAT Gatewayの異常負荷を検出してみた
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の過負荷や、異常な利用を検出する手段の一つとして、ぜひお試しください。