株式会社ユーザベースの技術チームブログです。istioTweetSPEEDAの開発チームの石橋です。最近ではマイクロサービスでプロダクトを開発することが多くなってきていると思います。いった状況の中でマイクロサービスのテスト、特に異常系のテストをするコストがやや高いという話を何度か耳にしました。Injectionで「エラーが発生する」、「処理に時間がかかる」などの異常系のテストを容易に実現する方法を紹介します。異常系のテストをする際の課題サービスAとサービスBがあるとします。サービスAからサービスBにリクエストした際、サービスBがエラーになる可能性があります。した場合、そのエラーが他のマイクロサービスに伝播して、障害がシステム全体へと波及しないよう適切に処理する必要があります。適切な処理ができていることをテストするためは、「サービスAが正しいリクエストをしてもサービスBが必ずエラーを返す」状態を作らなければなりません。このような状況を作るためにはいくつか方法が考えられます。エラーを返すようにサービスBのコードを修正してデプロイする。エラーを返すモックサーバーを用意し、サービスAの向き先をサービスBからモックサーバーに変更する。これらの方法はやや面倒だと思います。前者はローカルで一時的に修正して確認する分にはよいかもしれませんが、正常系と混在している自動テストに組み込むことは困難です。Injectionはこの課題を解決します。バージョンが1.2.2のIstioを使用して動作確認しています。Kubernetesに必要なリソースを作成していきます。Gatewayはdefault、ServiceとDeploymentとDestinationRuleとVirtualServiceはexample-nsというnamespaceに作成していきます。VirtualServiceはDestinationRuleの後に作成してください。ファイル名を実行すれば、それぞれのリソースが作られます。※それぞれのリソースの概要や設定ファイルの詳細な書き方については割愛します。GatewayServiceDeploymentDestinationRuleVirtualServiceまた、外部からアクセスするためのエンドポイントを環境変数で定義しておきます。後で何度もアクセスするためです。Injectionする前に上の環境構築で作ったPodに対してアクセスし、正常に処理されることを確認します。done20020020020020020020020020020010回リクエストし、HTTPのステータスコード200が10回返ってきているので正常に処理されたことがわかります。Abortsここからが本題です。exampleというアプリケーションがHTTPのステータスコード500を返すようにします。virtual-service.yamlの内容を以下のように変更します。もとのvirtual-service.yamlの最後にHTTPのステータスコード500を必ず返す設定を追加しました。100500-virtual-service.yamlを適用し、上のcURLを再度実行します。done500500500500500500500500500500意図通り、すべてHTTPのステータスコード500が返ってきています。percentを変更すれば、任意の割合でHTTPのステータスコード500を返すことができます。Delays次はレスポンスが返ってくるのに時間がかかるパターンです。500-virtual-service.yamlの内容のhttpStatus:をfixedDelay:に変更しています。ここでは10sにしているので、レスポンスが10秒遅延します。システム全体が遅くならないために、呼び出し側のマイクロサービスがタイムアウトなどを適切に行えているかをテストする際に有用です。最後は少し応用的な例です。errorが付いていれば、HTTPのステータスコード500が返ってきます。付いていなければ、exampleというアプリケーション本来のレスポンスが返ってきます。errorを付けています。errorを付けていません。それぞれのcURLを実行すると、期待通りのステータスコードが返ってきます。'%{http_code}\n'200また、VirtualServiceのmatchは強力で、ヘッダー以外にもURI、ポート番号、クエリパラメータなどでマッチさせることができます。*2E2Eテストを実行する環境用のVirtualServiceを作り、そこに特定の条件でエラーや遅延が発生する設定を書いておけば、異常系のケースを正しくハンドリングできていることを確認するテストも容易に行えると思います。まとめマイクロサービス化によって様々な恩恵を受けることができる一方で複雑度が上がるとことがあります。複雑度が上がったものの1つがネットワークです。マイクロサービスではネットワーク越しの通信が当たり前になるので、通信が失敗することを前提として実装するべきです。Injectionです。Injectionの設定ができます。deploymentを実現するこんにちは、SPEEDAのSREチームの阿南です。最近Kubernetes界隈...2018-11-26Istioを使いこなすために知っておくことこんにちは、SPEEDAのSREチームの阿南です。Kubernetesのネットワーク...こんにちは。SPEEDA開発チームの鈴木です。»プロフィール『経済情報で、世界を変える』をミッションに、企業・業界情報プラットフォーム「SPEEDA」やソーシャル経済ニュース「NewsPicks」、ABMを強力にサポートする「FORCAS」、スタートアップの情報収集を圧倒的効率化「entrepedia」などを提供する株式会社ユーザベースの技術チームブログです。多国通貨」をハンズオンしたら快適で楽しかったGo言語でオブジェクト指向プログラミングの基本(型編)月別アーカイブ検索@Uzabase_Techさんのツイートスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。