【AWS】Amazon CloudWatch Network Flow Monitorを最速で体験してみた【re:Invent2024】

## はじめに

AWS re:Invent2024でGAとなった新しいネットワーク監視サービスであるAmazon CloudWatch Network Flow Monitorを早速触ってみました！

Network Flow Monitorは、モニターを作成してAWSワークロードのネットワークパフォーマンスを監視できるサービスです。
これまでCloudWatchで利用可能なネットワークモニタリングサービスとしては、以下の2つがありました。
- Amazon CloudWatch Internet Monitor : AWSアプリケーションとエンドユーザ間のインターネット通信のパフォーマンスを監視
- Amazon CloudWatch Network Synthetic Monitor (Network Monitorから名称が変わったようです) : Direct ConnectやSite-to-Site VPNを利用したハイブリッドネットワークのEnd-to-Endでのパフォーマンス監視

今回GAとなったNetwork Flow Monitorは、これらに続く3つ目のネットワーク監視系サービスで、AWS内のネットワークパフォーマンスを監視できるマネージドサービスです。
現在はEC2やEKSのインスタンス同士、インスタンスからS3, DynamoDB, RDSなどのAWSサービスへの通信が監視対象としてサポートされています。

今まで、AWSワークロード内の通信要件の確認ツールとしてAmazon VPC Network Access Analyzerがありましたが、Network Flow Monitorは設定情報をもとに通信要件を確認するのではなくAgentが収集した実トラフィックに基づくメトリクスを提供する、通信に問題があるときにAWS側の問題なのかユーザ側の問題なのか切り分けができるという違いがあります。

Network Flow MonitorはCloudWatchのコンソール画面からアクセス可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/6427a7d2-da98-c1cb-6eb1-aff9b13cdb16.png" width="20%">

Network Flow Monitorの詳細は以下の記事をご覧ください。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-cloudwatch-network-monitoring-workloads-monitors/

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-What-is-NetworkFlowMonitor.html

## やったこと

以下の検証を実施しました。

- EC2上にWebサーバを建てて、別のEC2から定期的にHTTP通信を実行する
- AZ内及びAZ間で通信を行い、それぞれを監視できることを確認する
- セキュリティグループを変更し、HTTP通信を遮断した際のメトリクスの変化を観察する

構成図は以下の通りです。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/76a8a169-e0be-3ab9-1c7f-40fc8c728f58.png)


## 環境構築

Network Flow Monitorを利用できるようにするには、以下のステップを踏む必要があります。

1. Network Flow Monitorの有効化：CloudWatchのコンソール画面で有効化することで、Network Flow Monitorのサービスロールに必要な権限が許可され、CloudWatchにメトリクスが送信されるようになります。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/b3b2ddf1-9a73-89b0-c38c-0836df7eb219.png)

2. Network Flow Agentのインストール：AWS Systems Managerのディストリビューターで`AmazonCloudWatchNetworkFlowMonitorAgent`を実行することで、監視対象のインスタンスにFlow Monitor Agentをインストールできます。Agentがインストールされると、自動でメトリクスの送信が始まります。(現状、メトリクスの送信まで20分ほどかかるらしい)
    
    2-1. AWS Systems Managerのディストリビュータで`AmazonCloudWatchNetworkFlowMonitorAgent`を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/e0fdaa51-5510-644c-6ce9-938d5f5cac61.png)
    
    2-2. 「1回限りのインストール」を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/2659dc45-8ef3-5bf0-0a77-dcde62f1907e.png)
    
    2-3. コマンドの実行画面で、監視対象のインスタンス (通信の送信元)を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/7ed89cd8-a9e6-9229-b95d-1515b8242c5a.png)


Network Flow Monitorの環境が構築されると、後述するワークロードインサイトでメトリクスが可視化されるようになり、モニター作成の準備が整います。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-configure-begin.html

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-agents-ec2.html


## モニター作ってみた

環境を構築できたので、実際にNetwork Flow Monitorを使ってみました。
Network Flow Monitorは大きく、ワークロードインサイトとモニターの2つの機能で構成されます。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-components.html

### ワークロードインサイト

ワークロードインサイトは、Agentが取得したメトリクスを様々なスコープで可視化します。
メトリクスはAZ内、AZ外、VPC間、AWSサービス向けに自動でカテゴライズされ、各カテゴリごとにメトリクスの値が大きなワークロードが可視化されます。
ワークロードインサイトで可視化されたワークロードを選択することで、モニターの作成画面に移動することができ、ワークロード間でのメトリクスの比較としてもモニター作成の前情報としても便利な機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/8c49d75c-09c8-b89a-677f-f2ab6c2c8190.png)

### モニター

モニターの作成画面では、監視したいワークロードの両端となるローカルリソースとリモートリソースを選択します。
ローカルリソースは、Agentがインストールされたリソースの所属するサブネットやVPCを、リモートリソースは通信の宛先を選択します。ローカルリソースとリモートリソースは様々なスコープで複数リソースを選択できるので、監視経路を柔軟に選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/f79d33c9-6c21-d44b-5727-a4eaba016b9c.png)

実際にAZ内の通信を監視するモニターを作成してみました。
モニターを作成して数分経過すると、メトリクスの表示が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/536f55f9-1f18-d00b-0f5d-2778f853be1e.png)

モニターでは以下のメトリクスを取得できます。

- ネットワークヘルスインジケータ (NHI)
- RTT
- TCP再送信回数
- TCP再送信タイムアウト回数
- 転送されるデータ量

NHIは監視ワークロード内にてAWSの責任範囲内のネットワークパフォーマンス低下が発生しているかを示す2値のメトリクスです。正常時はHealthy、異常時はDegradedと表示されます。また、NHIの棒グラフを見ることで過去にいつ異常が発生していたのかを確認することもできます。
ワークロードに通信障害などの異常が発生した時に、NHIを確認することでユーザ起因の障害なのかAWS起因の障害なのかを切り分けることができます。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-monitor-and-analyze.html

Historical Explorerでは、TCP再送信が発生したワークロード上のノードが全て可視化されます。(スゴすぎる...!)
ネットワークパフォーマンスが低下した時はHistorical Explorerで表示されるリソースを確認すると、迅速に問題を切り分けられそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/818025e3-173a-e867-74e8-e873cd18ac7e.png)

## 色々遊んでみた

せっかくなので、色々条件を変えてメトリクスを比較してみました。

### AZ内の通信とAZ間の通信を比較

AZ内とAZ間でそれぞれモニターを作成して、地理的に距離が変わるとメトリクスに変化があるのか検証してみました。

AZ内の通信を監視するモニター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/3012b4be-de4f-0d90-b60f-6789094c7f79.png)

AZ間の通信を監視するモニター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/b42483a9-b59e-9d6b-315f-ebfed79a6357.png)

やはり、地理的に離れているAZ間の通信の方がRTT値は大きくなっていることが分かります。
また、AZ間の通信ではTCP再送信が発生していることが分かります。

### 通信を遮断してみた

リモートリソースのセキュリティグループを変更することで、ローカルリソースからの通信を拒否する設定にしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933583/1f0e3dd2-468b-d656-3def-ae3aa59a493a.png)

通信不可になったタイミングで、再送信とTCP再送信タイムアウトのメトリクスが大きくなりました。
CloudWatch AlarmでNHIをトリガーにしてAWS起因の通信異常を検知したり、NHIとその他のメトリクスを組み合わせることでユーザ起因の通信異常のみを検知したりなど、様々な用途に使えそうです！

Network Flow Monitorを利用したCloudWatch Alarmの設定例

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-create-alarm.html


## おわりに

今回はAWS re:InventでGAとなったNetwork Flow Monitorを体験しました。
手軽な環境構築でマネージドにネットワークパフォーマンスを監視できるのはとても便利だと感じました。特にNHIやHistorical Explorerは障害対応の切り分けで大きな武器になりそうな予感がします。

ちなみにNetwork Flow Monitorは12ヶ月分の無料枠があります。環境構築も簡単なのでぜひ試してみてはいかがでしょうか。

https://aws.amazon.com/jp/cloudwatch/pricing/

初めての投稿で拙い記事でしたが、最後までお読みいただきありがとうございました！Network Flow Monitorの魅力が伝われば嬉しいです。