ハンズオン資料

「構築しただけでは終わらせない。学びを言葉にして、"自分の技術"にする。」

View on GitHub

🚀 Day X: Auto Scaling ハンズオン

概要

高可用性・スケーラブルなWebアプリケーションを構築する。 Day 3/4で構築した社員管理システムをAuto Scaling対応にする。

⚠️カスタムAMIを作る手順があるため、「Cloud Foundations」コースのサンドボックスでは実施できません。「Cloud Web Application Builder」コース or 「Learner Lab」コース等のカスタムAMIを作ることができるコースで実施してください。

最終構成

システム構成図

flowchart TB
    Client[👤 Client]

    subgraph AWS["AWS Cloud (Region)"]
        IGW[🌐 Internet Gateway]
        SM[🔐 Secrets Manager]
        
        subgraph VPC["VPC (10.0.0.0/16)"]
            ALB[⚖️ Application Load Balancer]
            
            subgraph AZ1["Availability Zone 1"]
                subgraph Public1["Public Subnet A"]
                    EC2_1[🖥️ EC2]
                end
                subgraph Private1["Private Subnet A"]
                    RDS[(🗄️ RDS MySQL)]
                end
            end
            
            subgraph AZ2["Availability Zone 2"]
                subgraph Public2["Public Subnet B"]
                    EC2_2[🖥️ EC2]
                end
                subgraph Private2["Private Subnet B"]
                    spacer["(DB Subnet Group)"]
                end
            end
            
            ASG🔄 Auto Scaling Group
        end
    end

    Client --> IGW --> ALB
    ALB --> EC2_1
    ALB --> EC2_2
    EC2_1 --> RDS
    EC2_2 --> RDS
    EC2_1 -.-> SM
    EC2_2 -.-> SM
    ASG --> EC2_1
    ASG --> EC2_2

    linkStyle 0,1,2,3 stroke:#2196F3,stroke-width:2px
    linkStyle 4,5 stroke:#4CAF50,stroke-width:2px
    linkStyle 6,7 stroke:#FF9800,stroke-width:2px
    linkStyle 8,9 stroke:#F44336,stroke-width:2px
    style spacer fill:none,stroke:none,color:#999

凡例: 🔵HTTPトラフィック / 🟢DB接続 / 🟠Secrets Manager / 🔴Auto Scaling

前提条件

⏰ 所要時間

約90分


Phase 1: VPC構築(VPCなど で一括作成)

VPCコンソール → VPCを作成

設定

VPCを作成 をクリック。

これで以下が一括作成される:


Phase 2: セキュリティグループ作成

2-1. Web用セキュリティグループ

EC2コンソール → セキュリティグループセキュリティグループを作成

2-2. DB用セキュリティグループ


Phase 3: RDS作成

3-1. DBサブネットグループ作成

RDSコンソール → サブネットグループDBサブネットグループを作成

3-2. RDSインスタンス作成

データベースデータベースの作成

作成が完了するまで5分ほどかかる。
作成後、RDSのエンドポイント をメモしておく。


Phase 4: Secrets Manager設定

Secrets Managerコンソール → 新しいシークレットを保存する

シークレットのタイプを選択

{
  "host": "<RDSエンドポイント>",
  "user": "admin",
  "password": "password123",
  "db": "employeedb"
}

⚠️ <RDSエンドポイント> は Phase 3 でメモしたRDSのエンドポイントに置換すること

シークレットを設定する

ローテーションを設定する

レビュー


Phase 5: EC2インスタンス作成(単体動作確認)

4-1. EC2起動

EC2コンソール → インスタンスを起動

⚠️ YOUR_RDS_ENDPOINT_HERE を実際のRDSエンドポイントに置換すること

#!/bin/bash
set -euxo pipefail

RDS_ENDPOINT="YOUR_RDS_ENDPOINT_HERE"

dnf -y update
dnf -y install git mariadb105

# Swap作成(OOM対策)
dd if=/dev/zero of=/swapfile bs=128M count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab

# Install Node.js 24 via NodeSource
curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
dnf -y install nodejs

mkdir -p /var/www/html
chmod 755 /var/www/html

WORKDIR=/opt/employee-app-src
rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"
cd "$WORKDIR"

git init
git remote add origin https://github.com/haw/aws-education-hands-on.git
git config core.sparseCheckout true
git sparse-checkout init --cone || true
echo "day3/db-lab/materials/app/*" > .git/info/sparse-checkout
git fetch --depth=1 origin main
git checkout -b main origin/main

cp -r day3/db-lab/materials/app/* /var/www/html/
cd /var/www/html

# config.jsのRDSエンドポイントを置換
sed -i "s/YOUR_RDS_ENDPOINT_HERE/$RDS_ENDPOINT/g" config.js

# seedデータ挿入部分を削除(Auto Scaling時に毎回挿入されるのを防ぐ)
sed -i '/\/\/ Insert sample data/,/サンプルデータを挿入しました/d' init_db.js

npm install

chown -R ec2-user:ec2-user /var/www/html

cat > /etc/systemd/system/employee-app.service <<'SERVICE'
[Unit]
Description=Employee Management Node.js App
After=network.target

[Service]
Type=simple
User=ec2-user
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
SERVICE

systemctl daemon-reload
systemctl enable employee-app

RETRY_COUNT=0
while ! mysqladmin ping -h $RDS_ENDPOINT -u admin -ppassword123 --silent; do
  RETRY_COUNT=$((RETRY_COUNT + 1))
  if [ $RETRY_COUNT -ge 60 ]; then
    echo "RDS connection timeout"
    break
  fi
  echo "Waiting for RDS... ($RETRY_COUNT/60)"
  sleep 30
done

node init_db.js || true

systemctl start employee-app

4-2. 動作確認

ブラウザで http://<EC2のパブリックIP>:3000 にアクセス。


Phase 6: AMI作成

  1. EC2コンソール → employee-web-server を選択
  2. アクションイメージとテンプレートイメージを作成
  3. イメージ名: employee-app-ami
  4. 他はデフォルトのまま
  5. イメージを作成

AMIのステータスが 利用可能 になるまで待つ(3分〜5分)


Phase 7: ELB用セキュリティグループ作成

EC2コンソール → セキュリティグループセキュリティグループを作成

Web SGのインバウンド修正

employee-web-sg を編集(インバウンドのルールを編集):


Phase 8: ターゲットグループ作成

EC2コンソール → ターゲットグループターゲットグループの作成


Phase 9: Application Load Balancer作成

EC2コンソール → ロードバランサーロードバランサーの作成Application Load Balancer

作成後、DNS name をメモ。


Phase 10: 起動テンプレート作成

EC2コンソール → 起動テンプレート起動テンプレートを作成


Phase 11: Auto Scaling グループ作成

EC2コンソール → Auto Scaling グループAuto Scalingグループを作成する

Step 1: 起動テンプレートを選択

Step 2: インスタンス起動オプションを選択する

Step 3: 他のサービスと統合する

Step 4: グループサイズとスケーリング

Step 5: 通知を追加する

Step 6: タグを追加する

Step 7: 確認


Phase 12: 動作確認

Auto Scalingで自動的にインスタンスが立ち上がるまで3分〜5分程度待つ。

  1. ブラウザで http://<ALBのDNS名> にアクセス
  2. 社員レコードの追加・編集・削除ができることを確認
  3. EC2コンソールで Auto Scaling によりインスタンスが起動していることを確認

Phase 13: 負荷テストでスケールアウト確認

12-1. 負荷テスト用EC2インスタンス作成

EC2コンソール → インスタンスを起動

12-2. Session Managerで接続

EC2コンソール → load-test-server を選択 → 接続セッションマネージャー接続

12-3. loadtestインストール

sudo su - ec2-user

# Install Node.js 24 via NodeSource
curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
sudo dnf install -y nodejs
sudo npm install -g loadtest

12-4. 負荷テスト実行

<ALBのDNS名> を実際の値に置換して実行:

NODE_OPTIONS="--max-old-space-size=2048" loadtest --rps 2 -c 40 -t 300 http://<ALBのDNS名>/stress

/stress エンドポイントはCPU負荷テスト用。フィボナッチ計算でCPU使用率を上げる。

⚠️ スケールアウトが発生するまで数分かかる。警告は無視してよい。

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

  1. EC2コンソール → インスタンス一覧で employee-auto-scaling が増えることを確認
  2. または Auto Scaling グループ → employee-asgアクティビティ タブで確認

12-6. スケールイン確認

  1. 負荷テストを Ctrl+C で停止
  2. しばらく待つとインスタンス数が最小値(1)まで減少することを確認

12-7. 後片付け

負荷テスト用EC2インスタンス load-test-server を終了(削除)する。


トラブルシューティング

アプリが起動しない場合

Session Managerで接続し、状態確認:

sudo su - ec2-user
sudo systemctl status employee-app

RDSに接続できない場合

Auto Scalingでスケールアウトしない場合