[AWS]ECS+Fargateで簡単にJMeterのMaster/Slave環境を構築

はじめに

以前にALBのボトルネックを調査するためにJMeterによる高負荷リクエストを検証しました。

しかしMacbook上でのJMeterでは与えられる負荷に限界がありました。

そこで今回はECS + Fargateの最小構成でJMeterを複数実行して大量の負荷をかけられる環境を用意することにします。

◆Github (テンプレートはこちら)
https://github.com/noname-work/aws-cloudformation/tree/master/ecs/ecs-jmeter-cluster

構成


今回の構成ではシンプルにECS関連のサービスのみを利用しています。

この図ではECRリポジトリ、セキュリティグループ、タスク実行用のIAMロールを省略していますが、基本的にはECSを利用するために最低限必要なリソースのみしか使っていません。

コンテナイメージの構築


DockerfileでJMeterのイメージを作成します。

ビルドに必要なファイルは以下のURL内にあります。
jmxディレクトリ配下にシナリオファイルを格納してください。

master.shを更新することで、例えば負荷試験結果をS3にアップロードしたりできます。
https://github.com/noname-work/aws-cloudformation/tree/master/ecs/ecs-jmeter-cluster/source

負荷試験環境の構築

パラメータ
JmeterClusterName JMeterのECSクラスター名を入力します。
MasterServiceName Masterとして実行するJMeterサービス名を入力します。
SlaveServiceName Slaveとして実行するJMeterサービス名を入力します。
FargateCPU Fargateに割り当てるvCPUを選択します。
FargateMemory Fargateに割り当てるメモリを選択します。
DesiredSlaveCount Slaveの台数を入力します。
VPCID VPCのIDを選択します。
ImageURI JMeterのコンテナイメージのURIを入力します。
FargateSubnetIDs Fargateを実行するサブネットを選択します。Publicなサブネットで実行することを推奨しますが、IPアドレスの固定化が必要な場合はPrivateなサブネットを選択してください。
JmxFileName 実行するシナリオファイル名を入力します。

実行結果


CloudFormationテンプレートを実行すると、1台のMasterと複数台のSlaveが立ち上がります。


CloudWatchLogsに出力された結果から、正常にSlaveから負荷試験が実行されていることがわかります。

サンプルでは存在しないドメインに対して10回のリクエストを送るシナリオファイルを実行しましたが、Slaveが3台存在するため30回のリクエストが送られていることがわかります。


CloudFormationのスタックを作成すれば全ての負荷試験環境のリソースが削除されるため、不要になった後の掃除も簡単です。

苦労したポイント

MasterのコンテナにSlaveコンテナのIPリストを登録する必要があり、そこをどうやって実現するかに悩みました。

結論としてはCloudFormationテンプレートでDependsOnオプションを作成して、Slaveのサービスが実行されてからMasterのサービスが実行されるように順番を制御して解決しました。

SlaveのIPアドレスの取得とコンフィグファイルの更新はsource/master.shで行っています。

おわりに

今回はFargateを使ったJMeter環境を構築しました。

実はAWSでは分散負荷テストのためにFargateでJMeterを立ち上げるテンプレートが用意されています

もちろんシナリオファイルを用意しておけば、このテンプレートによって作成した構成で大量の負荷テストを実行可能です。
AWS分散負荷テスト環境として構築されるアーキテクチャは非常にリッチな構成で、コンソール上から負荷試験の設定を操作することもできます。

負荷試験のガイドもついているので、まずはこちらのソリューションを活用するのが良いかもしれませんね。

ただしこのテンプレートではリッチな環境を実現するために様々なサービスを利用しています。
CloudFormationのテンプレートも約2000行に達します。

そのため必要最低限な構成で実施したい場合や自由にカスタマイズしたい場合には自分でテンプレートを作ってみるのも良いかもしれませんね。

◆AWSでの分散負荷テスト
https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)