Take a “new step” Achieved by Value Engineering tech.sprasia.co.jp

ヘッドレスブラウザとEKSで配信イベントの負荷テストを実現する方法

こんにちは、スプラシアのナムです。

弊社のオンラインセミナーを開催するためのオールインワンツール「Smart Webinar」の開発・インフラを担当しています。主に配信機能の周りに携わります。

数百人に耐えられるイベントを構築するためにきちんと負荷テストを検証しています。その検証方法についてご紹介します。

なぜヘッドレスブラウザを利用する?

Smart Webinar」では、イベントの配信時間となった時イベントページに配信が正しく流れるのを確保する必要があります。

また、視聴者が配信中にイベントページ上にバナークリックや資料ダウンロード等の操作もするので、その関連の処理が正しく動いてるか確認が必要です。

まずは実行したいテストの手順は以下となります:

  1. 1. 配信時間前に数百人のユーザーをログインさせる
  2. 2. ログインさせた状態で、配信ツールで動画を配信する
  3. 3. 各ユーザーのブランチに動画が正しく流れるかを確認する
  4. 4. 配信中にバナークリック・資料ダウンロードを同時に行わせる
  5. 5. バナークリック・資料ダウンロードのログが取得されているかを確認する

 

以前のブログでDistributed Load Testing on AWSを紹介しましたが、今回のテスト内容に対応するのは難しいです。

理由としては、

  • Distributed Load Testingは短時間で多くの指定のHTTPリクエストが呼び出されて、どのレスポンスとその返却時間の結果を収集する目的で利用します。
  • そのため、長時間でページを監視できないサービスとなっており、配信が流れるか、配信中に他の操作を行えるかの確認ができません。

 

上記の理由から、実際のユーザーの操作に近い環境を作るために、ヘッドレスブラウザの選択を決定しました!

ヘッドレスブラウザ

ヘッドレスブラウザとなると様々なツールがあります。

  • ・ Selenium (Python)
  • ・ BeautifulSoup (Python)
  • ・ Puppeteer (Javascript)
  • ・ Cypress (Javascript)
  • ・ Playwright (Javascript)

 

複数のブラウザに対応し、使いやすさも考慮した条件でSeleniumとPuppeteerの2つに絞られました。Playwrightも好評ですが、今回はまだ試しに利用できておらず別の機会で試したいと思います。

Seleniumを利用した時に結構CPUとメモリが消費され、EKSで手軽いでテストを行いたいので、
最終的にPuppeteerを選びました。

負荷テストのためのサーバー

負荷テストを行うために複数のサーバーを同時に起動する必要がありますので、今回はAWSのElastic Kubernetes Service(EKS)上で行います。

弊社では、EKSのリソースを簡単に管理するGitOpsのツール「ArgoCD」を導入しており、今回ArgoCDを利用して1つのYAMLファイルだけで複数サーバー(POD)を起動させます。

簡単に下記の図でまとめます。

利用するツールについて簡単に説明します。

Elastic Kubernetes Service (EKS)

AWS上のKubernetesのマネジメントサービスです。Kubernetesとは、Googleによって開発されたコンテナ運用管理と自動化を行うOSSです。

Elastic Container Registry (ECR)

Dockerコンテナイメージの保存・管理する場所です。Puppeteerの処理をの処理を修正・ビルドした後にECRに保管します。後述のArgoCDがECRに保管してるPuppeteerを取得して展開します。

ArgoCD

Kubernetes環境でGitOpsを実現するためのContinuous Delivery(CD)ツールです。Githubに置いてあるGitOpsリポジトリのKubernetesマニフェストを監視して、EKSのクラスターに適用します。

負荷テストの結果の確認方法

Puppeteer内に情報取得の処理を追加する

今回は配信時間前後と配信中の処理を確認したいので、ブラウザー上のHTTPの記録、コンソールログ、イベントページ上のスクリーンショートという3つ情報を取得します。

1. ブラウザーの検証ツールに入っているネットワークタブの情報を取得します

これらの情報を取得するため、HTTPアーカイブ(HAR)ファイルを保存する処理をPuppeteerに入れます。

今回は、puppeteer-harを利用して、簡単にHARファイルを取ることができます。

 

 

これでHARファイルを取得できました。JSON型のファイルなので、好きなツールで分析できます。VSCode上にもHARアナライズの拡張機能があり、簡単にネットワークの記録を確認することができます。以下はHAR Analyerを利用している様子です。

リクエスト内容やリスポンスの結果と返却時間等の情報は簡単に確認することができます。

2. コンソールログを取得する

コンソールログにエラーログが発生したら、PuppeteerのPODログに出せるように以下の処理を入れました。後からまとめて分析できます。

 

3. Puppeteerのブラウザー上の画面のスクリーンショットを取得する

配信時間となった時に動画が流れるか確認のためです。

下記の処理を追加するだけで簡単にスクリーンショットを取得することができます。

取得したデータをPODに入って取る手間を避けるために、別サービスにアップロードし、リンクをPODログに貼り付ける処理も入れます。下記のようにページの全体様子を確認できます。

配信失敗など異常の場合、上記のようなスクリーンショートとコンソールログ内容を合わせて原因を確認することができます。

Kubectlでメトリクスのログを取得する

基本は以下のkubectl topコマンドを使用する形となります。事前にmetrics-serverを構築する必要の場合があります。

これらのメトリクスに基づいてイベントのPODのリソースをチューニングすることをしています。

まとめ

上記のようにPuppeteerを使用することで、実際のユーザー操作に近い環境をEKS上に作成し、配信イベントの負荷テストを行うことができます。

全体を自動化にするのは少し手間がかかりますが、様々なテストシナリオに適用できると思います。

関連カテゴリ 最新記事一覧