はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須EC2 インスタンスを起動し、セキュリティグループで通信を許可した経験があること
- 必須ロードバランサーで複数台のサーバーへアクセスを振り分ける構成を、作ったことがある(または仕組みを理解している)こと
- あると良いユーザーデータでサーバーの初期設定を自動化したことがある(スクリプトは本文に用意しています)
- あると良い「希望/最小/最大」という台数の考え方や、CPU 使用率という指標をイメージできる
※ このハンズオンは すべてコンソールだけで完結します。サーバーへのログイン(SSH)は使いません。台数が増減する様子は、すべてコンソールとブラウザの画面で確認します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
サーバーの台数を固定にしておくと、悩ましいことが起きます。混雑する時間帯には台数が足りずに重くなり、逆に空いている時間帯には使われないサーバーに料金を払い続けることになります。かといって、人が状況を見ながら手で台数を増やしたり減らしたりするのは、夜中も含めて現実的ではありません。
この「台数の調整」を AWS に任せる仕組みが Amazon EC2 Auto Scaling です。サーバーの設計図(起動テンプレート)を 1 つ渡し、「最低何台・通常何台・最大何台」と方針を決めておくと、AWS が常にその台数を保ち、壊れた台は自動で立て直し、混雑すれば設計図どおりのサーバーを増やしてくれます。今回はこれをロードバランサーと組み合わせ、自動で増減する Web の土台を作ります。
増やす台数は、どうやって決まるの?
希望容量・最小・最大の 3 つの数字で枠を決めます。通常は「希望」の台数を保ち、混雑時は「最大」まで増やし、空いてきたら「最小」まで減らします。増減のきっかけはスケーリングポリシー(例:平均 CPU 使用率を 50% に保つ)で指定します。
1 台が壊れたらどうなるの?
Auto Scaling グループは、台数が決めた数を下回ると自動で新しい 1 台を立ち上げて穴を埋めます。これは「自己修復」と呼ばれる動きで、今回いちばん分かりやすく確認できるポイントです。
起動テンプレートとロードバランサーをもとに Auto Scaling グループで常に 2 台を維持し、ロードバランサー経由で振り分けられることを確認する。さらに 1 台を手動で終了すると自動で 1 台が補充され、希望の台数が保たれることを確かめ、混雑時に増えるスケーリングポリシーも設定する。
つくる構成
起動テンプレート(サーバーの設計図)をもとに、Auto Scaling グループが 2 つのアベイラビリティーゾーンへサーバーを配置します。前段のロードバランサーが、いま動いているサーバーへアクセスを振り分けます。混雑すると、最大 4 台まで自動で増えます。
増えたサーバーは、起動テンプレートどおりの構成で立ち上がり、自動でロードバランサーの振り分け先に加わります。
要件
以下の要件を満たす構成を作り、台数が自動で保たれる様子を確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | 起動テンプレート(サーバーの設計図)を作る。AMI は Amazon Linux 2023、インスタンスタイプは無料利用枠の対象(例:t2.micro / t3.micro)。ユーザーデータで Apache(httpd)を起動し、どのサーバーか分かるページ(例:ホスト名表示)を配置する。サーバー用セキュリティグループは HTTP(80)をロードバランサー用セキュリティグループからのみ許可。 |
| 3 | ターゲットグループ(インスタンス、HTTP:80)と Application Load Balancer(インターネット向け、2 つのアベイラビリティーゾーン、リスナー HTTP:80)を作る。ロードバランサー用セキュリティグループは HTTP(80)を 0.0.0.0/0 から許可。 |
| 4 | Auto Scaling グループを作る。起動テンプレートを使用し、2 つのアベイラビリティーゾーンのパブリックサブネットを指定。希望容量 2・最小 2・最大 4。手順 3 のターゲットグループにアタッチし、ヘルスチェックは Elastic Load Balancing を有効にする。 |
| 5 | ターゲット追跡スケーリングポリシーを設定する(例:平均 CPU 使用率の目標値を 50%)。 |
| 6 | 動作を確認する。(a) 2 台が healthy になり、ロードバランサーの DNS 名でアクセスが振り分けられる。(b) 1 台を手動で終了すると、自動で新しい 1 台が立ち上がり、希望容量の 2 台に戻る。 |
構築の進め方
「設計図(起動テンプレート)→ 受付役(ロードバランサー)→ 自動管理(Auto Scaling グループ)→ 増減の方針(ポリシー)」の順に積み上げ、最後に台数が自動で保たれる様子を確かめます。
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
セキュリティグループを 2 つ用意する
先に通信の入口を 2 つ作っておくと、あとがスムーズです。EC2 コンソールの「セキュリティグループ」で次の 2 つを作成します。
ロードバランサー用(例: alb-sg)インバウンドで HTTP(80)を 0.0.0.0/0(どこからでも)から許可サーバー用(例: web-sg)インバウンドで HTTP(80)を、ソース=ロードバランサー用セキュリティグループ( alb-sg)から許可サーバーへは「受付役からのみ」サーバー用は、利用者が直接アクセスできないよう、ロードバランサー用からの通信だけを許可します。自動で増えるサーバーにも、この設計図(起動テンプレート)を通じて同じルールが適用されます。
-
起動テンプレート(サーバーの設計図)を作る
EC2 コンソール左メニュー「起動テンプレート」→「起動テンプレートを作成」を開きます。名前(例:
web-template)を付け、次のように設定します。ユーザーデータは「高度な詳細」の中にあります。AMI Amazon Linux 2023(無料利用枠の対象) インスタンスタイプ 無料利用枠の対象(例: t2.micro/t3.micro)セキュリティグループ サーバー用( web-sg)ユーザーデータ 下記スクリプトを貼り付け #!/bin/bash dnf install -y httpd systemctl enable --now httpd # どのサーバーが応答したか分かるよう、自分のホスト名を表示する echo "<h1>応答したサーバー</h1><p>$(hostname -f)</p>" > /var/www/html/index.html
起動テンプレートは「何台でも同じ」を作る素Auto Scaling グループは、台数を増やすときこの設計図を見て、まったく同じ構成のサーバーを起動します。サブネット(どのゾーンに置くか)は、次の Auto Scaling グループ側で指定するので、テンプレートには含めなくて構いません。
-
ターゲットグループとロードバランサーを作る
左メニュー「ターゲットグループ」→「作成」で、タイプ「インスタンス」・HTTP:80・対象 VPC を選んで作成します(この時点ではターゲットは未登録で構いません。あとで Auto Scaling グループが自動で登録します)。続けて「ロードバランサー」→「作成」→ Application Load Balancer を選び、次のようにします。
ターゲットの種類
インスタンスEC2 インスタンスを宛先にするIP アドレスIP を直接指定するLambda 関数関数を宛先にする↳Auto Scaling グループで使うので「インスタンス」を選びます
スキーム インターネット向け(Internet-facing) ネットワークマッピング VPC を選び、2 つのアベイラビリティーゾーンのパブリックサブネットにチェック セキュリティグループ ロードバランサー用( alb-sg)リスナー HTTP : 80 → 作成したターゲットグループへ転送 ターゲットは「手で登録しない」このあと作る Auto Scaling グループにターゲットグループを結び付けると、増えたサーバーが自動で振り分け先に登録され、減ったサーバーは自動で外れます。だからここでは、ターゲットを手で登録する必要はありません。
-
Auto Scaling グループを作る
EC2 コンソール左メニュー「Auto Scaling グループ」→「Auto Scaling グループを作成」を開き、名前(例:
web-asg)を付けます。次のように進めます。起動テンプレート web-templateを選択ネットワーク VPC を選び、2 つのアベイラビリティーゾーンのパブリックサブネットを指定 ロードバランシング 「既存のロードバランサーにアタッチ」→ 手順 4 のターゲットグループを選択 ヘルスチェック Elastic Load Balancing のヘルスチェックを有効化 容量 希望容量 2・最小 2・最大 4 なぜ Elastic Load Balancing のヘルスチェックを有効にするの?これを有効にすると、「サーバーが起動している」だけでなく「ロードバランサーから見て応答できる」かどうかでも健全性を判断します。Web として実際に使える状態かを基準に、入れ替えや補充を行えるようになります。
-
スケーリングポリシー(増減の方針)を設定する
Auto Scaling グループの作成中、または作成後の「自動スケーリング」タブで、「ターゲット追跡スケーリングポリシー」を追加します。指標に「平均 CPU 使用率」、目標値に
50(%)を設定します。「目標値を保つ」という考え方ターゲット追跡は、エアコンの温度設定に似ています。「平均 CPU を 50% に保つ」と決めておくと、混雑して 50% を超え続ければ台数を増やし、下回って余裕が出れば(最小の範囲で)減らします。細かいしきい値を自分で組まなくてよいのが利点です。
※ 実際にこのポリシーで増えるには、CPU の高い状態が続く必要があります。今回は次のステップの「自己修復」で自動増減の動きを確認し、ポリシーは本番向けの設定として用意しておく位置づけです。
-
動作確認 ①:2 台が動き、振り分けされることを見る
Auto Scaling グループの「インスタンス管理」に 2 台が現れ、ライフサイクルが
InServiceになるのを待ちます。ターゲットグループの「ターゲット」タブで2 台が healthy になったら、ロードバランサーの「DNS 名」をhttp://<DNS 名>でブラウザに開き、再読み込みでホスト名が切り替わることを確認します。ここまでで「自動で 2 台そろう」状態注目すべきは、インスタンスを 1 台ずつ手で起動していないことです。Auto Scaling グループに「希望 2」と伝えただけで、設計図どおりの 2 台が自動でそろっています。
-
動作確認 ②:1 台を終了して「自己修復」を見る
「インスタンス」一覧から、グループ内のサーバーを1 台選んで終了(Terminate)します。すると Auto Scaling グループは台数が希望を下回ったことを検知し、自動で新しい 1 台を立ち上げて 2 台に戻します。グループの「アクティビティ」タブに、終了と新規起動の履歴が記録されます。数分待つと、新しいサーバーも healthy になり振り分けに加わります。
(任意)増える様子も見たい場合Auto Scaling グループの希望容量を一時的に 3 や 4 に変更すると、その台数まで自動で増えます(最大 4 の範囲内)。増えたサーバーがロードバランサーの振り分けに加わるのを確認したら、料金のため希望容量を 2 に戻しておきましょう。確認が終わったら、必ず後片づけまで進めてください。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「インスタンスが立ち上がっては消え、なかなか安定しない」
Elastic Load Balancing のヘルスチェックで不健全と判断され、入れ替えられ続けている可能性があります。①サーバー用セキュリティグループが、ロードバランサー用からの HTTP(80)を許可しているか、②起動テンプレートのユーザーデータで Apache が起動するか(1 行目が #!/bin/bash か)、③ターゲットグループのヘルスチェックのパス/ポートが合っているかを見直しましょう。
「不要なサーバーを終了しても、また立ち上がってくる」
これは故障ではなく、Auto Scaling グループが希望容量を保とうとしている正しい動きです。グループが生きている限り、手で終了しても自動で補充されます。本当に台数を減らす・止めるには、Auto Scaling グループ側で希望容量を変えるか、グループそのものを削除します。後片づけでも、まず Auto Scaling グループから削除します。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザを開いて、次を順に確かめましょう。
- 「起動テンプレート」一覧に
web-templateがある。 - 「Auto Scaling グループ」に
web-asgがあり、希望 2・最小 2・最大 4 になっている。 web-asgの「インスタンス管理」に 2 台あり、ライフサイクルがInServiceになっている。- 「ターゲットグループ」で 2 台が healthy になっている。
- ロードバランサーの
http://<DNS 名>を開くと、再読み込みでホスト名が入れ替わる。 web-asgの「自動スケーリング」に、平均 CPU 使用率のターゲット追跡ポリシーが設定されている。- 1 台を終了すると、「アクティビティ」に終了と新規起動の履歴が残り、自動で 2 台に戻る。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- 容量を「希望・最小・最大」の 3 つに分けて指定しました。最小と最大を分けて持つことには、それぞれどんな意味があるでしょうか。両方を同じ値にした場合との違いも考えてみましょう。
ヒント
最小は「これ以上は減らさない下限」、最大は「これ以上は増やさない上限」です。下限は可用性(最低限の台数を保つ)、上限は暴走を防いでコストの上限を決める役割と考えると、分けて持つ理由が見えてきます。 - 1 台を終了しても自動で補充されました。この「自己修復」は、台数を固定で運用する場合と比べて、可用性の面でどんな価値があるでしょうか。
ヒント
固定運用では、1 台壊れると人が気づいて対応するまで台数が欠けたままです。自己修復があると、夜間でも自動で台数が戻ります。「気づく → 直す」を人がやるか、仕組みがやるか、という観点で比べてみましょう。 - ターゲット追跡で「平均 CPU 使用率 50%」を目標にしました。これを 30% や 70% に変えると、サービスの余裕と料金の関係はどう変わるでしょうか。
ヒント
目標値を低くすると、早めに台数を増やすので余裕は出ますが、台数が多くなりがちで料金は上がります。高くすると、ぎりぎりまで台数を増やさないので安く済む反面、急な混雑への余裕は減ります。安全と料金のトレードオフとして考えてみましょう。
後片づけ
片づけの順番がとくに大事です。先に Auto Scaling グループを削除しないと、サーバーを終了しても自動で補充されて消えません。次の順で進めましょう。
- Auto Scaling グループを削除する:「Auto Scaling グループ」で
web-asgを選び削除します。これに伴い、配下の EC2 インスタンスも自動で終了します(手で 1 台ずつ消す必要はありません)。 - ロードバランサーを削除する:「ロードバランサー」で対象を選び削除します。これで時間課金が止まります。
- ターゲットグループを削除する:ロードバランサーを消したあとに削除します。
- 起動テンプレートを削除する(任意):「起動テンプレート」から
web-templateを削除できます。 - セキュリティグループを削除する(任意):
web-sg・alb-sgは、上記をすべて消したあとに削除できます(他で使っていないことを確認してから)。
グループを残したままサーバーを消しても、すぐ復活する
Auto Scaling グループは希望容量を保とうとするため、グループが生きている間は EC2 を手で終了しても自動で補充されます。確実に止めるには、先に Auto Scaling グループを削除してください。デフォルト VPC やデフォルトのサブネットは消さないようにしましょう。
コストに関する注意: Amazon EC2 Auto Scaling の機能自体に追加料金はかかりませんが、動いている EC2 インスタンスの台数ぶんは課金されます。今回は最大 4 台まで増える設定のため、増えたまま放置すると料金がふくらみます(t2.micro / t3.micro などは無料利用枠の対象ですが、枠は時間の合計なので、複数台を動かすと早く使い切ります)。あわせて、Application Load Balancer の時間あたり料金と処理量(LCU)、各サーバーのディスク(EBS ボリューム)、割り当てられる public IPv4 アドレスにも料金がかかります。起動テンプレート・ターゲットグループ・VPC・サブネット・セキュリティグループ自体には料金はかかりません。使い終えたら、上の「後片づけ」で必ず Auto Scaling グループとロードバランサーを削除しましょう。最新の料金は AWS の公式料金ページで確認してください。