EC2 Auto Scaling ハンズオン

EC2 WebAP-RDS 構成に Auto Scaling を追加し、負荷に応じた自動スケールアウト/インを実現する

EC2 Auto Scaling 起動テンプレート ALB 統合 マネコン操作 中級 所要時間 75〜90 分 v1.0

📋 概要

このハンズオンでは「EC2 WebAP-RDS ハンズオン」で構築した ALB + EC2 + RDS 構成に EC2 Auto Scaling を追加します。手動で管理していた WebAP サーバーを Auto Scaling グループ(ASG)に置き換え、CPU 負荷に応じて自動的にインスタンスが増減する仕組みを構築します。

項目内容
対象サービスEC2 Auto Scaling、起動テンプレート、ALB、CloudWatch
主な学習内容AMI 作成・起動テンプレート・ASG 設定・ターゲット追跡スケーリング・負荷テスト
所要時間75〜90 分
難易度★★★☆☆(中級者向け)
前提知識EC2 WebAP-RDS ハンズオン修了推奨
費用目安約 1〜3 USD(EC2 稼働時間・スケールアウト台数による)
ℹ️ Auto Scaling の 3 つのスケーリング方式
方式説明このハンズオンでの扱い
ターゲット追跡CPU 使用率などのメトリクスを目標値に保つよう自動調整✅ ステップ 4 で設定
ステップスケーリングメトリクスの閾値に応じてステップ単位で増減参考として説明
スケジュールスケーリング日時指定でキャパシティを事前に変更✅ ステップ 6 で設定

🏗️ アーキテクチャ

変更前(EC2 WebAP-RDS ハンズオン完了時)

🌐 インターネット
⚖️ ALB(handson-alb)
パブリックサブネット 1a / 1c
↓ ターゲットグループ(handson-tg-webap)
📦 EC2 ×2 台(手動管理)
handson-webap-1a(1a)・handson-webap-1c(1c)— 固定台数
🗄️ RDS PostgreSQL(handson-rds)

変更後(このハンズオン完了時)

🌐 インターネット
⚖️ ALB(handson-alb)
変更なし
↓ ターゲットグループ(handson-tg-webap)
🔄 Auto Scaling グループ(handson-asg)
最小 2 台 / 希望 2 台 / 最大 6 台 — 負荷に応じて自動増減
↓ 起動テンプレート(handson-lt)を使って自動起動
🗄️ RDS PostgreSQL(handson-rds)
変更なし

追加するリソース

リソース名前内容
AMIhandson-webap-ami既存 WebAP EC2 から作成(Nginx + Node.js 設定済み)
起動テンプレートhandson-ltASG がインスタンスを起動する際のひな形
Auto Scaling グループhandson-asg最小 2 / 希望 2 / 最大 6、2 AZ 分散配置
スケーリングポリシーhandson-cpu-policyCPU 使用率 50% を維持するターゲット追跡

✅ 前提条件

リソース名前確認方法
VPChandson-vpcVPC コンソール → お使いの VPC
プライベートサブネット(WebAP 用)handson-subnet-private-webap-1a / 1cVPC → サブネット
ALBhandson-albEC2 → ロードバランサー
ターゲットグループhandson-tg-webapEC2 → ターゲットグループ
セキュリティグループsg-webapEC2 → セキュリティグループ
IAM インスタンスプロファイルhandson-cwl-ec2-role(または同等)IAM → ロール
WebAP EC2(AMI 取得元)handson-webap-1aEC2 → インスタンス
⚠️ 既存 EC2 は最後に削除

ASG が正常動作することを確認するまで、既存の handson-webap-1ahandson-webap-1c は削除しないでください。ターゲットグループへの接続をASG に切り替えるのはステップ 3 で行います。

📸 ステップ 1 ― 既存 WebAP インスタンスから AMI を作成する

Nginx + Node.js がセットアップ済みの EC2 インスタンスから AMI(Amazon Machine Image)を作成します。この AMI が Auto Scaling グループが新しいインスタンスを起動するためのひな形になります。

1-1. EC2 コンソールでインスタンスを選択

EC2 コンソール → 「インスタンス」handson-webap-1a を選択します。

1-2. AMI を作成

「アクション」→「イメージとテンプレート」→「イメージを作成」 をクリックします。

イメージ名handson-webap-ami
イメージの説明WebAP server with Nginx + Node.js
再起動しない✅ チェックを入れる(停止なしで作成)

「イメージを作成」をクリックします。

ℹ️「再起動しない」オプション

チェックを入れると EC2 インスタンスを停止せず AMI を作成します(稼働したままキャプチャ)。ファイルシステムの整合性は若干低下しますが、ダウンタイムが発生しないためハンズオン目的には適切です。

1-3. AMI の作成完了を確認

EC2 コンソール左メニュー → 「AMI」 を開きます。handson-webap-ami のステータスが 「利用可能」 になるまで待ちます(5〜10 分程度)。

AMI ID(ami-xxxxxxxxxxxxxxxxx)をメモしておきます。

✅ 確認ポイント

AMI ステータスが「利用可能」になれば次のステップへ進めます。

📋 ステップ 2 ― 起動テンプレートの作成

Auto Scaling グループがインスタンスを起動する際に参照する「起動テンプレート」を作成します。インスタンスタイプ・AMI・セキュリティグループ・IAM ロールなどを定義します。

2-1. 起動テンプレートの作成を開始

EC2 コンソール左メニュー → 「起動テンプレート」→「起動テンプレートを作成」 をクリックします。

2-2. テンプレートの基本設定
起動テンプレート名handson-lt
テンプレートバージョンの説明v1 - Nginx + Node.js WebAP
Auto Scaling のガイダンス✅ チェックを入れる
2-3. AMI とインスタンスタイプを設定
AMIマイ AMI → handson-webap-ami を選択
インスタンスタイプt3.micro
キーペアキーペアなし(Session Manager で接続するため不要)
ℹ️ t2.micro から t3.micro へ

t2.micro は旧世代です。Auto Scaling グループでは t3.micro を推奨します。t3 は t2 比でバースト性能が高く、同等コストでより高いベースライン CPU を提供します。

2-4. ネットワーク設定
サブネット起動テンプレートには含めない(ASG で指定)
セキュリティグループsg-webap(既存のものを選択)
2-5. 高度な詳細を設定
IAM インスタンスプロファイルhandson-cwl-ec2-role(Session Manager 用)
詳細なモニタリング✅ 有効化(1 分間隔の CloudWatch メトリクス)
ユーザーデータ(空白のまま、AMI に設定済みのため不要)

「起動テンプレートを作成」をクリックします。

✅ 確認ポイント

起動テンプレート一覧に handson-lt が表示されれば成功です。

🔄 ステップ 3 ― Auto Scaling グループの作成

起動テンプレートを使って Auto Scaling グループを作成し、既存の ALB ターゲットグループに接続します。

3-1. Auto Scaling グループの作成を開始

EC2 コンソール左メニュー → 「Auto Scaling グループ」→「Auto Scaling グループを作成する」 をクリックします。

3-2. 起動テンプレートを選択
Auto Scaling グループ名handson-asg
起動テンプレートhandson-lt(バージョン: デフォルト)

「次へ」をクリックします。

3-3. ネットワーク設定(2 AZ に分散配置)
VPChandson-vpc
アベイラビリティーゾーンとサブネットhandson-subnet-private-webap-1a
handson-subnet-private-webap-1c(両方選択)

「次へ」をクリックします。

3-4. ロードバランシングの設定
ロードバランシング既存のロードバランサーにアタッチ
既存のロードバランサーのターゲットグループhandson-tg-webap
ヘルスチェックのタイプELB(ALB のヘルスチェック結果を使用)
ヘルスチェックの猶予期間120 秒
ℹ️ EC2 ヘルスチェック vs ELB ヘルスチェック

EC2: インスタンスが起動しているかのみ確認。アプリが応答しなくても「正常」と判定されることがある。
ELB: ALB がアプリへの HTTP リクエストで確認。アプリが異常なインスタンスを自動置換するため、本番では ELB 推奨。

「次へ」をクリックします。

3-5. グループサイズの設定
希望するキャパシティ2
最小キャパシティ2
最大キャパシティ6

「次へ」→「次へ」→「次へ」→「Auto Scaling グループを作成する」をクリックします。

3-6. 既存の手動 EC2 をターゲットグループから切り離す

ASG が管理するインスタンスが「正常」になったら(2〜3 分後)、手動で作成した既存の EC2 を ALB ターゲットグループから切り離します。

EC2 コンソール → 「ターゲットグループ」→ handson-tg-webap →「ターゲット」タブ を開き、handson-webap-1ahandson-webap-1c を選択して 「登録解除」 をクリックします。

⚠️ ASG インスタンスが正常になってから実行

ターゲットグループの「ヘルスチェックのステータス」が healthy になった ASG インスタンスが 2 台以上あることを確認してから既存 EC2 を切り離してください。

✅ 確認ポイント

ターゲットグループで ASG が管理する 2 台のインスタンスだけが healthy 状態になり、ALB 経由でアプリにアクセスできれば移行完了です。

📊 ステップ 4 ― スケーリングポリシーの設定

CPU 使用率 50% を目標値とするターゲット追跡スケーリングポリシーを設定します。

4-1. ダイナミックスケーリングポリシーを追加

EC2 コンソール → 「Auto Scaling グループ」→ handson-asg→「自動スケーリング」タブ → 「ダイナミックスケーリングポリシーを作成する」 をクリックします。

4-2. ターゲット追跡スケーリングを設定
ポリシータイプターゲット追跡スケーリング
スケーリングポリシー名handson-cpu-policy
メトリクスタイプ平均 CPU 使用率
ターゲット値50(%)
ウォームアップ(インスタンス起動後の安定待機)120 秒
スケールインの無効化無効(スケールインも自動で行う)

「作成」をクリックします。

ℹ️ ターゲット追跡の動作

CPU 使用率が 50% を超えると インスタンスをスケールアウト、50% 未満が続くと スケールインします。AWS が CloudWatch アラームを 2 つ(スケールアウト用・スケールイン用)自動作成します。ウォームアップ期間中の新インスタンスは集計から除外されます。

4-3. 自動作成された CloudWatch アラームを確認

CloudWatch コンソール → 「アラーム」 を開くと、TargetTracking-handson-asg-AlarmHigh-*TargetTracking-handson-asg-AlarmLow-* の 2 つが自動作成されています。

✅ 確認ポイント

Auto Scaling グループの「自動スケーリング」タブに handson-cpu-policy が表示されれば設定完了です。

🔬 ステップ 5 ― スケールアウト・スケールインテスト

stress コマンドで意図的に CPU 負荷をかけ、自動スケールアウトを確認します。

5-1. ASG 管理下のインスタンスに Session Manager で接続

EC2 コンソール → インスタンス一覧で、ASG が起動した WebAP インスタンスを 1 台選択します(名前が handson-asg となっているもの)。「接続」→「Session Manager」→「接続」 をクリックします。

5-2. stress ツールをインストールして CPU 負荷をかける
sudo dnf install -y stress # CPU コア数を確認(t3.micro は 2 vCPU) nproc # 全 CPU に負荷をかける(10 分間) stress --cpu $(nproc) --timeout 600
⚠️ もう 1 台のインスタンスにも負荷をかける

ターゲット追跡は グループ全体の平均 CPU で判断します。1 台だけに負荷をかけても 2 台平均で 50% を超えない場合があります。もう 1 台にも同様の負荷をかけてください。

5-3. スケールアウトを確認

CloudWatch コンソール → 「アラーム」→ TargetTracking-handson-asg-AlarmHigh-* を確認します。アラーム状態が「アラーム中」になると、数分後にインスタンスが自動追加されます。

EC2 コンソール → 「Auto Scaling グループ」→ handson-asg →「アクティビティ」タブ でスケールアウトイベントのログを確認できます。

確認場所期待される動作所要時間目安
CloudWatch アラームAlarmHigh が「アラーム中」になる3〜5 分(1 分間隔メトリクスのため)
ASG アクティビティ「Launching a new EC2 instance」のログアラーム後 1〜2 分
EC2 インスタンス新しいインスタンスが「実行中」になる1〜3 分
ターゲットグループ新インスタンスが「healthy」になるヘルスチェック設定による
5-4. stress を停止してスケールインを確認

Session Manager のターミナルで Ctrl+C を押して stress を停止します。CPU 使用率が 50% 未満に下がると、スケールイン保護期間(デフォルト 300 秒) 後にインスタンスが自動削除されます。

ℹ️ スケールインは遅く設計されている

スケールアウトは素早く(CPU が高いと即応)、スケールインは保守的(冷却期間あり)に設計されています。これは短期的な負荷低下でインスタンスを削除してしまう「フラッピング」を防ぐためです。

✅ 確認ポイント

CPU 負荷時にインスタンスが増加し、負荷を停止後に最小台数(2 台)に戻れば Auto Scaling の動作確認完了です。

🗓️ ステップ 6 ― スケジュールスケーリングの設定

業務時間開始前にインスタンスを事前に増やし、深夜に最小構成に戻す定期スケジュールを設定します。

6-1. スケジュールアクションを作成

EC2 コンソール → 「Auto Scaling グループ」→ handson-asg →「スケジュールされたアクション」タブ → 「スケジュールされたアクションを作成する」 をクリックします。

6-2. 朝のスケールアウトスケジュールを設定
名前morning-scale-out
希望するキャパシティ4
最小キャパシティ4
最大キャパシティ6
定期的なスケジュール(Cron)0 23 * * 0-4(UTC 23:00 = JST 月〜金 8:00)

「作成」をクリックします。

6-3. 夜間のスケールインスケジュールを設定
名前night-scale-in
希望するキャパシティ2
最小キャパシティ2
最大キャパシティ6
定期的なスケジュール(Cron)0 12 * * 1-5(UTC 12:00 = JST 月〜金 21:00)

「作成」をクリックします。

ℹ️ Cron 式は UTC 基準

AWS のスケジュールスケーリングの Cron 式は UTC です。JST(UTC+9)で設定する場合は 9 時間引いた値を使ってください。0 23 * * 0-4 は UTC 23:00 = JST 翌 8:00(月〜金)を意味します。

6-4. スケーリング優先度の理解

スケジュールスケーリングとダイナミックスケーリング(ターゲット追跡)は 同時に動作 します。スケジュールで最小 4 台に設定した後、さらに CPU 負荷が上がればダイナミックスケーリングで最大 6 台まで自動拡張されます。

状況最小最大動作
深夜(スケジュール適用後)26CPU に応じて 2〜6 台
業務時間(スケジュール適用後)46CPU に応じて 4〜6 台(最低 4 台保証)
✅ 確認ポイント

スケジュールされたアクション一覧に morning-scale-outnight-scale-in が表示されれば設定完了です。

🧹 クリーンアップ

⚠️ 課金防止のためクリーンアップを必ず実施してください

EC2 インスタンス(ASG 管理分も含む)・ALB・RDS・NAT Gateway がすべて課金対象です。

削除手順(逆順で実施)

  1. Auto Scaling グループを削除
    EC2 → Auto Scaling グループ → handson-asg → 「削除」
    ※ ASG 削除時に管理下のインスタンスも自動終了されます
  2. 既存の手動 EC2 を終了(まだ残っている場合)
    EC2 → インスタンス → handson-webap-1a / handson-webap-1c → 「インスタンスの状態」→「終了」
  3. 起動テンプレートを削除
    EC2 → 起動テンプレート → handson-lt → 「削除」
  4. AMI の登録解除とスナップショット削除
    EC2 → AMI → handson-webap-ami →「アクション」→「AMI の登録解除」
    EC2 → スナップショット → 関連スナップショット → 「削除」
  5. EC2 WebAP-RDS ハンズオンのリソースを削除(ALB・RDS・NAT GW など)
    EC2 ハンズオンのクリーンアップ手順 に従って実施

学習のまとめ

習得したスキル実践内容
AMI 作成既存インスタンスからゴールデン AMI を作成(再起動なし)
起動テンプレートインスタンスタイプ・AMI・SG・IAM ロールの定義
Auto Scaling グループ2 AZ 分散・ALB 統合・ELB ヘルスチェック
ターゲット追跡スケーリングCPU 50% 目標・自動スケールアウト / スケールイン
スケールアウトテストstress コマンドで CPU 負荷 → CloudWatch アラーム → ASG 動作確認
スケジュールスケーリングCron 式(UTC)で業務時間帯の事前スケールアウト