【AWSサービス 基礎編】Elastic Load Balancing でトラフィックを複数のターゲットに分散する

目次

概要

Web アプリケーションの運用において、単一のサーバーにすべてのトラフィックが集中すると、負荷の増大によるレスポンス低下や、サーバー障害時のサービス停止といったリスクが生じます。こうした課題に対して、トラフィックを複数のサーバーに分散する仕組みがロードバランサーです。

Elastic Load Balancing(ELB)は、AWS が提供するフルマネージドなロードバランシングサービスです。受信したトラフィックを複数の EC2 インスタンスやコンテナ、Lambda 関数などのターゲットに自動的に分散し、アプリケーションの可用性とスケーラビリティを向上させます。

本記事では、ELB の基本概念を理解し、Application Load Balancer(ALB)を作成して複数の EC2 インスタンスにトラフィックを分散する構成を体験します。

ELB の全体像: クライアントのリクエストを ALB が受け、ターゲットグループの EC2 に振り分ける
ELB の全体像: クライアントのリクエストを ALB が受け、ターゲットグループの EC2 に振り分ける
クラウドおさる

1 台の売店にお客が全部押し寄せたら、猿山でも行列が崩れて大騒ぎでござる。この記事では ALB を作って、2 台の EC2 にリクエストが振り分けられるところを確かめるでござる。

この記事のメリット

  • Elastic Load Balancing の種類と使い分けを理解できる
  • Application Load Balancer(ALB)を作成し、トラフィック分散を体験できる
  • ターゲットグループの作成とヘルスチェックの仕組みを把握できる
  • リスナーとルーティングルールの基本的な設定方法を習得できる
  • 複数のアベイラビリティゾーンにまたがる高可用性構成を理解できる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

クラウドおさる

とひさん、ロードバランサーはサーバーの負荷を分散するものだと聞いたでござる。AWS だと、どういうサービスがあるのでござるか?

土肥

AWS には Elastic Load Balancing、略して ELB っていうフルマネージドなロードバランシングサービスがあるよ。受信したトラフィックを複数のターゲットに自動的に分散してくれるんだ。しかもトラフィックの増減に応じてロードバランサー自体も自動スケーリングするから、キャパシティの事前計画は不要なんだよ。

クラウドおさる

ロードバランサー自体がスケーリングしてくれるのでござるな! どんなときに使うものでござる?

土肥

主なユースケースはこんな感じだね。

  • Web アプリケーションの高可用性確保
  • マイクロサービス間のトラフィック制御
  • 複数アベイラビリティゾーンにまたがる負荷分散
  • SSL/TLS 終端の一元化
クラウドおさる

けっこう幅広い用途があるのでござるな。ロードバランサーは 1 種類だけでござるか?

土肥

いや、ELB には 4 種類のロードバランサーがあるんだ。

種類略称動作レイヤー主なユースケース
Application Load BalancerALBレイヤー 7(HTTP/HTTPS)Web アプリケーション、マイクロサービス、パスベースルーティング
Network Load BalancerNLBレイヤー 4(TCP/UDP/TLS)超低レイテンシーが求められるアプリケーション、固定 IP が必要なケース
Gateway Load BalancerGWLBレイヤー 3(IP)サードパーティ仮想アプライアンスの展開(ファイアウォール、IDS/IPS)
Classic Load BalancerCLBレイヤー 4/7レガシー(新規利用は非推奨)
土肥

今回は最も一般的に利用される ALB を使っていくよ。

ELB の 4 種類: どのレイヤーでトラフィックを扱うかで使い分ける
ELB の 4 種類: どのレイヤーでトラフィックを扱うかで使い分ける
クラウドおさる

ALB はレイヤー 7 で HTTP/HTTPS を扱うのでござるな。では、ALB はどんな構成要素で成り立っているのでござるか?

土肥

ALB は「ロードバランサー」「リスナー」「ターゲットグループ」の 3 つが基本のコンポーネントで、リスナーには振り分け方を決めるリスナールールが付くんだ。順番に見ていこう。

  • ロードバランサー: クライアントからの接続を受け付けるエントリポイントです。複数のアベイラビリティゾーンに配置することで高可用性を実現します
  • リスナー: ロードバランサーが接続を受け付けるプロトコルとポートの設定です。HTTP(ポート 80)や HTTPS(ポート 443)を指定します
  • リスナールール: リスナーが受け取ったリクエストをどのターゲットグループに転送するかを定義するルールです。パスやホストヘッダーなどの条件に基づいてルーティングできます
  • ターゲットグループ: リクエストの転送先となるターゲット(EC2 インスタンスなど)をグループ化したものです。ヘルスチェックにより、正常なターゲットにのみトラフィックが分散されます(すべてのターゲットが異常になったときは例外で、後述します)
ALB の構成要素: リスナーで受けて、ルールに従ってターゲットグループへ転送する
ALB の構成要素: リスナーで受けて、ルールに従ってターゲットグループへ転送する
クラウドおさる

リスナーでリクエストを受けて、ルールに従ってターゲットグループに振り分ける、という流れでござるな。

クラウドおさる

ところで、ターゲットのサーバーが落ちてしまったらどうなるでござる? 落ちたサーバーにもリクエストが飛んでしまうのでござるか?

土肥

そこはヘルスチェックの仕組みがあるから大丈夫だよ。ターゲットグループに登録されたターゲットに対して、定期的にヘルスチェックが実施されるんだ。ヘルスチェックに失敗したターゲットは自動的にルーティング対象から除外されて、復旧すると再びトラフィックが分散されるようになるよ。ただし、ターゲットが全部同時に異常になったときは、ALB は「フェイルオープン」といって、ヘルスステータスにかかわらず全部のターゲットに振り分けるんだ。全部止めてしまうよりはまし、という考え方だね。

クラウドおさる

自動で切り離してくれるのでござるか。猿山の監視当番が、寝込んだ倉庫番を当番表から外しておき、元気になったら戻すのと同じでござるな。ヘルスチェックにはどんな設定があるのでござる?

土肥

主な設定項目はこの表のとおりだよ。

設定項目説明
プロトコルヘルスチェックに使用するプロトコル(HTTP、HTTPS)
パスヘルスチェックリクエストの送信先パス(例: /)
正常のしきい値正常と判断するまでの連続成功回数
非正常のしきい値異常と判断するまでの連続失敗回数
タイムアウトヘルスチェック応答のタイムアウト秒数
間隔ヘルスチェックの実行間隔
クラウドおさる

しきい値や間隔を調整できるのでござるな。これなら障害時でもユーザーへの影響を最小限にできそうでござる!

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド8 ステップ画面 11 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

前提条件

  • リージョン: ap-northeast-1(東京)
  • 以下のリソースが作成済みであること
リソース種別リソース名用途
VPCelb-lab-vpc検証用 VPC(CIDR: 10.0.0.0/16)
パブリックサブネットelb-lab-public-subnet-1aAZ-a のパブリックサブネット(CIDR: 10.0.1.0/24)
パブリックサブネットelb-lab-public-subnet-1cAZ-c のパブリックサブネット(CIDR: 10.0.2.0/24)
インターネットゲートウェイelb-lab-igwインターネット接続用
EC2 インスタンスelb-lab-web-1aAZ-a の Web サーバー
EC2 インスタンスelb-lab-web-1cAZ-c の Web サーバー
セキュリティグループelb-lab-web-sgEC2 用 SG(ポート 80 を許可)
  • 2 台の EC2 インスタンスにはそれぞれ簡易的な Web サーバーが起動しており、HTTP(ポート 80)でレスポンスを返す状態であること

この実践で作成するリソース

リソース種別リソース名用途
セキュリティグループelb-lab-alb-sgALB 用 SG
ターゲットグループelb-lab-tgEC2 インスタンスのグループ
Application Load Balancerelb-lab-albトラフィック分散用 ALB

ALB 用セキュリティグループの作成

AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに EC2 と入力し、表示された「EC2」を選択します。

左側ナビゲーションの「ネットワーク&セキュリティ」→「セキュリティグループ」を選択します。

「セキュリティグループを作成」をクリックします。

以下の情報を入力します。

  • セキュリティグループ名: elb-lab-alb-sg
  • 説明: Security group for ALB
  • VPC: elb-lab-vpc

「インバウンドルール」セクションで「ルールを追加」をクリックし、以下を入力します。

  • タイプ: HTTP
  • リソースタイプ: Anywhere-IPv4(選ぶと、ソース欄に 0.0.0.0/0 が入ります)
  • 説明: Allow HTTP from anywhere
elb-lab-alb-sg のインバウンドルール入力画面
elb-lab-alb-sg のインバウンドルール入力画面

アウトバウンドルールはデフォルト(すべてのトラフィックを許可)のままにします。

「セキュリティグループを作成」をクリックします。

elb-lab-alb-sg 作成完了画面
elb-lab-alb-sg 作成完了画面

EC2 セキュリティグループのインバウンドルール更新

EC2 インスタンスのセキュリティグループ elb-lab-web-sg に、ALB からのトラフィックを許可するルールを追加します。elb-lab-web-sg には、前提として 0.0.0.0/0 からの HTTP を許可するルールが入っています。

左側ナビゲーションの「ネットワーク&セキュリティ」→「セキュリティグループ」を選択し、elb-lab-web-sg を選択します。

「インバウンドルール」タブを選択し、「インバウンドルールを編集」をクリックします。

「ルールを追加」をクリックし、以下を入力します。

  • タイプ: HTTP
  • リソースタイプ: カスタム(デフォルト)のまま、ソース欄に elb-lab-alb-sg と入力し、候補に表示された elb-lab-alb-sg | sg-… を選択
  • 説明: Allow HTTP from ALB

「ルールを保存」をクリックします。

elb-lab-web-sg のインバウンドルール編集画面(ALB からの HTTP 許可ルールが追加された状態)
elb-lab-web-sg のインバウンドルール編集画面(ALB からの HTTP 許可ルールが追加された状態)
クラウドおさる

ALB の SG はインターネットから、EC2 の SG は ALB の SG から、と許可の元を分けたのでござるな。本番では、EC2 側に残っている 0.0.0.0/0 のルールを消して、ALB からしか入れないようにするのが定石でござる。

ターゲットグループの作成

左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択します。

「ターゲットグループの作成」をクリックします。作成は「ターゲットグループの作成」→「ターゲットを登録」→「確認と作成」の 3 ステップです。

「基本的な設定」セクションで以下を設定します。

  • ターゲットタイプの選択: インスタンス
  • ターゲットグループ名: elb-lab-tg
  • プロトコル / ポート: HTTP / 80
  • VPC: elb-lab-vpc
  • プロトコルバージョン: HTTP1
ターゲットグループの基本的な設定画面
ターゲットグループの基本的な設定画面

「ヘルスチェック」セクションでは以下を確認します。

  • ヘルスチェックプロトコル: HTTP
  • ヘルスチェックパス: /

その他の項目はデフォルトのままにします。

「次へ」をクリックします。

「使用可能なインスタンス」の一覧から elb-lab-web-1a と elb-lab-web-1c を選択し、「保留中として以下を含める」をクリックします(インスタンスを選ぶまで、このボタンは押せません)。

ターゲット登録画面(2 台のインスタンスが「ターゲットを確認」セクションに追加された状態)
ターゲット登録画面(2 台のインスタンスが「ターゲットを確認」セクションに追加された状態)

「次へ」をクリックし、確認画面で「ターゲットグループの作成」をクリックします。

ALB の作成

左側ナビゲーションの「ロードバランシング」→「ロードバランサー」を選択します。

「ロードバランサーの作成」をクリックします。

「Application Load Balancer」の「作成」をクリックします。

「基本的な設定」セクションで以下を設定します。

  • ロードバランサー名: elb-lab-alb
  • スキーム: インターネット向け
  • IP アドレスタイプ: IPv4
ALB の基本的な設定画面
ALB の基本的な設定画面

「ネットワークマッピング」セクションで以下を設定します。

  • VPC: elb-lab-vpc
  • マッピング: ap-northeast-1a(elb-lab-public-subnet-1a)と ap-northeast-1c(elb-lab-public-subnet-1c)を選択
ネットワークマッピングの設定画面(2 つの AZ とサブネットが選択された状態)
ネットワークマッピングの設定画面(2 つの AZ とサブネットが選択された状態)

「セキュリティグループ」セクションで以下を設定します。

  • 最初から選択されている default のセキュリティグループを削除し、elb-lab-alb-sg を選択

「リスナーとルーティング」セクションで以下を設定します。

  • プロトコル: HTTP
  • ポート: 80
  • デフォルトアクション: elb-lab-tg を選択
リスナーとルーティングの設定画面
リスナーとルーティングの設定画面

その他の項目はデフォルトのままにします。

画面最下部の「ロードバランサーの作成」をクリックします。

作成が完了すると、ロードバランサーの詳細画面に遷移し、成功のメッセージが表示されます。ステータスが「プロビジョニング中」から「アクティブ」に変わるまで待ちます(今回は 2 分ほどでした)。

ALB 作成完了画面(状態が「アクティブ」になった状態)
ALB 作成完了画面(状態が「アクティブ」になった状態)

動作確認

ロードバランサーの詳細画面で「DNS 名」をコピーします。

ブラウザで ALB の DNS 名にアクセスします。

http://<ALB の DNS 名>

Web サーバーからのレスポンスが表示されることを確認します。ページをリロードすると、異なるインスタンスからレスポンスが返される(トラフィックが分散されている)ことが確認できます。

ブラウザで ALB の DNS 名にアクセスした結果
ブラウザで ALB の DNS 名にアクセスした結果

ターゲットのヘルスステータス確認

左側ナビゲーションの「ロードバランシング」→「ターゲットグループ」を選択し、elb-lab-tg を選択します。

「ターゲット」タブを選択し、登録された 2 台のインスタンスのヘルスステータスが「Healthy」であることを確認します。

ターゲットグループのターゲット一覧(2 台とも healthy の状態)
ターゲットグループのターゲット一覧(2 台とも healthy の状態)
クラウドおさる

リロードするたびに応答するインスタンスが替わり、ターゲットは 2 台とも healthy。トラフィックの分散とヘルスチェックの両方を確かめられたでござる。

まとめ

  • Elastic Load Balancing は、トラフィックを複数のターゲットに自動分散するフルマネージドサービスである
  • ALB はレイヤー 7(HTTP/HTTPS)で動作し、Web アプリケーションのロードバランシングに適している
  • ALB は「ロードバランサー」「リスナー」「ターゲットグループ」の 3 つのコンポーネントで構成され、リスナーにはリスナールールが付く
  • ターゲットグループのヘルスチェックにより、正常なターゲットにのみトラフィックが分散される(すべてのターゲットが異常なときはフェイルオープンし、全ターゲットに振り分ける)
  • 複数のアベイラビリティゾーンにまたがる構成により、高可用性を実現できる
  • ALB 用とターゲット用のセキュリティグループを分離し、ALB からのトラフィックのみを許可する構成がベストプラクティスである

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次