ELB と Auto Scaling
ELB(Elastic Load Balancing)はリクエストを複数のサーバーに振り分け、Auto Scaling はサーバーの台数を需要に合わせて自動で増減します。SAA では、この 2 つを複数 AZ にまたがって組み合わせる「止まらない・無駄のない」設計が頻出です。
ひとことで言うと: ELB は「受付係」、Auto Scaling は「人手を増減させる店長」です。
たとえるなら、受付係(ELB)が来店客を空いている窓口へ案内し、店長(Auto Scaling)は行列の長さを見て窓口の担当者を増やしたり減らしたりします。ある支店(AZ)が停電したら、別の支店で担当者を補充します。
このページで押さえる論点
ELB の仕組みと高可用性
ELB は、利用者からのリクエストを受け取って、ターゲットグループ(振り分け先をまとめたグループ)に登録されたターゲットへ分散します。ALB の場合、ターゲットには EC2 インスタンス、IP アドレス、Lambda 関数を指定できます。
ELB はヘルスチェック(定期的な生存確認)をターゲットグループ単位で行い、異常と判定したターゲットへの新しいリクエストを止めます。検知までの間や、すでに処理中のリクエストではエラーになることがあります。正常なターゲットが残っていれば、その後の新しいリクエストをそちらへ振り分けます。
利用者から見える入口は ELB の DNS 名(アドレス)1 つです。その裏で ELB は、指定した AZ ごとにロードバランサーノード(ELB の実体)を作ります。ALB を作るときは、少なくとも 2 つの AZ のサブネットを選ぶ必要があります。ALB の既定の振り分け方式はラウンドロビン(順番に割り当てる方式)です。
ALB が複数 AZ の EC2 に振り分ける
※簡略化しています: リクエストを 1 件ずつ順番に動かしていますが、実際は多数のリクエストが同時に処理されます。異常の検知までや処理中の通信が必ず成功するとは限りません。ALB の既定の振り分け方式はラウンドロビン(順番に割り当てる方式)で、ほかの方式も選べます。ALB 自体も各 AZ に配置されますが、図では 1 つにまとめています。
図では ALB を 1 つの箱にまとめていますが、実際は AZ ごとにノードがあります。そのため AZ-a が止まっても、AZ-c のノードとターゲットで処理を続けられます。ELB 自体が単一障害点(そこが壊れると全体が止まる箇所)にならないのはこのためです。
ロードバランサーの種類と選び方
SAA で問われるのは ALB・NLB・GWLB の 3 種類です。「どの層(レイヤー)の情報を見て振り分けるか」で役割が分かれます。
| 種類 | 動く層・扱う通信 | 得意なこと | 選ぶ目安 |
|---|---|---|---|
| ALB(Application) | レイヤー 7(アプリケーションの中身を見る層)。HTTP / HTTPS | URL のパス(/api など)やホスト名で振り分け先を変える。HTTPS の暗号化を ALB で終わらせる。Lambda 関数もターゲットにできる | Web アプリ、マイクロサービス |
| NLB(Network) | レイヤー 4(ポート番号までを見る層)。TCP / UDP / TLS など | 非常に多くの接続を低遅延でさばく。AZ ごとに静的 IP アドレスを持ち、Elastic IP も割り当てられる。PrivateLink のエンドポイントサービスに使える | 固定 IP が必要、TCP/UDP のゲームや IoT、他 VPC へのサービス公開 |
| GWLB(Gateway) | レイヤー 3(IP パケットの層)。すべてのポートの IP パケット | ファイアウォールなどの仮想アプライアンス(ソフトウェアで動く専用装置)を通信経路に挟み、台数を増減させる | 他社製のファイアウォール・侵入検知/防止(IDS/IPS)製品で通信を検査したい |
NLB の固定 IP と PrivateLink
NLB は、有効にした AZ ごとにネットワークインターフェイスを作り、そこから静的 IP アドレスを得ます。インターネット向けの NLB なら、サブネットごとに 1 つの Elastic IP アドレス(固定のパブリック IP)を関連付けられます。「取引先のファイアウォールで接続先の IP アドレスを許可リストに登録する必要がある」という要件は NLB を選ぶ合図です。
AWS PrivateLink は、自分の VPC で動かしているサービスを、インターネットを通さずに他の VPC や他の AWS アカウントへ公開する仕組みです。公開する側はエンドポイントサービスを作り、その裏にロードバランサーを置きます。NLB または GWLB を使えます。ALB のパス・ホスト名ルーティングも必要なら、NLB のターゲットに ALB を登録して、NLB + PrivateLink + ALB の構成にできます。
GWLB(Gateway Load Balancer)
GWLB はレイヤー 3 で動き、すべてのポートの IP パケットを受け取って、登録した仮想アプライアンスへ配ります。GWLB とアプライアンスの間は GENEVE というプロトコル(ポート 6081)でやり取りします。アプリケーション側の VPC には GWLB エンドポイント(VPC エンドポイントの一種)を置き、VPC の境界を越えて通信を検査用の VPC へ受け渡します。利用者やアプリから見ると経路の途中に透過的に挟まる「関所」で、アプライアンスの台数は需要に合わせて増減できます。
振り分けの細かい設定
クロスゾーン負荷分散
クロスゾーン負荷分散は、各 AZ のロードバランサーノードが他の AZ のターゲットにも振り分けるかどうかの設定です。有効なら、各ノードはすべての AZ のターゲットに分散します。無効なら、各ノードは自分の AZ のターゲットにだけ送ります。
たとえば AZ-a に 2 台、AZ-b に 8 台のターゲットがあるとします。有効なら 10 台がそれぞれ 10% ずつ受け取ります。無効だと、ノードごとに利用者の通信の 50% を自分の AZ の中だけで分けるため、AZ-a の 2 台は 25% ずつ、AZ-b の 8 台は 6.25% ずつとなり、負荷が偏ります。
| 種類 | クロスゾーン負荷分散の既定 |
|---|---|
| ALB | ロードバランサー単位では常に有効(ターゲットグループ単位で無効にできる) |
| NLB | 既定で無効(作成後いつでも有効にできる) |
| GWLB | 既定で無効(作成後いつでも有効にできる) |
登録解除の遅延(Connection Draining)
スケールインやメンテナンスでターゲットをロードバランサーから外すとき、いきなり切り離すと処理中のリクエストが途中で失敗します。登録解除の遅延を使うと、外すターゲットには新しいリクエストを送らず、処理中のリクエストが終わるまで待ってから登録解除を完了します。既定では 300 秒待ちます。Classic Load Balancer では同じ働きの機能を Connection Draining と呼びます。
スティッキーセッション
スティッキーセッション(セッション維持)は、同じ利用者のリクエストを同じ正常なターゲットへ送り続ける機能です。ALB は Cookie(ブラウザに保存される小さなデータ)を使って送り先を覚えます。ターゲットが異常と判定されれば、ALB はそのターゲットへのルーティングを止めます。一方、セッション情報をサーバー内だけに持たせていると、そのサーバーが停止した場合に情報を失うことがあります。SAA では、セッション情報を ElastiCache や DynamoDB に外出しし、どのサーバーが処理してもよい状態(ステートレス)にする設計が望ましいとされます。
HTTPS 通信の暗号化(SSL/TLS 終端・ACM・SNI)
ALB で HTTPS を受けるには、HTTPS リスナー(待ち受けの設定)に SSL/TLS のサーバー証明書を少なくとも 1 つ置きます。ALB は利用者との暗号化通信をそこで終わらせ(SSL/TLS 終端)、復号してからターゲットへ送ります。ターゲットグループのプロトコルを HTTPS にすれば、ALB からターゲットまでの通信も暗号化できます。暗号化・復号の処理を EC2 から肩代わりできるので、SSL オフロードとも呼ばれます。
証明書は AWS Certificate Manager(ACM)で作るのが推奨です。ACM が発行して ELB に置いた証明書は、期限切れの前に ACM が自動で更新を試みるため、更新忘れによる障害を防げます。
SNI(Server Name Indication)は、利用者が接続時に「どのホスト名に接続したいか」を伝える仕組みです。ALB は 1 つの HTTPS リスナーに複数の証明書を登録でき、利用者が伝えたホスト名に合う証明書を選びます。これにより、複数のドメイン(例: shop.example.com と blog.example.net)を 1 つの ALB でまとめて HTTPS 化できます。
Auto Scaling グループの基本
Auto Scaling グループ(ASG)は、EC2 を最小・希望・最大の 3 つの台数で管理します。希望容量(今あるべき台数)はスケーリングポリシーによって変わりますが、必ず最小〜最大の範囲に収まります。
Auto Scaling が行うのは、台数を増減する水平スケーリング(スケールアウト/スケールイン)です。インスタンスタイプを大きくする垂直スケーリング(スケールアップ)は行いません。台数で調整するので、負荷が下がった時間帯は台数を減らしてコストを抑えられます。
ASG に複数 AZ のサブネットを指定すると、Auto Scaling は各 AZ の台数が等しくなるように、台数が最も少ない AZ で新しいインスタンスを起動します。1 つの AZ が使えなくなると別の AZ で起動して補い、AZ が復旧すると AZ 間の台数を自動で均等に戻します。「ELB + 複数 AZ にまたがる ASG」が高可用性の基本形です。
起動テンプレート
起動テンプレートは、ASG が起動する EC2 の設計図です(AMI、インスタンスタイプ、セキュリティグループなど)。古い起動設定に代わるもので、AWS は起動テンプレートの利用を推奨しています。
- 複数のバージョンを持てるので、設定を変えるときに前のバージョンを残せる
- 複数のインスタンスタイプを指定する ASG や、オンデマンドとスポットインスタンスを混在させる ASG は、起動テンプレートでないと設定できない
- 起動設定では使えない Auto Scaling や EC2 の新しい機能がある
Auto Scaling のヘルスチェック
ASG の既定のヘルスチェックは EC2 のステータスチェックで、インスタンス自体の故障しか検知できません。ELB のヘルスチェックを追加すると、EC2 は動いているのにアプリが応答しない場合も異常と判定され、Auto Scaling がそのインスタンスを新しいものに置き換えます。起動直後のインスタンスには、準備が整うまで追加のヘルスチェックを待つヘルスチェック猶予期間があります。
スケーリングの方法
「いつ・何を基準に台数を変えるか」によって、次の方法から選びます。動的スケーリング(ターゲット追跡・ステップ・シンプル)は CloudWatch のメトリクス(CPU 使用率などの数値)をもとに動きます。
| 方法 | 動き方 | 向いている場面 |
|---|---|---|
| ターゲット追跡 | 指標を目標値に保つように台数を自動計算する(例: 平均 CPU 使用率 50%、ALB のターゲットあたりのリクエスト数) | 多くの場面での第一候補。AWS が強く推奨 |
| ステップ | CloudWatch アラームのしきい値を超えた幅に応じて、段階的に増減する台数を変える | 大きく超えたら一気に増やしたいなど、細かく制御したい |
| シンプル | アラームで決まった台数だけ増減し、クールダウンが終わるまで次の増減をしない | AWS はベストプラクティスとして使わないことを推奨 |
| スケジュール | 指定した日時に希望容量や最小・最大を変える | 毎朝 9 時の始業時など、時刻の決まった変動 |
| 予測 | 負荷の履歴から日ごと・週ごとのパターンを見つけ、予想される負荷の前に台数を増やす | 営業時間と夜間・週末で規則的に変わる負荷、起動に時間がかかるアプリ |
| 手動 | 希望容量を手で変える | 一時的な調整 |
下のシミュレーターはターゲット追跡スケーリングの例です。「平均 CPU 使用率を 50% に保つ」と目標を決めておくと、Auto Scaling が必要な台数を計算して希望容量を変えます。ただし最大を超えて増えたり、最小を下回って減ったりはしません。
アクセス量と AZ 障害で台数がどう変わるか
設定: 最小 2 台 / 最大 8 台 / 目標 CPU 使用率 50%(EC2 1 台は 100 リクエスト/秒で CPU 100% になると仮定)
※簡略化しています: CPU 使用率はアクセス量に比例すると仮定し、ターゲット追跡スケーリングで計算した台数をすぐに反映しています。実際はメトリクスの収集間隔・インスタンスの起動時間・ウォームアップがあり、台数を減らす(スケールイン)ときはゆっくり慎重に行われます。AZ の復旧後は、Auto Scaling が AZ 間の台数を自動で均等に戻します。
クールダウンとウォームアップ
シミュレーターは計算した台数をすぐ反映していますが、実際には新しいインスタンスが起動して処理できるようになるまで時間がかかります。その間に「まだ CPU が高い」と判断して増やし過ぎないための仕組みが 2 つあります。
| 仕組み | 使うポリシー | 内容 |
|---|---|---|
| クールダウン | シンプルスケーリング | スケーリングの後、次のスケーリングを始めるまで待つ時間。既定は 300 秒 |
| ウォームアップ | ターゲット追跡・ステップスケーリング | 起動したばかりのインスタンスを、ウォームアップが終わるまでグループの集計メトリクスに数えない。クールダウンを待たずにすぐ次のスケールアウトを始められる |
ターゲット追跡スケーリングは、負荷が減ったときは徐々にスケールインして、可用性を優先します。スケールアウトの途中(ウォームアップ中)は、ポリシーによるスケールインが止められます。
ライフサイクルフック
ライフサイクルフックは、インスタンスの起動時や終了時に一時停止させ、その間に独自の処理を差し込む機能です。処理が終わったら「続行」を通知すると次の状態へ進みます。
| タイミング | 待機状態 | 使い方の例 |
|---|---|---|
| スケールアウト(起動) | Pending:Wait | 必要なソフトウェアをインストールし、準備が整ってからリクエストを受け始める(ELB に登録されるタイミングを制御する) |
| スケールイン(終了) | Terminating:Wait | 終了する前にログやデータを取り出す。EventBridge の通知から Lambda 関数を呼び出して処理する |
待機する時間(ハートビートタイムアウト)の既定は 1 時間です。
問題文のキーワード → 選ぶべき答え
| 問題文によく出る言い回し | 選ぶべき答えと理由 |
|---|---|
| 「URL のパス」「ホスト名」で振り分け先を変えたい | ALB。レイヤー 7 で HTTP の中身を見て振り分けられる |
| 「固定 IP アドレス」「取引先が IP を許可リストに登録」 | NLB(+ Elastic IP)。AZ ごとに静的 IP を持つ |
| 「TCP / UDP」「非常に多くの接続」「超低遅延」 | NLB。レイヤー 4 で大量の接続をさばく |
| 「サードパーティ製のファイアウォール/IDS/IPS で通信を検査」 | GWLB。仮想アプライアンスを経路に透過的に挟み、台数も増減できる |
| 「自社サービスを他の VPC・他アカウントへ、インターネットを通さず公開」 | NLB + PrivateLink(エンドポイントサービス) |
| 「PrivateLink で公開し、URL パスでも振り分けたい」 | NLB + PrivateLink + ALB。NLB のターゲットに ALB を登録する |
| 「EC2 の暗号化処理の負荷を減らす」「証明書の更新の手間を減らす」 | ALB で SSL/TLS 終端 + ACM。ACM の証明書は自動更新される |
| 「1 つのロードバランサーで複数ドメインを HTTPS 化」 | ALB の SNI。1 つのリスナーに複数の証明書を登録できる |
| 「AZ ごとのインスタンス数が異なっても、各インスタンスに均等に分散」 | クロスゾーン負荷分散を有効にする(NLB・GWLB は既定で無効) |
| 「スケールイン時に処理中のリクエストを失わない」 | 登録解除の遅延(Connection Draining) |
| 「アプリが応答しないインスタンスを自動で入れ替え」 | ASG のヘルスチェックに ELB のヘルスチェックを追加する |
| 「平均 CPU 使用率を 50% 前後に保つ」「最小の運用負荷で」 | ターゲット追跡スケーリング |
| 「毎週月曜の朝に急増する」「決まった時刻」 | スケジュールに基づくスケーリング(周期的なパターンなら予測スケーリングも可) |
| 「終了前にログを退避」「起動後にソフトを入れてから受け付け」 | ライフサイクルフック |
| 「オンデマンドとスポットを組み合わせてコストを最小に」 | 起動テンプレートで複数の購入オプションを指定した ASG |
引っかけポイント
- 「Auto Scaling でインスタンスタイプを大きくして性能を上げる」→ ✕。Auto Scaling は台数を増減する水平スケーリング。垂直スケーリングはしない
- 「固定 IP が必要なので ALB に Elastic IP を割り当てる」→ ✕。Elastic IP を関連付けられるのは NLB
- 「NLB は既定でクロスゾーン負荷分散が有効」→ ✕。NLB と GWLB は既定で無効。常に有効なのは ALB
- 「EC2 のステータスチェックだけでアプリの無応答も検知できる」→ ✕。アプリの異常を入れ替えるには ELB のヘルスチェックが必要
- 「スケーリングを安定させるにはシンプルスケーリング + クールダウンが最善」→ ✕。AWS はターゲット追跡かステップスケーリング(+ ウォームアップ)を推奨
- 「PrivateLink のエンドポイントサービスに ALB を直接指定する」→ ✕。入口に NLB または GWLB を使う。ただし NLB のターゲットに ALB を登録すれば、PrivateLink と ALB の L7 ルーティングを組み合わせられる
- 「スティッキーセッションなら、サーバー内だけのセッション情報も障害後に引き継がれる」→ ✕。異常ターゲットへ固定されるわけではなく、別ターゲットへ切り替わった際にサーバー内だけの情報は共有されません。ElastiCache や DynamoDB に外出しします。
まとめ: SAA 試験で押さえるポイント
- 高可用性の基本形は「ELB + 複数 AZ にまたがる Auto Scaling グループ」。1 つの AZ が止まっても残りの AZ で処理を続け、台数も補充される
- ロードバランサーの選び分け: HTTP/HTTPS でパスやホスト名による振り分け → ALB、TCP/UDP で超低遅延・固定 IP(Elastic IP)・PrivateLink → NLB、仮想アプライアンス(ファイアウォール製品など)を挟む → GWLB
- HTTPS は ALB で終端し、証明書は ACM で自動更新。複数ドメインは SNI で 1 つの ALB にまとめる
- ASG のヘルスチェックに「ELB」を追加すると、EC2 が動いていてもアプリが応答しない場合に異常として入れ替えられる
- スケーリングポリシー: 指標を目標値に保つターゲット追跡(第一候補)、超過幅で段階的に増減するステップ、決まった時刻に増減するスケジュール、過去の傾向から先回りする予測
- 毎朝 9 時に負荷が急増するなど予測できる変動 → スケジュール(または予測)スケーリングで事前に台数を増やす
- スケールインで処理中のリクエストを守る → 登録解除の遅延。起動・終了時に処理を差し込む → ライフサイクルフック
- ALB はセッション維持(スティッキーセッション)に対応するが、サーバーを使い捨てにできるようセッション情報は ElastiCache や DynamoDB に外出しするのが望ましい
確認問題
参考リンク
AWS 公式ドキュメント(外部サイトが開きます)。
- SAA-C03 試験ガイド(出題範囲・対象サービス)
- Network Load Balancer のターゲットとして Application Load Balancer を使用する
- Elastic Load Balancing とは
- Elastic Load Balancing の仕組み(クロスゾーン負荷分散)
- Application Load Balancer とは
- Application Load Balancer(アベイラビリティーゾーンとサブネット)
- Application Load Balancer のターゲットグループ
- ターゲットグループの属性(登録解除の遅延・スティッキーセッション)
- Application Load Balancer の HTTPS リスナー
- Application Load Balancer の SSL 証明書(SNI・ACM)
- Network Load Balancer とは
- Gateway Load Balancer とは
- Classic Load Balancer の Connection Draining
- エンドポイントサービスを作成する(AWS PrivateLink)
- AWS PrivateLink とは
- VPC ピアリングの基本(CIDR が重複する VPC 間の制限)
- Amazon EC2 Auto Scaling とは
- Auto Scaling の利点(複数 AZ への分散と再調整)
- Auto Scaling の起動テンプレート
- Auto Scaling グループのヘルスチェック
- ターゲット追跡スケーリングポリシー
- ステップスケーリングポリシーとシンプルスケーリングポリシー
- スケーリングクールダウン
- 予測スケーリング
- ライフサイクルフック