EC2 Auto Scaling で落ちても自動で戻る Web サーバーを作る
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済み
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| VPC | asg-lab-vpc | 検証用 VPC(CIDR: 10.0.0.0/16) |
| パブリックサブネット | asg-lab-public-subnet-1a | ap-northeast-1a のパブリックサブネット(CIDR: 10.0.1.0/24、パブリック IPv4 アドレスの自動割り当て有効) |
| パブリックサブネット | asg-lab-public-subnet-1c | ap-northeast-1c のパブリックサブネット(CIDR: 10.0.2.0/24、パブリック IPv4 アドレスの自動割り当て有効) |
| インターネットゲートウェイ | asg-lab-igw | インターネット接続用 |
| ルートテーブル | asg-lab-public-rt | 0.0.0.0/0 をインターネットゲートウェイへ向けるルート。2 つのパブリックサブネットに関連付け済み |
| セキュリティグループ | asg-lab-alb-sg | ALB 用。インバウンドで HTTP(80)を 0.0.0.0/0 から許可 |
| セキュリティグループ | asg-lab-web-sg | Web サーバー用。インバウンドで HTTP(80)を asg-lab-alb-sg からのみ許可 |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| 起動テンプレート | asg-lab-web-template | Web サーバーを入れた EC2 インスタンスの設定 |
| Auto Scaling グループ | asg-lab-asg | Web サーバー群(最小 2 / 希望 2 / 最大 4) |
| Application Load Balancer | asg-lab-alb | Web サーバー群の入口 |
| ターゲットグループ | asg-lab-tg | ALB の転送先(Auto Scaling グループのインスタンスが自動で登録される) |
| スケーリングポリシー | asg-lab-cpu50 | 平均 CPU 使用率 50% を目標にするターゲット追跡ポリシー |
起動テンプレートを作成する
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
- 上部の検索バーに
EC2と入力し、表示された「EC2」を選択します - 左側ナビゲーションの「インスタンス」→「起動テンプレート」を選択します
- 「起動テンプレートを作成」をクリックします
- 「起動テンプレート名と説明」で以下を入力します
- 起動テンプレート名:
asg-lab-web-template - テンプレートバージョンの説明:
httpd web server - Auto Scaling のガイダンス: チェックを入れる
- 起動テンプレート名:
- 「アプリケーションおよび OS イメージ (Amazon マシンイメージ)」で「クイックスタート」の「Amazon Linux」を選び、
Amazon Linux 2023の AMI を選択します - 「インスタンスタイプ」で
t3.microを選択します - 「キーペア (ログイン)」は「起動テンプレートに含めない」のままにします(このハンズオンではインスタンスにログインしません)
- 「ネットワーク設定」で以下を設定します
- サブネット: 「起動テンプレートに含めない」のまま
- ファイアウォール (セキュリティグループ): 「既存のセキュリティグループを選択する」を選び、
asg-lab-web-sgを選択
- 「高度な詳細」を展開し、一番下の「ユーザーデータ」に以下を貼り付けます。起動時に Apache(httpd)を入れ、インスタンス ID と AZ を表示するページを作るスクリプトです
#!/bin/bash
dnf install -y httpd
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
INSTANCE_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)
AZ=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/availability-zone)
echo "<h1>Hello from ${INSTANCE_ID}</h1><p>AZ: ${AZ}</p>" > /var/www/html/index.html
systemctl enable --now httpd
- その他の項目はデフォルトのままにし、右側の「起動テンプレートを作成」をクリックします
Auto Scaling グループを作成する(ALB も同時に作成)
Auto Scaling グループの作成ウィザードの中で、ALB とターゲットグループもあわせて作成します。
- 左側ナビゲーションの「Auto Scaling」→「Auto Scaling グループ」を選択します
- 「Auto Scaling グループを作成する」をクリックします
- 「ステップ 1: 起動テンプレートまたは起動設定を選択する」で以下を設定し、「次へ」をクリックします
- Auto Scaling グループ名:
asg-lab-asg - 起動テンプレート:
asg-lab-web-template - バージョン:
Default (1)
- Auto Scaling グループ名:
- 「ステップ 2: インスタンス起動オプションを選択する」の「ネットワーク」で以下を設定します
- VPC:
asg-lab-vpc - アベイラビリティーゾーンとサブネット:
asg-lab-public-subnet-1aとasg-lab-public-subnet-1cの 2 つを選択 - アベイラビリティーゾーンのディストリビューション:
バランシング (ベストエフォート)(デフォルト)
- VPC:
- 「インスタンスタイプの要件」は起動テンプレートの設定のまま(上書きしない)にし、「次へ」をクリックします
- 「ステップ 3: 他のサービスと統合する」の「ロードバランシング」で「新しいロードバランサーにアタッチする」を選択し、以下を設定します
- ロードバランサーのタイプ:
Application Load Balancer - ロードバランサーの名前:
asg-lab-alb - ロードバランサーのスキーム:
Internet-facing(既定はInternalなので、Internet-facingに切り替えます) - アベイラビリティーゾーンとサブネット:
ap-northeast-1a(asg-lab-public-subnet-1a)とap-northeast-1c(asg-lab-public-subnet-1c)が選ばれていることを確認 - リスナーとルーティング: プロトコル
HTTP、ポート80、デフォルトルーティングで「ターゲットグループを作成する」を選択 - 新しいターゲットグループ名:
asg-lab-tg
- ロードバランサーのタイプ:
- 同じ画面の「ヘルスチェック」で以下を設定します
- 追加のヘルスチェックタイプ: 「Elastic Load Balancing のヘルスチェックをオンにする」にチェック
- ヘルスチェックの猶予期間:
300秒(デフォルト)
- その他の項目はデフォルトのままにし、「次へ」をクリックします
- 「ステップ 4: グループサイズとスケーリングを設定する」で以下を設定します
- 希望するキャパシティ:
2 - 最小の希望する容量:
2 - 最大の希望する容量:
4 - 自動スケーリング: 「スケーリングポリシーなし」(ポリシーは後で追加します)
- 希望するキャパシティ:
- その他の項目はデフォルトのままにし、「次へ」をクリックします
- 「ステップ 5: 通知を追加する」は何も設定せず「次へ」をクリックします
- 「ステップ 6: タグを追加する」で「タグを追加する」をクリックし、キー
Name、値asg-lab-webを入力します。「新しいインスタンスにタグ付けする」にチェックが入っていることを確認し、「次へ」をクリックします - 「ステップ 7: 確認」で内容を確認し、「Auto Scaling グループを作成する」をクリックします
- 作成直後に「1 個の新しいターゲットグループを ASG にアタッチできません」というエラーが表示された場合は、ALB の作成がまだ終わっていないことがあります。ロードバランサー一覧で
asg-lab-albの状態が「アクティブ」になってから、asg-lab-asgの「統合」タブ →「ロードバランシング」の「編集」で「ターゲットグループ」にチェックを入れ、asg-lab-tgを選んで「更新」をクリックします
ALB のセキュリティグループを付け替える
ウィザードにはロードバランサーのセキュリティグループを選ぶ項目がなく、ウィザードで作成した ALB には起動テンプレートに指定した asg-lab-web-sg が付きます。asg-lab-web-sg は asg-lab-alb-sg からの HTTP しか許可していないため、ALB に asg-lab-alb-sg を付けないとブラウザからも ALB のヘルスチェックからも Web サーバーに届きません。ヘルスチェックの猶予期間(300 秒)が過ぎる前に付け替えます。
- 左側ナビゲーションの「ロードバランシング」→「ロードバランサー」を選択し、
asg-lab-albを選択します - 下部の「セキュリティ」タブを選択し、「編集」をクリックします
asg-lab-alb-sgを追加で選択してから、付いていたasg-lab-web-sgを「×」で外し、asg-lab-alb-sgだけが残った状態にします- 「変更内容の保存」をクリックします
ALB の DNS 名でアクセスする
asg-lab-albの詳細画面で、状態が「アクティブ」になっていることを確認し、「DNS 名」をコピーします- 左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択し、
asg-lab-tgを選択します - 下部の「ターゲット」タブで、2 台のインスタンス(
ap-northeast-1aとap-northeast-1cに 1 台ずつ)のヘルスステータスがHealthyになるまで待ちます
ブラウザで ALB の DNS 名にアクセスします。
http://<ALB の DNS 名>
Hello from i-xxxxxxxx とインスタンス ID、AZ が表示されることを確認します。何度か再読み込みすると、2 台のインスタンスの ID と AZ が入れ替わって表示されます。
インスタンスを 1 台終了して自動で置き換わることを確認する
インスタンスが落ちた状況を作るため、Auto Scaling グループのインスタンスを 1 台手動で終了します。
- 左側ナビゲーションの「インスタンス」→「インスタンス」を選択します
- 名前が
asg-lab-webのインスタンスのうち 1 台を選択し、インスタンス ID を控えます - 「インスタンスの状態」→「インスタンスを終了 (削除)」をクリックし、確認画面で「終了 (削除)」をクリックします
- 左側ナビゲーションの「Auto Scaling」→「Auto Scaling グループ」を選択し、
asg-lab-asgを選択します - 「アクティビティ」タブを選択します。インスタンスの終了が検知されて置き換えが始まるまで、2 分ほどかかることがあります。表示されない場合は少し待ってから更新します
「アクティビティ履歴」に、控えたインスタンスの終了と、新しいインスタンスの起動(Launching a new EC2 instance)が記録されることが確認できます。希望する容量 2 に対して実際の台数が 1 になったため、EC2 Auto Scaling が新しいインスタンスを起動して 2 台に戻しています。
- 「インスタンス管理」タブを選択し、新しいインスタンスが追加され、ライフサイクルが
InServiceになるまで待ちます - ターゲットグループ
asg-lab-tgの「ターゲット」タブで、新しいインスタンスがHealthyになったことを確認します - ブラウザで ALB の DNS 名に再度アクセスし、何度か再読み込みすると、新しいインスタンスの ID が表示されることが確認できます
ターゲット追跡スケーリングポリシーを設定する
最後に、平均 CPU 使用率が 50% 前後になるように台数を調整するポリシーを追加します。
asg-lab-asgの詳細画面で「オートスケーリング」タブを選択します- 「動的スケーリングポリシー」の「動的スケーリングポリシーを作成する」をクリックします
- 以下を設定します
- ポリシータイプ:
ターゲット追跡スケーリング - スケーリングポリシー名:
asg-lab-cpu50 - メトリクスタイプ:
平均 CPU 使用率 - ターゲット値:
50 - インスタンスのウォームアップ:
300秒(入力欄は空欄なので300を入力します) - 「スケールインを無効にしてスケールアウトポリシーのみを作成する」: チェックを入れない
- ポリシータイプ:
- 「作成」をクリックします
「動的スケーリングポリシー」に asg-lab-cpu50 が追加されたことを確認します。
- 上部の検索バーに
CloudWatchと入力し、表示された「CloudWatch」を選択します - 左側ナビゲーションの「アラーム」→「すべてのアラーム」を選択します
TargetTracking-asg-lab-asg-AlarmHigh- と TargetTracking-asg-lab-asg-AlarmLow- で始まる 2 つのアラームが作られていることが確認できます。ターゲット追跡ポリシーでは、これらのアラームを EC2 Auto Scaling が作成・管理するため、自分で編集・削除しないようにします。いまは負荷がかかっていないため、CPU 使用率が上がって台数が増えることはなく、最小容量の 2 台のまま動き続けます。