はじめに
複数コンテナを起動する構成のアプリケーションを構築するときに、障害に対する原因の切り分け方を覚えておくと便利です。
例えばRuby on Railsなどでアプリケーションコンテナを起動していていて、その前段にNginxなどでWebサーバコンテナを起動しているような構成を考えてみて下さい。
いざAWSにデプロイしてアクセスしてみたら500エラーのレスポンスしか返ってこない場合、どっちのコンテナに原因があるのかパッと見わからないと思います。あるいはロードバランサーなどAWSの設定にミスがある可能性もあります。
こういった時にNginxコンテナに入りtcpdump
でパケットキャプチャして死活監視をするだけで、原因を絞る事ができるのです。今回はFargateインスタンス内でtcpdump
によるパケットキャプチャを行う方法をまとめました。
※Fargateインスタンスとは言いましたが、Fargateに限らずLinux系のOSであれば使える方法です。
準備
各インスタンスは最小構成になっているので、特に設定を加えていない場合はほとんどのコマンドが使用出来ません。まずはWebサーバコンテナのインスタンスに接続して必要なパッケージをインストールしていきます。
※前回Fargateへの接続を簡単にする方法をまとめているので、興味のある方はこちらもご参照下さい。
パケットキャプチャ用にtcpdump
を、また標準設定だとifconfig
も使えないのでnet-tools
もインストールします。
$ apt-get install net-tools tcpdump
tcpdumpでパケットキャプチャしてみる
準備が出来たら下記のコマンドを実行して下さい。これは80番のポートで受信するパケットをキャプチャするコマンドです。
$ tcpdump -i eth1 src port 80
上記のコマンドを実行してから、アプリケーションにアクセスしてみてログが流れれば、Nginx(Webサーバコンテナ)は起動していてAWSの設定も概ね完了しているということになります。
つまりこの状態でも500エラーレスポンスが返るのはアプリケーションコンテナの方に問題があるという見方が出来るのです。tcpdump
コマンドを使うとこのような原因の切り分けを行うことが可能になります。
ちなみに-i eth1
で指定しているのはtcpdump
が標準だとeth0を見にいってしまうからです。自分の環境の場合AWSリソースはeth1をNWインタフェースに割り当てていたので、オプションを付与しています。
もしパケットをキャプチャ出来ない場合はifconfig
で使用しているNWインタフェースと、キャプチャしているNWインタフェースが合致していることを確認してみて下さい。
以上です。
終わりに
障害が起こった時に原因を切り分けて考えることは非常に大切です。
焦っていたり調べながらだとつい忘れてしまいますが、何処まで上手くいっていて何処でエラーが起こっているのかをしつこいくらい意識しなければいけないと思う今日このごろです。