← ハンズオン一覧に戻る

AWS Hands-on / Compute

混雑に合わせてサーバーの台数を自動で増減させる

サーバーの「設計図」を 1 つ用意し、それをもとに AWS が台数を自動で管理してくれる仕組み「Auto Scaling」を組み立てます。常に決めた台数を保ち、1 台が壊れれば自動で立て直し、混雑すれば台数を増やす——人が張り付かなくても回り続ける構成を、自分の手で作って確かめます。

● Lv.4 設計や運用を意識できる人 ⏱ 所要 70〜100 分 すべてコンソールで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須EC2 インスタンスを起動し、セキュリティグループで通信を許可した経験があること
  • 必須ロードバランサーで複数台のサーバーへアクセスを振り分ける構成を、作ったことがある(または仕組みを理解している)こと
  • あると良いユーザーデータでサーバーの初期設定を自動化したことがある(スクリプトは本文に用意しています)
  • あると良い「希望/最小/最大」という台数の考え方や、CPU 使用率という指標をイメージできる

※ このハンズオンは すべてコンソールだけで完結します。サーバーへのログイン(SSH)は使いません。台数が増減する様子は、すべてコンソールとブラウザの画面で確認します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

サーバーの台数を固定にしておくと、悩ましいことが起きます。混雑する時間帯には台数が足りずに重くなり、逆に空いている時間帯には使われないサーバーに料金を払い続けることになります。かといって、人が状況を見ながら手で台数を増やしたり減らしたりするのは、夜中も含めて現実的ではありません。

この「台数の調整」を AWS に任せる仕組みが Amazon EC2 Auto Scaling です。サーバーの設計図(起動テンプレート)を 1 つ渡し、「最低何台・通常何台・最大何台」と方針を決めておくと、AWS が常にその台数を保ち、壊れた台は自動で立て直し、混雑すれば設計図どおりのサーバーを増やしてくれます。今回はこれをロードバランサーと組み合わせ、自動で増減する Web の土台を作ります。

増やす台数は、どうやって決まるの?

希望容量・最小・最大の 3 つの数字で枠を決めます。通常は「希望」の台数を保ち、混雑時は「最大」まで増やし、空いてきたら「最小」まで減らします。増減のきっかけはスケーリングポリシー(例:平均 CPU 使用率を 50% に保つ)で指定します。

1 台が壊れたらどうなるの?

Auto Scaling グループは、台数が決めた数を下回ると自動で新しい 1 台を立ち上げて穴を埋めます。これは「自己修復」と呼ばれる動きで、今回いちばん分かりやすく確認できるポイントです。

Goal

起動テンプレートとロードバランサーをもとに Auto Scaling グループで常に 2 台を維持し、ロードバランサー経由で振り分けられることを確認する。さらに 1 台を手動で終了すると自動で 1 台が補充され、希望の台数が保たれることを確かめ、混雑時に増えるスケーリングポリシーも設定する。

04 — Architecture

つくる構成

起動テンプレート(サーバーの設計図)をもとに、Auto Scaling グループが 2 つのアベイラビリティーゾーンへサーバーを配置します。前段のロードバランサーが、いま動いているサーバーへアクセスを振り分けます。混雑すると、最大 4 台まで自動で増えます。

あなたのブラウザ
aws AWS Cloud
Region : ap-northeast-1(東京)
Application Load Balancer(いま動いているサーバーへ振り分け)
起動テンプレート(サーバーの設計図)— この設計図どおりに増やす
Auto Scaling グループ 最小 2 希望 2 最大 4
パブリックサブネット(ゾーン a)
EC2(稼働中)
Apache 稼働
+必要なら自動で追加
パブリックサブネット(ゾーン c)
EC2(稼働中)
Apache 稼働
+必要なら自動で追加
Auto Scaling グループは、台数が希望を下回ると自動で補充し、混雑(CPU 使用率の上昇など)が続くと最大まで増やします。
増えたサーバーは、起動テンプレートどおりの構成で立ち上がり、自動でロードバランサーの振り分け先に加わります。
05 — Requirements

要件

以下の要件を満たす構成を作り、台数が自動で保たれる様子を確認してください。

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 から許可。
4Auto Scaling グループを作る。起動テンプレートを使用し、2 つのアベイラビリティーゾーンのパブリックサブネットを指定。希望容量 2・最小 2・最大 4。手順 3 のターゲットグループにアタッチし、ヘルスチェックは Elastic Load Balancing を有効にする。
5ターゲット追跡スケーリングポリシーを設定する(例:平均 CPU 使用率の目標値を 50%)。
6動作を確認する。(a) 2 台が healthy になり、ロードバランサーの DNS 名でアクセスが振り分けられる。(b) 1 台を手動で終了すると、自動で新しい 1 台が立ち上がり、希望容量の 2 台に戻る
06 — Steps

構築の進め方

「設計図(起動テンプレート)→ 受付役(ロードバランサー)→ 自動管理(Auto Scaling グループ)→ 増減の方針(ポリシー)」の順に積み上げ、最後に台数が自動で保たれる様子を確かめます。

  1. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. セキュリティグループを 2 つ用意する

    先に通信の入口を 2 つ作っておくと、あとがスムーズです。EC2 コンソールの「セキュリティグループ」で次の 2 つを作成します。

    ロードバランサー用(例:alb-sgインバウンドで HTTP(80)を 0.0.0.0/0(どこからでも)から許可
    サーバー用(例:web-sgインバウンドで HTTP(80)を、ソース=ロードバランサー用セキュリティグループ(alb-sgから許可
    サーバーへは「受付役からのみ」

    サーバー用は、利用者が直接アクセスできないよう、ロードバランサー用からの通信だけを許可します。自動で増えるサーバーにも、この設計図(起動テンプレート)を通じて同じルールが適用されます。

  3. 起動テンプレート(サーバーの設計図)を作る

    EC2 コンソール左メニュー「起動テンプレート」→「起動テンプレートを作成」を開きます。名前(例:web-template)を付け、次のように設定します。ユーザーデータは「高度な詳細」の中にあります。

    AMIAmazon 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 グループ側で指定するので、テンプレートには含めなくて構いません。

  4. ターゲットグループとロードバランサーを作る

    左メニュー「ターゲットグループ」→「作成」で、タイプ「インスタンス」HTTP:80・対象 VPC を選んで作成します(この時点ではターゲットは未登録で構いません。あとで Auto Scaling グループが自動で登録します)。続けて「ロードバランサー」→「作成」→ Application Load Balancer を選び、次のようにします。

    ターゲットグループを作成 — タイプの選択(イメージ)

    ターゲットの種類

    インスタンス
    EC2 インスタンスを宛先にする
    IP アドレス
    IP を直接指定する
    Lambda 関数
    関数を宛先にする

    Auto Scaling グループで使うので「インスタンス」を選びます

    スキームインターネット向け(Internet-facing)
    ネットワークマッピングVPC を選び、2 つのアベイラビリティーゾーンのパブリックサブネットにチェック
    セキュリティグループロードバランサー用(alb-sg
    リスナーHTTP : 80 → 作成したターゲットグループへ転送
    ターゲットは「手で登録しない」

    このあと作る Auto Scaling グループにターゲットグループを結び付けると、増えたサーバーが自動で振り分け先に登録され、減ったサーバーは自動で外れます。だからここでは、ターゲットを手で登録する必要はありません。

  5. Auto Scaling グループを作る

    EC2 コンソール左メニュー「Auto Scaling グループ」→「Auto Scaling グループを作成」を開き、名前(例:web-asg)を付けます。次のように進めます。

    起動テンプレートweb-template を選択
    ネットワークVPC を選び、2 つのアベイラビリティーゾーンのパブリックサブネットを指定
    ロードバランシング「既存のロードバランサーにアタッチ」→ 手順 4 のターゲットグループを選択
    ヘルスチェックElastic Load Balancing のヘルスチェックを有効化
    容量希望容量 2・最小 2・最大 4
    なぜ Elastic Load Balancing のヘルスチェックを有効にするの?

    これを有効にすると、「サーバーが起動している」だけでなく「ロードバランサーから見て応答できる」かどうかでも健全性を判断します。Web として実際に使える状態かを基準に、入れ替えや補充を行えるようになります。

  6. スケーリングポリシー(増減の方針)を設定する

    Auto Scaling グループの作成中、または作成後の「自動スケーリング」タブで、「ターゲット追跡スケーリングポリシー」を追加します。指標に「平均 CPU 使用率」、目標値に 50(%)を設定します。

    「目標値を保つ」という考え方

    ターゲット追跡は、エアコンの温度設定に似ています。「平均 CPU を 50% に保つ」と決めておくと、混雑して 50% を超え続ければ台数を増やし、下回って余裕が出れば(最小の範囲で)減らします。細かいしきい値を自分で組まなくてよいのが利点です。

    ※ 実際にこのポリシーで増えるには、CPU の高い状態が続く必要があります。今回は次のステップの「自己修復」で自動増減の動きを確認し、ポリシーは本番向けの設定として用意しておく位置づけです。

  7. 動作確認 ①:2 台が動き、振り分けされることを見る

    Auto Scaling グループの「インスタンス管理」に 2 台が現れ、ライフサイクルが InService になるのを待ちます。ターゲットグループの「ターゲット」タブで2 台が healthy になったら、ロードバランサーの「DNS 名」http://<DNS 名> でブラウザに開き、再読み込みでホスト名が切り替わることを確認します。

    ここまでで「自動で 2 台そろう」状態

    注目すべきは、インスタンスを 1 台ずつ手で起動していないことです。Auto Scaling グループに「希望 2」と伝えただけで、設計図どおりの 2 台が自動でそろっています。

  8. 動作確認 ②:1 台を終了して「自己修復」を見る

    「インスタンス」一覧から、グループ内のサーバーを1 台選んで終了(Terminate)します。すると Auto Scaling グループは台数が希望を下回ったことを検知し、自動で新しい 1 台を立ち上げて 2 台に戻します。グループの「アクティビティ」タブに、終了と新規起動の履歴が記録されます。数分待つと、新しいサーバーも healthy になり振り分けに加わります。

    (任意)増える様子も見たい場合

    Auto Scaling グループの希望容量を一時的に 3 や 4 に変更すると、その台数まで自動で増えます(最大 4 の範囲内)。増えたサーバーがロードバランサーの振り分けに加わるのを確認したら、料金のため希望容量を 2 に戻しておきましょう。確認が終わったら、必ず後片づけまで進めてください。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — サーバーが起動と終了を繰り返してしまう

「インスタンスが立ち上がっては消え、なかなか安定しない」

Elastic Load Balancing のヘルスチェックで不健全と判断され、入れ替えられ続けている可能性があります。①サーバー用セキュリティグループが、ロードバランサー用からの HTTP(80)を許可しているか②起動テンプレートのユーザーデータで Apache が起動するか(1 行目が #!/bin/bash か)、③ターゲットグループのヘルスチェックのパス/ポートが合っているかを見直しましょう。

Pitfall 02 — インスタンスを消しても、すぐ復活して消せない

「不要なサーバーを終了しても、また立ち上がってくる」

これは故障ではなく、Auto Scaling グループが希望容量を保とうとしている正しい動きです。グループが生きている限り、手で終了しても自動で補充されます。本当に台数を減らす・止めるには、Auto Scaling グループ側で希望容量を変えるか、グループそのものを削除します。後片づけでも、まず Auto Scaling グループから削除します。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。EC2 コンソールとブラウザを開いて、次を順に確かめましょう。

  • 「起動テンプレート」一覧に web-template がある。
  • 「Auto Scaling グループ」に web-asg があり、希望 2・最小 2・最大 4 になっている。
  • web-asg の「インスタンス管理」に 2 台あり、ライフサイクルが InService になっている。
  • 「ターゲットグループ」で 2 台が healthy になっている。
  • ロードバランサーの http://<DNS 名> を開くと、再読み込みでホスト名が入れ替わる
  • web-asg の「自動スケーリング」に、平均 CPU 使用率のターゲット追跡ポリシーが設定されている。
  • 1 台を終了すると、「アクティビティ」に終了と新規起動の履歴が残り、自動で 2 台に戻る
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. 容量を「希望・最小・最大」の 3 つに分けて指定しました。最小と最大を分けて持つことには、それぞれどんな意味があるでしょうか。両方を同じ値にした場合との違いも考えてみましょう。
    ヒント
    最小は「これ以上は減らさない下限」、最大は「これ以上は増やさない上限」です。下限は可用性(最低限の台数を保つ)、上限は暴走を防いでコストの上限を決める役割と考えると、分けて持つ理由が見えてきます。
  2. 1 台を終了しても自動で補充されました。この「自己修復」は、台数を固定で運用する場合と比べて、可用性の面でどんな価値があるでしょうか。
    ヒント
    固定運用では、1 台壊れると人が気づいて対応するまで台数が欠けたままです。自己修復があると、夜間でも自動で台数が戻ります。「気づく → 直す」を人がやるか、仕組みがやるか、という観点で比べてみましょう。
  3. ターゲット追跡で「平均 CPU 使用率 50%」を目標にしました。これを 30% や 70% に変えると、サービスの余裕と料金の関係はどう変わるでしょうか。
    ヒント
    目標値を低くすると、早めに台数を増やすので余裕は出ますが、台数が多くなりがちで料金は上がります。高くすると、ぎりぎりまで台数を増やさないので安く済む反面、急な混雑への余裕は減ります。安全と料金のトレードオフとして考えてみましょう。
10 — Clean up

後片づけ

片づけの順番がとくに大事です。先に Auto Scaling グループを削除しないと、サーバーを終了しても自動で補充されて消えません。次の順で進めましょう。

  1. Auto Scaling グループを削除する:「Auto Scaling グループ」で web-asg を選び削除します。これに伴い、配下の EC2 インスタンスも自動で終了します(手で 1 台ずつ消す必要はありません)。
  2. ロードバランサーを削除する:「ロードバランサー」で対象を選び削除します。これで時間課金が止まります。
  3. ターゲットグループを削除する:ロードバランサーを消したあとに削除します。
  4. 起動テンプレートを削除する(任意):「起動テンプレート」から web-template を削除できます。
  5. セキュリティグループを削除する(任意):web-sgalb-sg は、上記をすべて消したあとに削除できます(他で使っていないことを確認してから)。
Caution — まず Auto Scaling グループから消す

グループを残したままサーバーを消しても、すぐ復活する

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 の公式料金ページで確認してください。