Azure Kubernetes Service + Seleniumでお手軽負荷テスト環境

こんにちは、サイオステクノロジー技術部 武井です。今回はAzure Kubernetes Service + Seleniumでお手軽な負荷試験をできる環境を作ってみました。

Seleniumとは?

ブラウザのオートメーションツールです。つまりブラウザの動作(ボタンをクリックしたり、テキストボックスに入力したり)を自動化できるツールです。Headless Chrome / Firefoxを使えばGUIのない環境でもSeleniumが使えますので、テストの自動化に最適です。

負荷テストにSelenium?

Seleniumの用途は、E2Eテストです。Seleniumは1アクセスごとにブラウザが起動しますので、とても動作が重く、大量のリクエストを発生させる必要がある負荷テストには向きません。負荷テストといえば、スレッドでHTTPリクエストを生成するJMeterの十八番です。

ただし、JMeterはシナリオを作るのが大変です。昨今のWebアプリケーションのシーケンスは、ますます複雑化しています。アクセスのたびに動的に生成されたhiddenな値を送信したり、OpenID Connectによる認証フローとか、そういうシーケンスをJMeterで実現するためにはコーディングが必要になります。

Seleniumだったらブラウザの動きをエミュレートするだけですので、裏側でどんなに複雑なHTTPリクエストを発行していようが、クリックひとつで実現可能です。要はユーザーの動作をそのまま模倣できるのでシナリオ作りが簡単です。

ただし、世の中のWebアプリケーションって、それほどたくさんの負荷が必要なものばかりではないと思うのです。B2Cの大規模アプリならともかくとして、B2Bの小中規模なアプリなら同時10もできれば大体OKなときが多いです。でも小中規模なアプリだからといって、シーケンスは変わらず複雑だったりします。

そこでAzure Kubernetes Service

そんなコマッタを解決するためにAzure Kubernetes Serviceを使ってみました。具体的な方法は次のとおりです。

SeleniumでHeadless Chromeを利用してテストスクリプトを作成して、それをDockerコンテナ化して、Kubernetesに展開しました。ちょうど下図のようなイメージです。

 

Screen Shot 2019-12-07 at 14.55.31

一つのNodeの中にコンテナ化したSeleniumスクリプトが格納されたPodがあり、それがWebアプリケーションに対して負荷をかけるような感じです。大量の負荷を生み出したいときには、Nodeを増やします。Azure Kubernetes Serviceであれば、お財布が許す限り、Nodeをいくらでも増やせますので、高い負荷を生成することが可能です。

Seleniumスクリプトが生成する負荷試験のログの永続はfluentd + Application Insightsを使いました。Kubernetes内のPodは、そのPodのコンテナが停止すると、コンテナの中のデータは消えてしまいます。よって、ログやデータベースなどのデータの永続化はひと工夫する必要があります。

Seleniumスクリプトが格納されたPodと、fluentdが格納されたPodは、一つのVolumeを共有するします。Seleniumが吐き出したログをfluentdがtailします。Application Insightsへのログの書き出しは、Application Insights用の専用のプラグインを利用して実現します。いわゆるサイドカーとしてfluentdを配置します。この方法により、Seleniumが吐き出したログはApplication Insightsに記録されるので、ログの永続が実現できます。

Application Insightsのアラート機能により、ログに特定の文字列(例えばERRORなど)が出力された際に特定のメールアドレスに通知するようにしておきます。このようにしておけば、ログを定期的に見る必要もなくなりラクチンです。

作り方

本章では、先にご紹介した負荷テスト環境の作り方について説明致します。以下の条件を前提とします。

  • Azure Kubernetes Serviceは構築済みであること(このブログをご参照下さい)
  • 負荷をかけるSeleniumスクリプトは作成済みであること
  • Application Insightsの環境は作成済みであること

Seleniumスクリプト実行用Dockerコンテナのイメージを作る

まずSeleniumスクリプトを実行するためのDockerコンテナのイメージを作ります。先の図で言うところのSeleniumという名前のPodに入るコンテナのことです。本システムではSeleniumで負荷をかけるアプリケーションはJavaで実装することを前提としています。

以下のDockerfileを作成して、コンテナのイメージを作成して下さい。

fluentdのDockerコンテナのイメージを作る

Seleniumが吐き出したログをApplication Insightsに出力するコンテナのイメージを作成します。

まず、fluentdの設定ファイルであるfluent.confを以下のように作成します。

 

次に以下のDockerfileを作成して、コンテナのイメージを作成して下さい。

作成したコンテナのイメージをAzure Container Registryにpushする

先程作成したコンテナのイメージをAzure Container Registryにpushします。この辺りの詳細な絵オペレーションは、ブログ「Azure Kubernetes Serviceで最速k8s 」を参照して下さい。

Azure Kubernetes Serviceにデプロイするためのマニフェストファイルを作成する。

Azure Kubernetes Serviceにデプロイするために、以下のマニフェストファイルを作成して下さい。

では実行!!

以下のコマンドを実行して、Azure Kubernetes Serviceにデプロイすれば負荷テストが実行されます。

まとめ

いかがでしたでしょうか?それほど高負荷ではなく、しかも負荷テストシナリオ作成に手間をかけたくないときは、有効な手法かと思います。これが正しいSeleniumの使い方でないような気もしますが、、、。でも、便利だと思います(´▽`

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*