AWSの負荷テストソリューション Distributed Load Testing on AWS を負荷テストで使ってみた

この記事はレコチョク Advent Calendar 2021の5日目の記事となります。

https://qiita.com/advent-calendar/2021/recochoku

## 自己紹介
こんにちは。
株式会社レコチョクでサーバーサイドエンジニアをしている原です。

弊社では音楽サービスを提供しているので、自己紹介として自分の好きな音楽について少し話そうと思います。

好きなジャンルは、シューゲイザー、叙情/激情/ポエトリーリーディングバンド、J-ロックなどいろいろです。
好きなアーティストは、クレナズム、Fall of Tears、amazarashi、mol-74などなどが好きです。もちろん音楽を聴くときは弊社のサービスを利用しています。

小さい頃からいろいろな音楽を聴いているので、他にも好きなアーティストや曲はあるのですが、長くなるのでこの辺にしようと思います。

***

# はじめに
私は、今年2021年10月1日にリリースされた新サブスクリプション音楽配信サービスである TOWER RECORDS MUSIC の開発に携わっています。

https://music.tower.jp/

そして、上記サービスのリリース前負荷テストとして、AWSの負荷テストソリューションである Distributed Load Testing on AWSを利用しました。

本記事では、Distributed Load Testing on AWS を使ってみて、どんなところが便利だったのかを簡単にお伝えできたら良いなと思っています。
それでは、よろしくお願いします。

# JMeterを用いた負荷テスト 
早速、 Distributed Load Testing on AWS の説明をしていこうかと思ったのですが、
以前利用していたJMeterを比較対象とする方が話を進めやすいので、先にJMeterについて説明させていただきます。

## 負荷テストツール JMeter について
JMeterは、Apacheソフトウェア財団が開発しているオープンソースの負荷検証ツールです。
負荷テストのツールとしては、定番なのかなと思います。
ただ、JMeterで負荷テストをする時に気をつけなければいけないことがあります。
それが、**JMeterにはGUIとCUIで負荷テストを実行できるのですが、GUIで負荷テストをすると正しい結果が得られない** ということです。
そのため、下の記事のように負荷テストの計画を作るのはGUI、テスト自体の実行はCUIで実施するようにしていました。

https://qiita.com/tatesuke/items/827e6190753964e46814

これが意外に手間で、かつ、テスト実行結果をExcelに書き出しグラフ化させるのも地味に手間でした。(プログラムで自動化すればよかったかもしれないですが、そこまで手が回らず...)
結局、以下のような流れで負荷テストを実行していました。

```
1. 負荷をかける/かけられるサーバーを用意
2. 負荷をかけるサーバーにJavaとJMeterをインストール
3. 負荷をかけるサーバーにテスト計画のファイル(.jmx)を移動
4. JMeterの実行コマンドでテスト計画のファイル(.jmx)を実行
5. テスト結果を保存
6. Excelでテスト結果を集計し、グラフ化
```

# Distributed Load Testing on AWS とは

AWS公式サイトから抜粋してきました。

https://aws.amazon.com/jp/builders-flash/202108/distributed-load-testing/


>「Distributed Load Testing on AWS」は、 HTTP または HTTPS のエンドポイントに対して、数万の同時接続をシミュレートし、負荷テストを実行することが可能なソリューションです。本ソリューションをデプロイ後、 Amazon S3 にてホストされる Web コンソールにアクセスし、接続先エンドポイント、同時接続数、テスト時間などを指定することでテストを実行できます。

上記の通り、エンドポイントに対して同時接続して、負荷テストを実行してくれる便利なソリューションです。

Distributed Load Testing on AWSを構築しているAWSサービスやコスト面などについては、[AWS公式サイト](https://aws.amazon.com/jp/builders-flash/202108/distributed-load-testing/)に詳細が記載されています。
コストの具体的な計算式は以下になりますが、TOWER RECORDS MUSICで実際にかかった費用としては、数千円程度でした。

```
CPU の月額料金
合計 vCPU 料金 = (タスク数) × (vCPU 数) × (CPU 秒あたりの料金) × (秒単位の 1 日あたりの CPU 使用時間) × (日数)
メモリの月額料金
合計メモリ料金 = (タスク数) × (メモリ (GB)) × (1 GB あたりの料金) × (秒単位の 1 日あたりのメモリ使用時間) × (日数)
```

#  Distributed Load Testing on AWS での負荷テストの流れ
今回 Distributed Load Testing on AWS を導入してみたところ、以下の手順で負荷テストを実施できました。

**Distributed Load Testing on AWS での負荷テスト実施手順**

```
1. 負荷テスト用JMeterファイルを作成
2. Distributed Load Testing on AWSに 作成したJMeterファイルをエクスポート
3. 同時接続数や同時接続時間を設定し、 テスト実施
4. Distributed Load Testing on AWS上でテスト結果確認
```

**【再掲】JMeterでの負荷テスト実施手順**

```
1. 負荷をかける/かけられるサーバーを用意
2. 負荷をかけるサーバーにJavaとJMeterをインストール
3. 負荷をかけるサーバーにテスト計画のファイル(.jmx)を移動
4. JMeterの実行コマンドでテスト計画のファイル(.jmx)を実行
5. テスト結果を保存
6. Excelでテスト結果を集計し、グラフ化
```

また、構築する手間は少なく、以下の手順で構築が完了したので簡単だったそうです。(私は構築しておらず...)
1. DockerHubのアカウント作成
2. DockerHubのアカウントのシークレット設定
3. Cloudformation実行

実際に使い、JMeterと比較して1番便利だなと思ったことは、すべてGUIで完結できたということです。
設定値を決めて負荷テストを実行すれば、結果がグラフとして表示されるというのはかなり便利でした。
レスポンスタイムなども詳細に記載されているので、この結果を見ればサービスの品質担保をある程度チェックできるかなと思いました。
以下が、実際のテスト結果になります。

![stress_test01](https://techblog.recochoku.jp/wp-content/uploads/2021/12/stress_test01.jpg)

##  Distributed Load Testing on AWS のメリット

ここからは、個人的に役に立った箇所を紹介していこうと思います。

### 1. テストシナリオは、JMeterのシナリオを指定できる
JMeterファイルをそのまま利用できるため、以前JMeterで負荷テストを実施していた私にとってはとてもありがたい仕様でした。
追加する方法も簡単で、以下の画像のようにテストシナリオを設定する項目にJMeterの項目があるので、そこから追加すればOKです。

![スクリーンショット 2021-11-22 14.12.21](https://techblog.recochoku.jp/wp-content/uploads/2021/12/cb6b59a3983eca186eb10377a5f489d8.png)

### 2. 今まで実施したテスト要件と結果がリスト化されている

次に、以下のように今まで実施したテスト要件と結果がリスト化されているところです。(負荷テスト名と負荷テストの説明文は隠しています)
履歴として残っているため、履歴を参考にしながら新しい負荷テストを実施できるので、
引き継ぎとして教える際にも簡単にこのソリューションの使い方を伝授できます。

![stress_test02](https://techblog.recochoku.jp/wp-content/uploads/2021/12/stress_test02.jpg)

# 終わりに
いかがだったでしょうか？
リリース前の負荷テストは、リリース時にサーバーへの負荷がかかりすぎないかを確認するためにとても大事な作業だと思います。
ただ、負荷テストは準備に意外に手間がかかるため、手間を最小限に、かつ正確な結果を返してくれるソリューションとして Distributed Load Testing on AWS は、おすすめだと思います。
皆様がこの記事をきっかけに  Distributed Load Testing on AWS に興味を持っていただけると幸いです。

明日の[レコチョク Advent Calendar 2021](https://qiita.com/advent-calendar/2021/recochoku)は6日目「QuickSightの埋め込みダッシュボードを使ってサービス開発した話」です。お楽しみに！

この記事はレコチョクのエンジニアブログの記事を転載したものとなります。

https://techblog.recochoku.jp/?p=7953

# 参考記事

https://dev.classmethod.jp/articles/distributed-load-testing-on-aws/