Toxiproxyを使って簡単にネットワーク障害のテストを実施する
2024.10.25
システム開発では、予期しないケースに備えたテストが重要です。
この記事では、ネットワーク障害や遅延を再現し、簡単にテストできるツール「Toxiproxy」の概要と使用方法について説明します。
目次
Toxiproxy とは?
Toxiproxy は、プロキシを介してサービス間の通信に遅延やエラーを発生させることができるツールです。ネットワーク障害をシミュレートするために設計されており、以下のシナリオで特に効果的です。
- レスポンス遅延
- コネクションの切断
- パケットロス
- 帯域制限
私の場合、フロントエンド開発時にあえてレスポンスを遅延させ、ローディング画面がどのような挙動になるかを調査するために使用しました。
導入方法
前提
今回は以下が導入済みの環境で Toxiproxy を利用します。
- Docker CLI (Docker Compose)
- Homebrew
ネットワーク障害が発生したと想定した API の代用として利用した Mock サーバーは Prismで作成しています。
※ テストしたい対象の API などがある場合、Mock サーバーは不要です。Mock サーバーはこちらを利用します。
Mock サーバーの利用方法
clone 後のリポジトリ直下で以下のコマンドにより Mock サーバーを起動します。
docker compose up
curl コマンドを用いて、動作確認を行います。
curl --include http://localhost:8080/user/login
以下のように正常レスポンスが返却されることが確認できれば OK です。
Toxiproxy のインストール
まずは Toxiproxy をインストールしましょう。
今回は Homebrew を使ってインストールします。
brew tap shopify/shopify
brew install toxiproxy
使い方
プロキシの作成
まず最初に、ローカルのサーバに対してプロキシを作成します。
以下のコマンドでプロキシサーバーを起動します。
toxiproxy-server
サーバーが起動するとプロセスがフォアグラウンドで起動しっぱなしになるので別タブを開きましょう。
そして、Toxiproxy が監視するプロキシを設定します。
ここでは、Mock サーバー間の通信に対して串を刺していきます。
toxiproxy-cli create -l localhost:9080 -u localhost:8080 petstore-api
このコマンドは、ローカルのポート 9080 で Listen し、8080 ポートで待ち構える Mock サーバーに転送するプロキシを作成し、「petstore-api」という名前で管理しています。
以下のコマンドで作成したプロキシの状態を確認します。
toxiproxy-cli list
作成したプロキシが表示されていれば OK です。
curl コマンドで動作確認をしてみましょう。今後の結果と比較するため、 verbose オプションや trace-time オプションをつけてネットワークの様子を表示させておきます。
curl --verbose --trace-time http://localhost:9080/user/login
正常なレスポンスが帰っていることが確認できれば OK です。
障害のシミュレート
次に、プロキシを利用してネットワーク障害をシミュレートしてみましょう。
レスポンス遅延の場合
レスポンス遅延を追加するには以下のように行います。
toxiproxy-cli toxic add -t latency -a latency=5000 petstore-api
このコマンドは、「petstore-api」に対して 5000 [msec] の遅延を追加しています。
curl コマンドで確認してみましょう。
curl --verbose --trace-time http://localhost:9080/user/login
以下の部分で5秒かかっていることが確認できます。
01:13:13.404244 * Request completely sent off
01:13:18.416651 < HTTP/1.1 200 OK
コネクションの切断の場合
コネクションの切断の場合は以下のように行います。
toxiproxy-cli toxic add -t timeout -a timeout=5000 petstore-api
このコマンドは、「petstore-api」に対して 5000 [msec] 後にコネクションの切断を追加しています。
以下の部分でコネクションが切断され、レスポンスが返却されていないことが確認できます。
01:31:17.311823 * Request completely sent off
01:31:22.324052 * Empty reply from server
01:31:22.324146 * Closing connection
curl: (52) Empty reply from server
パケットロスの場合
パケロスを発生させる場合は以下のように行います。
toxiproxy-cli toxic add -t limit_data -a toxicity=0.1 petstore-api
このコマンドは、「petstore-api」に対して 10 [%] のパケロスを発生させています。
パケロスによってレスポンスが返却されていないことが確認できます。
帯域制限の場合
帯域制限を追加する場合は以下のように行います。
toxiproxy-cli toxic add -t bandwidth -a rate=1024 petstore-api
このコマンドは、「petstore-api」に対して 1024 [KB/s] の帯域制限を追加できます。
今回は Mock サーバーからのレスポンスが小さすぎて検証が難しいため、ここでは紹介のみとします。
プロキシを削除する
以下のコマンドで各種障害を含むプロキシを削除することができます。
toxiproxy-cli delete petstore-api
おわりに
Toxiproxy を使えば、様々なネットワーク障害を簡単にシミュレートでき、開発やテストで非常に便利です。この記事では基本的な使い方を紹介しましたが、さらに詳しい情報は Toxiproxy の README を参照し、他の障害もぜひテストしてみてください。
それでは。
システム開発・保守、導入支援など、
お気軽にご相談ください