負荷テスト ハンズオン

Distributed Load Testing on AWS で大量トラフィックを生成し、Auto Scaling のスケールアウトを観察する

Distributed Load Testing ECS Fargate ALB / Auto Scaling CloudWatch マネコン操作 所要時間 60〜75 分 v1.0

📋 概要

Distributed Load Testing on AWS(DLT)は、Amazon ECS(Fargate)上でTaurus / JMeter / k6 / Locust を分散実行し、Web アプリケーションや API に対して大規模な負荷を生成する AWS 公式ソリューションです。このハンズオンでは DLT をデプロイし、ALB + Auto Scaling 配下のシステムへ負荷をかけて、スケールアウトと応答時間の変化を観察します。

項目内容
対象サービスDistributed Load Testing on AWS(ECS Fargate、API Gateway、Lambda、Cognito、CloudFront/S3)、ALB、Auto Scaling、CloudWatch
主な学習内容ソリューションのデプロイ・テストシナリオ作成・負荷実行・結果分析・スケールアウト観察
所要時間60〜75 分(デプロイ待ち約 15 分を含む)
難易度★★★☆☆(中級者向け)
前提知識ALB・Auto Scaling・CloudFormation の基礎知識
費用目安約 2〜5 USD(Fargate タスク・対象 EC2 のスケールアウト分。テスト時間に依存)
ℹ️ 負荷テストで分かること
  • 性能限界:どのくらいの RPS(秒間リクエスト数)まで耐えられるか
  • 応答時間の劣化:負荷増加に伴う p90 / p95 / p99 レイテンシの変化
  • スケーリングの妥当性:Auto Scaling が適切なタイミングで増減するか
  • ボトルネック:CPU・メモリ・DB 接続など、どこが先に詰まるか
ℹ️ 障害注入(FIS)との組み合わせ

「高負荷の最中にインスタンス障害が起きても耐えられるか?」を確認するには、本ハンズオンの負荷生成と AWS FIS ハンズオン の障害注入を組み合わせると、よりリアルなレジリエンス検証になります。

🏗️ アーキテクチャ

DLT が Fargate タスクから負荷を生成し、対象システム(ALB + Auto Scaling)へリクエストを送ります。

Distributed Load Testing コンソール
CloudFront + S3(Amazon Cognito 認証)
↓ テスト定義(API Gateway + Lambda)
Amazon ECS (Fargate) — 負荷生成タスク
Taurus が JMeter / k6 / Locust を実行
↓ 大量の HTTP リクエスト
対象システム: Application Load Balancer
+ Auto Scaling Group(EC2 ×N)
↓ メトリクス
Amazon CloudWatch
応答時間・RPS・CPU・スケーリング状況を可視化
⚠️ 負荷をかけてよいのは自分が管理するシステムだけ

DLT は実際に大量のトラフィックを生成します。必ず自分が所有・管理する検証用エンドポイントを対象にしてください。第三者のサイトへの負荷テストは規約違反・攻撃とみなされます。

✅ 前提条件

🔧 ツールの事前セットアップ

AWS CLI・Git・Docker などのインストールと初期設定は 環境セットアップガイド にまとめています。初めての方は先にご確認ください。

💰 課金とリージョンに注意

DLT のデプロイ自体は小さい構成ですが、テスト中は Fargate タスクと、スケールアウトした対象 EC2 に課金されます。タスク数・並列数・実行時間を欲張らないこと。作業リージョンは ap-northeast-1(東京) に固定し、終了後は必ずクリーンアップしてください。

🚀 ステップ 1 ― ソリューションのデプロイ

AWS 公式ソリューションを CloudFormation で 1 クリック展開します(所要約 15 分)。

1-1. ソリューションページを開く

ブラウザで「Distributed Load Testing on AWS」の実装ページ(aws.amazon.com/solutions/implementations/distributed-load-testing-on-aws/)を開き、「Launch in the AWS Console」 をクリックします。CloudFormation のスタック作成画面が開きます。

1-2. スタックのパラメータを入力

主なパラメータは次のとおりです(既定値のままで問題ないものは省略)。

スタック名handson-load-testing
Console Administrator Nameadmin
Console Administrator Emailあなたの受信可能なメールアドレス

Web コンソールのホスティングは既定の CloudFront + S3 でOKです。

1-3. 作成を実行

「機能と変換」で IAM リソース作成の承認(CAPABILITY_IAM 等)にチェックを入れ、スタックの作成をクリックします。CREATE_COMPLETE になるまで約 15 分待ちます。

ℹ️ コンソール URL の確認

スタックの 出力(Outputs) タブに表示される ConsoleURL(CloudFront の URL)が、負荷テスト用 Web コンソールの入口です。

🔑 ステップ 2 ― Web コンソールにログイン

2-1. 初期パスワードメールを確認

デプロイ完了後、入力したメールアドレス宛に Amazon Cognito からユーザー名と仮パスワードが届きます。件名は「Welcome to Distributed Load Testing」等です。

2-2. ログインしてパスワードを変更

ステップ 1 の ConsoleURL を開き、メールのユーザー名・仮パスワードでサインインします。初回はパスワードの変更を求められるので、新しいパスワードを設定します。

✅ 確認ポイント

ログイン後、DLT のダッシュボード(テスト一覧画面)が表示されれば成功です。

🧪 ステップ 3 ― テストシナリオの作成

シナリオ作成は「一般設定 → シナリオ定義 → トラフィックシェイプ → レビュー」の 4 ステップです。

3-1. 一般設定(General settings)

ダッシュボードで 「Create test」 をクリックします。

Test namehandson-alb-test
Test descriptionLoad test against ASG behind ALB
SchedulingRun Now
Include live dataチェックを入れる(実行中にリアルタイム表示)
3-2. シナリオ定義(Single HTTP Endpoint)

テストタイプは Single HTTP Endpoint を選びます(JMeter/k6/Locust スクリプトのアップロードも可能)。

HTTP endpoint under testhttp://<対象 ALB の DNS 名>/
HTTP MethodGET

必要に応じて Request Header(例: Content-Type: application/json)や Body を追加できます。

3-3. トラフィックシェイプ(Traffic shape)

負荷の形を決めます。最初は小さめから始めましょう。

Task Count(タスク数)2
Concurrency(1タスクの並列ユーザー数)100
Ramp Up(増加時間)1 分
Hold For(維持時間)5 分
ℹ️ 同時ユーザー数の目安

1 タスク(既定 2 vCPU / 4 GB)あたりの適正な並列数は、CloudWatch の Container Insights で Fargate タスクの CPU/メモリを見ながら少しずつ増やして調整します。まず 200 ユーザー以下で様子を見るのが安全です。

3-4. レビューして送信

設定内容を確認し、「Run Now(または Submit)」 でテストを開始します。

📊 ステップ 4 ― テスト実行と結果分析

4-1. 実行状況を確認

テスト詳細画面でステータスが Running になり、Fargate タスクが起動して負荷が始まります。Live data を有効にしていれば、平均応答時間・仮想ユーザー数・成功/失敗リクエスト数が 1 秒間隔で更新されます。

4-2. 完了後のサマリーを読む

テスト完了後、結果サマリーに以下が表示されます。

指標意味
Avg Response Time平均応答時間(小さいほど良い)
p90 / p95 / p99パーセンタイル応答時間(外れ値・テール遅延の把握)
Requests Per Second処理できた秒間リクエスト数(スループット)
Failed Requests / Errors失敗数・エラー率(限界を超えると増える)
✅ 確認ポイント
  • 負荷の増加に伴い RPS と応答時間がどう変化したかを把握できた
  • エラー率が跳ね上がる「限界点」が見えた(または余裕があった)
  • p99 などテール遅延の悪化を確認できた

📈 ステップ 5 ― Auto Scaling のスケールアウトを観察

負荷をかけている間、対象システム側で Auto Scaling が反応する様子を別タブで確認します。

5-1. 対象 ASG のアクティビティ

EC2 → Auto Scaling グループ → 対象グループ → アクティビティ。CPU 使用率の上昇によりスケーリングポリシーが発動し、インスタンスが追加起動されるログを確認します。

5-2. CloudWatch メトリクスで相関を見る
  • ALBRequestCountTargetResponseTimeHTTPCode_Target_5XX_Count
  • ASG / EC2CPUUtilization(平均)と InService インスタンス数

負荷 → CPU 上昇 → インスタンス増加 → 応答時間が回復、という一連の流れを確認できれば、スケーリング設計が機能しています。

ℹ️ うまくスケールしない場合のチェック
  • スケーリングポリシーのしきい値が高すぎ/クールダウンが長すぎないか
  • 負荷が小さすぎてしきい値に届いていないか(Concurrency や Task Count を上げる)
  • ALB のヘルスチェックで新規インスタンスが healthy になるまでのタイムラグ

🧹 クリーンアップ

⚠️ 課金停止のため必ず実施してください

Fargate タスクやスケールアウトした EC2 が残ると課金が続きます。以下を漏れなく削除してください。

  1. 実行中のテストを停止
    DLT コンソールでテストが Running の場合は Cancel で停止する
  2. DLT のスタックを削除
    CloudFormation → handson-load-testing スタックを削除。S3 バケットや ECR が空でなく削除に失敗する場合は、中身を空にしてから再削除する
  3. 対象システム(ALB + Auto Scaling)を削除
    本ハンズオン用に新規構築した場合は EC2 Auto Scaling ハンズオンのクリーンアップに従って削除する
  4. 残骸の確認
    ECS(Fargate タスク)・CloudWatch ロググループ・Cognito ユーザープールに不要なリソースが残っていないか確認する
✅ クリーンアップ完了の確認
  • CloudFormation のスタックが DELETE_COMPLETE(または一覧から消えた)
  • ECS に実行中の Fargate タスクが残っていない
  • 対象 EC2 がスケールイン/削除され、想定外の課金が発生しない

学習のまとめ

習得したスキル実践内容
負荷テスト基盤の構築Distributed Load Testing on AWS を CloudFormation でデプロイ
テストシナリオの設計エンドポイント・タスク数・並列数・Ramp Up / Hold For の設定
性能指標の読み取りRPS・平均/パーセンタイル応答時間・エラー率の分析
スケーリングの検証負荷と Auto Scaling・ALB メトリクスの相関の観察