Beanslabo
Tech Blog

技術ブログ

Toxiproxyを使って簡単にネットワーク障害のテストを実施する

2024.10.25

こんにちは!バックエンドエンジニアの Yui です。

システム開発では、予期しないケースに備えたテストが重要です。
この記事では、ネットワーク障害や遅延を再現し、簡単にテストできるツール「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 を参照し、他の障害もぜひテストしてみてください。

それでは。

Related

関連記事

Recommend

おすすめ記事