AWS での分散負荷テストを試してみる

AWSで負荷テスト環境を簡単に構築出来るようなので試してみます。

https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/


## 構成
公式から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/8634e8ce-21dc-7519-bc6c-41bcf7fe8f86.png)
フロントにAmplifyが用いられテストシナリオを作成するコンソール画面が提供されます。
実際に負荷をかける環境はECSによって管理されたコンテナから実行されます。コンテナイメージにはコンテナイメージにはTaurusというテストツールが使用されているようです。

## コスト
こちらも公式から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/a24f5b1d-181b-6499-f61c-3a44e1ab9efd.png)

負荷テストの実行時間に応じたFargateの従量課金分が多くを占め、維持コストはほぼかかりません。
仮にEC2にテスト環境を構築した場合、厳密にテスト時間だけ起動するという運用は困難ですし、コスト面でも優秀なのではないでしょうか。

## 使ってみる

こちらのデプロイガイドを参照しながら進めていきます。

https://d1.awsstatic.com/Solutions/ja_JP/distributed-load-testing-on-aws.pdf

### CloudFormationスタックの作成

デプロイガイドに下記の記載がありますので、マネジメントコンソールにログインした状態で[ソリューションの起動](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?&templateURL=https://solutions-reference.s3.amazonaws.com/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws.template)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/a29de3e5-9db3-7989-d408-0b642467aa9f.png)

CloudFormationの画面が開きます。
デフォルトだとリージョンがバージニア北部になっているので東京に変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/ed2fdc51-a17d-bec4-5fd6-5bd042f8f2bd.png)

スタックの詳細の指定です。
Console Administrator Name とConsole Administrator Emailの欄だけ入力しました。
負荷テストのコンソールへログインするユーザー名の指定と、ログインパスワードが通知されるメールアドレスを記載します。
![2022-03-23_11h12_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/6f41c7ee-d2fa-0042-19fb-b71c3007ecf5.png)


![2022-03-23_11h12_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/26c7d84c-bcad-e766-fe63-eedcd0abc7f9.png)

スタックオプションの設定です。
特に変更せずに進みます。
![2022-03-23_11h12_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/91ccd0be-6cda-8bea-b6f3-d55cb895c25b.png)



確認画面に遷移します。
IAMリソース作成への同意にチェックをする必要がありますので、チェックをしてスタックを作成します。
![2022-03-23_11h13_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/38cf0712-f881-c1b7-9299-0da3947dfa40.png)


スタックの作成が開始されます。5分程で完了しました。
![2022-03-23_11h13_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/1df676e9-a382-1b1f-1005-890a8d08e1d7.png)

### テストコンソールからのテスト実行

スタック作成が完了すると、パラメータとして入力したメールアドレス宛に、ログインパスワード、ログインURLが記載されたメールが送られてきます。
![2022-03-23_11h20_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/955a270f-d2f7-ec52-91ac-c0c1276b2af2.png)

記載されたURLにアクセスし、ログイン。
![2022-03-23_11h21_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/3c3ae5f8-622f-ba80-7b52-1c80ed3e4869.png)

パスワード変更を求められるので変更します。
![2022-03-23_11h21_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/527727ff-09ca-090d-1d30-bc536159eec2.png)

ログイン出来ました。
![2022-03-23_11h21_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/db36650f-8379-19a1-0bb0-c1da63f6f71f.png)

テストシナリオを作成していくのですが、その前にテスト対象の環境を用意します。
今回はとりあえずhttpリクエストを受けられれば良いので、apacheがインストールされているAMIからEC2インスタンスを起動しただけの雑な環境をテスト対象としました。
![2022-03-23_11h31_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/577c97af-27c8-ef61-47fd-2275d932c950.png)


ちなみに、AWSで負荷テストや侵入テストを実施する場合、シナリオによってはAWSへ事前連絡が必要となる事があるのですが、ガイドによると「本ソリューションでネットワークトラフィックが1Gbps未満の場合は連絡不要」との事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/b443a470-300d-9649-64dc-87638e9a35e7.png)
詳細については[こちら](https://aws.amazon.com/jp/ec2/testing/)に書いてあるようなので、AWSで本格的な負荷テストを行う際は確認しておいた方が良いでしょう。


さて、テストシナリオの作成に戻ります。
テストコンソール上部の[CREATE TEST]をクリックします。
![2022-03-23_11h21_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/d4b996aa-0ef6-5dc9-17a4-5d9fa088cbdc.png)

シナリオの設定を入力する画面となるので、要件に応じて記載して実行します。
![2022-03-23_11h52_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/a9e757f1-21f3-4a4c-f98d-6165568057e0.png)

実行するとこのような画面になりました。
![2022-03-23_11h53_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/be8a7b9a-c79b-5046-0d82-006ed44f2e95.png)

画面下部欄の[Amazon CloudWatch Metrics Dashboard]をクリックすると、リアルタイムに状況をウォッチする事が出来るようです。
テスト対象はしょぼいインスタンスタイプで用意したのでまぁまぁエラーがでてますね。

![2022-03-23_12h06_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/e10bfe97-514c-eefb-8e1f-653bb73d1ba7.png)


実行が終わるとすぐに結果のサマリーが確認可能となりました。
![2022-03-23_12h04_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/75c45075-bcb4-4a21-74c8-5c44ea5e23f5.png)

単体で作成できるテストシナリオはシンプルなものに限られますが、シナリオ作成時[Test Type]にJmeterを選択する事ができ、既存のJmeterの定義を読ませる事ができるようです。
![2022-03-23_11h23_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/4d618c4b-f448-5c99-a09d-e0d113ffd25a.png)

簡単に、従量課金でコスト最適化されたテスト実行環境が構築出来るのは、かなり良いのではないでしょうか。