
はじめに
ドーモ、浮田です。
AWS Fargateは、インフラの管理を意識することなくコンテナを実行できるサーバーレスなコンピューティングエンジンです。 EC2のようにインスタンスを管理する必要がなくスケーラビリティに優れているため、マイクロサービスやバッチ処理など様々な用途で活用されています。 一方で、Fargateにはいくつか制約があり、EC2と比較するとネットワークトラブルの調査や通信の詳細な解析といったトラブルシューティングが難しいという欠点があります。
今回は、そうした制約の中でもより細かなトラブルシューティングを行うために、Amazon ECS(Fargate)で起動したコンテナでパケットをキャプチャする方法について解説します。
パケットをキャプチャする方法
AWSサービス
- Amazon VPCトラフィックミラーリング
ネットワークのトラブルシューティングやセキュリティ監視、コンテンツ検査などを行う際に有効な手段として、Amazon VPCトラフィックミラーリングがあります。 これは、ネットワークインターフェイス(以下、ENI)で送受信されるトラフィックを別のENIへミラーリングすることで、パケットをキャプチャすることができるAWSのサービスです。 このサービスを使えば、ECSタスクやELB、特定のEC2インスタンスなどに紐づくENIのパケットをキャプチャすることができます。
ただし、注意点もあります。 これらのAWSリソースはスケールアウトによりENIが増加するため、ミラーリング対象のENIを動的に管理する必要があります。 継続的にトラフィックをミラーリングするにはAmazon EventBridge + AWS Lambdaなどを組み合わせて、トラフィックミラーセッションを自動的に更新する仕組みを構築する必要があり、運用コストが増大したり、構成の複雑さが増します。
因みに、スケールインにより監視対象のENIが削除されると、対応するトラフィックミラーセッションはAWSによって自動的に削除されます*1。
また、近しいサービスとしてVPCフローログがありますが、IPトラフィックに関する情報を記録するものでありペイロードまでは確認できません。 そのため、詳細なトラブルシューティングや通信内容の解析には不向きです。
2025/9/24(水)に、弊社の和田がAmazon VPCトラフィックミラーリングのセットアップ方法について解説します。 Amazon VPCトラフィックミラーリングについて詳しく知りたい方は、ぜひご参加ください! tech.nri-net.com
パケットキャプチャツール
- tcpdump
tcpdumpは、広く利用されているパケットキャプチャツールです。 パケットをリアルタイムで取得・表示することができ、ネットワークのトラブルシューティングや通信内容の解析に非常に有効です。 シンプルなコマンドで動作し軽量であるため、扱いやすいのが特徴です。 特定のポートやプロトコルに絞ってキャプチャすることもでき、バイナリログを保存して後から解析することも可能です。
- tshark
GUIベースのパケット解析ツールであるWiresharkのコマンドライン版です。 tcpdumpと同様にパケットキャプチャが可能ですが、より高度なフィルタリング機能やプロトコル解析機能を備えている点が特徴です。
AWS Fargateでパケットをキャプチャする
継続的なパケットキャプチャを想定し、今回はAmazon VPCトラフィックミラーリングではなくtcpdumpでパケットをキャプチャします。
AWS Fargateでtcpdumpを実行するときの注意点
AWS Fargateは、サーバーレスでコンテナを実行できる便利なサービスですが、EC2と比べて低レイヤの操作が制限されています。 AWS Fargateでは特権モードの使用ができず、Linuxカーネルのケーパビリティにも制限がある*2ため、tcpdumpのようなツールを使う際には注意が必要です。 これらの制約により、EC2でのパケットキャプチャと同じような挙動を期待すると、うまく動作しないケースがあるので気をつけましょう。
システム構成

今回の検証では、既に構築済みであるALB + Nginxの構成に対して、Amazon ECS(Fargate)でtcpdumpを使いパケットをキャプチャします。 簡易的な検証のため、ALBにはSSL証明書を設定していません。 また、tcpdumpはNginxコンテナのサイドカーコンテナとして別コンテナを起動します。 ログは、Amazon CloudWatch Logsへ出力します。
tcpdumpコンテナがNginxコンテナのパケットをキャプチャできるの?と疑問に思う方もいるかもしれません。 AWS Fargateのネットワークモードはawsvpcで、ECSタスクにアタッチされたENIを同一タスク内のコンテナが共有しています*3。 そのため、tcpdumpコンテナは同じENIを通じて行われる通信をキャプチャすることができ、サイドカー構成でもパケットの取得が可能です。 ECSタスクとコンテナが具体的にどのようなネットワーク構成になっているのかは別途記事にしたいと思います。
dockerfileの作成
ベースイメージとしてAmazon Linux 2023を指定し、tcpdumpをインストールします。 今回は、NginxのWelcomeページにアクセスしたときのパケットをキャプチャするため、TCPの80番ポートに絞ってパケットを取得します。 また、-Aオプションを使いペイロードをASCII形式で表示するようにしています。
FROM amazonlinux:2023
RUN dnf install -y tcpdump && \
dnf clean all
ENTRYPOINT ["tcpdump", "-i","eth1", "-A","tcp","port","80"]
tcpdumpコンテナを起動
作成したdockerfileをもとに、ローカル環境でtcpdumpイメージを作成します。
docker build -t tcpdump .
作成したイメージをAmazon ECRへプッシュします。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com docker tag tcpdump:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<ECRリポジトリ名>:tcpdump docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<ECRリポジトリ名>:tcpdump
最後に、ECSタスク定義にtcpdumpコンテナを追加し、ECSタスクを更新します。

動作検証
ECSタスクにNginxコンテナとtcpdumpコンテナが起動している状態でブラウザからALBのDNS名にアクセスすると、NginxのWelcomeページが正常に表示されました。

検証結果
CloudWatch Logsにtcpdumpの結果が出力されており、HTTPレスポンスの内容を確認することができました。
この結果から、Amazon ECS(Fargate)環境でもtcpdumpによるパケットをキャプチャすることが実証されました。

おわりに
今回は、Amazon ECS(Fargate)でtcpdumpを実行しパケットをキャプチャする方法について紹介しました。 AWS Fargateはインフラ管理の手間が少ない一方で、トラブルシューティングの難しさが課題となることがあります。 サイドカーコンテナとしてtcpdumpを実行することで、既存のアプリケーションコンテナに影響を与えることなく、通信内容を取得することが可能です。 この手法により、パケットレベルでの調査が可能となりネットワークトラブルの原因特定や通信の詳細な解析など、より深いレベルでの対応が可能になります。
*1:https://docs.aws.amazon.com/vpc/latest/mirroring/traffic-mirroring-sessions.html
*2:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-security-considerations.html
*3:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-task-networking.html
*4:https://docs.docker.com/reference/build-checks/json-args-recommended/#workarounds
X : @08ukt
執筆:AWSの薄い本の合本 Vol.01