+ 作るログイン
1 / 19
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 11:ロードバランサー(ALB) ― 複数台の前に立つ入口

発行
アニメモ公式
版
第2版
改訂
コマ
全19

サーバー1台には「壊れたら止まる」「混んだら遅い」という限界があります。台を増やしたとき、利用者をどの台へ案内するのかという問題から、ロードバランサー(ALB)の役割、パブリックとプライベートへの置き分け、リスナー・ルール・ターゲットグループ・ヘルスチェックの仕組み、パスによる振り分け、SG から SG を許す扉の設計、NLB との違い、料金と片付けまでを、フォトログを2台にしながら説明します。

1台のサーバーには、2つの限界がある

第9・10章で、フォトログはインスタンス1台で動き、データはディスク(EBS)ごと守れるようになりました。でも、まだサーバーが1台という弱点が残っています。

1台であることには、2種類の限界があります。

限界起きること例
故障その1台が止まると、サービス全体が止まるOS の更新で再起動する、物理マシンが壊れる、AZ(第2章)に障害が起きる
混雑その1台の力を超えると、遅くなり、やがて答えなくなるテレビで紹介されて、利用者が10倍になる

混雑には、インスタンスタイプを大きくする(第9章)という手もあります。これを縦に伸ばす(スケールアップ)と言います。でも、大きさには上限があり、変えるときには停止が必要で、何より1台であることは変わりません。故障の問題は残ったままです。

そこで、同じ中身のサーバーを何台か並べて、仕事を分け合うことを考えます。これを横に伸ばす(スケールアウト)と言います。台が複数あれば、1台が壊れても他の台が答えられますし、混んだら台を足せます。

第10章で「サーバーは使い捨て、データは残す」と書きました。横に並べる考え方は、その延長線上にあります。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 1 / 19
  • 1台のサーバーには、2つの限界がある
  • 注意
  • 壊れたら止まる
  • OS の更新・故障・AZ の障害
  • 人々
  • サーバー
  • フォトログ(1台)
  • 第9・10章の形
  • 利用者
  • 全員がここへ
  • 砂時計
  • 混んだら遅い
  • CPU もメモリも足りない
  • 大きなタイプにする(縦に伸ばす)には上限があり、1台であることは変わらない
  • → 同じ台を横に並べて、何台かで分け合いたい(横に伸ばす)
  • ひらめき
  • 壊れたら止まる(故障)と、混んだら遅くなる(混雑)。どちらも「1台しかない」ことが原因。

2台にした。でも、利用者はどちらへ行けばいい?

では、フォトログのサーバーを2台にしてみます。第10章で作った AMI から、もう1台起動すれば、同じ中身の台ができます。

ところが、ここで困ったことが起きます。2台はそれぞれ別のパブリック IP(第9章)を持っています。利用者は、どちらの住所にアクセスすればいいのでしょうか。

やり方困ること
半分の人に Web 1、半分の人に Web 2 の住所を教える誰にどちらを教えたか管理できない。台を足すたびに教え直す
両方の住所を教えて、利用者に選んでもらう壊れている台を選んだ人はつながらない
DNS(第14章)に両方の住所を登録する壊れた台の住所も配られ続ける。反映に時間がかかる

どれも、「どの台が元気か」を利用者の側に判断させているのが問題です。利用者は、サーバーの事情を何も知りません。

必要なのは、利用者からは1つの住所に見えて、その裏で元気な台を選んで渡してくれる係です。この係をロードバランサー(負荷を分散する装置)と呼びます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 2 / 19
  • 2台にした。でも、利用者はどちらへ行けばいい?
  • どっち?
  • NG
  • 台を足すたび、利用者に知らせ直す
  • NG
  • 壊れた台にも人が来てしまう
  • 人々
  • 利用者
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • 203.0.113.10
  • 203.0.113.20
  • ひらめき
  • 台ごとに住所(IP)が違うと、利用者に選ばせることになる。壊れた台を選んだ人はつながらない。

ロードバランサー:1つの入口で、後ろの台に振り分ける

ロードバランサーは、複数のサーバーの前に立つ入口です。利用者はロードバランサーだけにリクエストを送り、ロードバランサーが後ろの台を1つ選んで中継します。

たとえるなら、大きなお店の入口に立つ案内係です。お客さんはお店の住所だけを知っていればよく、中に入ると案内係が空いているレジへ案内してくれます。レジが1つ閉まっていても、案内係はそこへは案内しません。

役割意味
1つの入口台がいくつあっても、利用者から見える住所は1つ
振り分け来たリクエストを、後ろの台に分けて渡す
見回り元気のない台には渡さない(後で見るヘルスチェック)
台の出入り台を足しても外しても、利用者は何も変えなくていい

AWS のロードバランサーのサービスは Elastic Load Balancing(ELB)と呼ばれ、中にいくつかの種類があります。Web サービスでいちばん使うのが ALB(Application Load Balancer)です。「Application」とは、Web の通信(HTTP=ブラウザとサーバーの会話の決まり、その暗号化版の HTTPS)の中身まで読んで振り分けられる、という意味です。

ALB 自体も、AWS が裏で複数の機械で動かしています。ALB が1台の機械で、それが壊れたら終わり、ということはありません。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 3 / 19
  • ロードバランサー:1つの入口で、後ろの台に振り分ける
  • ネットワーク
  • ALB
  • 受付係:いちばん前に立つ
  • 人々
  • 利用者
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • AZ 1a
  • AZ 1c
  • たとえるなら、大きな店の入口に立つ案内係。お客さんは店の住所だけを知っていて、空いたレジへ案内される
  • ALB(Application Load Balancer)= Web の通信(HTTP・HTTPS)の中身まで見て振り分ける種類
  • ひらめき
  • 利用者は ALB だけを知っていればいい。ALB が元気な台を選んで、リクエストを渡してくれる。

置き場所:ALB はパブリック、サーバーはプライベート

ALB を置くと、ネットワークの設計(第5〜8章)が一段きれいになります。

部品置き場所理由
ALB2つ以上の AZ のパブリックサブネットインターネットから届く必要がある。ALB は最低2つの AZ を選ぶ決まり
サーバー各 AZ のプライベートサブネット外から直接届く必要がない。ALB からだけ届けばいい

図では、上の段のパブリックサブネットに ALB が1つ、AZ 1a と 1c にまたがって置かれています。下の段のプライベートサブネットには、AZ ごとに1台ずつサーバーがあります。

この形には、よいことがたくさんあります。

よいこと理由
攻撃される面が減るインターネットに顔を出すのは ALB だけ
パブリック IPv4 の料金が減るサーバーに公開の番号が要らない(第9章)
AZ の障害に強い1a が止まっても、1c の台と ALB で動き続ける

これが、第2章で「なぜ複数の AZ を使うのか」と問いかけたことの、具体的な答えです。

なお、プライベートのサーバーが OS の更新をダウンロードするには、第7章の NAT ゲートウェイか VPC エンドポイントが要ります。中に入るのは、第9章の Session Manager です。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 4 / 19
  • 置き場所:ALB はパブリック、サーバーはプライベート
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 利用者
  • プライベート(1a・1c)
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • AZ 1a
  • AZ 1c
  • AZ 1a
  • AZ 1c
  • 外に顔を出すのは ALB だけ。サーバーにはパブリック IP も要らない(第9章の IPv4 の料金も減る)
  • AZ 1a が止まっても、1c の台と ALB で動き続ける(第2章の「なぜ複数 AZ か」の答え)
  • ひらめき
  • ALB は2つ以上の AZ のパブリックサブネットに置く。サーバーは外から直接届かないプライベートへ。

リクエストの流れ ①:ALB が1台目に渡す

利用者が「写真の一覧を見せて」とリクエストを送ったときの流れを、図の赤い小包で追います。

順番起きること
1利用者のブラウザが、ALB の名前(photolog-alb-123.ap-northeast-1.elb.amazonaws.com のような DNS 名)にリクエストを送る
2ALB が受け取り、後ろの元気な台の中から1つを選ぶ
3ALB が、選んだ台(Web 1)へリクエストを中継する
4Web 1 が答えを作って ALB に返し、ALB が利用者に返す

ALB は、既定ではラウンドロビン(順番に回す)で台を選びます。1件目は Web 1、2件目は Web 2、3件目は Web 1…という具合です。処理中の件数が少ない台を選ぶ方式に切り替えることもできます。

ここで大事な点が1つあります。サーバーから見ると、リクエストは ALB から届いたように見えることです。利用者と直接話しているわけではありません。だから、サーバーの扉(SG)は「ALB から」を許せばよく、利用者の住所を許す必要はありません(この後で見ます)。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 5 / 19
  • リクエストの流れ ①:ALB が1台目に渡す
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 写真の一覧
  • 利用者
  • プライベート(1a・1c)
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • AZ 1a
  • AZ 1c
  • AZ 1a
  • AZ 1c
  • ALB は受け取ったリクエストを、既定では順番に(ラウンドロビン)後ろの台へ回す
  • 台から見ると、リクエストは ALB から来たように見える
  • ひらめき
  • 利用者は ALB の名前にリクエストを送る。ALB は後ろの台を1つ選んで、そこへ中継する。

リクエストの流れ ②:次のリクエストは2台目へ

次のリクエストが来ると、ALB は今度は Web 2 を選びます。図の小包が、右の台へ移りました。

台が2台なら、1台あたりの仕事はおよそ半分。4台なら4分の1です。混んできたら台を足せば、1台あたりの負担が下がります。台を足しても、利用者が使う住所(ALB の名前)は変わりません。

ここで、次のことに気づくでしょうか。

利用者の操作答えた台
写真を投稿するWeb 1
一覧を見るWeb 2
いいねを押すWeb 1

1人の利用者の続けての操作でも、毎回違う台が答えるかもしれないのです。利用者はそれを知りませんし、知る必要もありません。

逆に言えば、サービスを作る側は、どの台が答えても同じ結果になるようにしておかなければなりません。Web 1 に投稿した写真は、Web 2 からも見えなければいけませんし、Web 1 でログインした状態は、Web 2 でも続いていなければいけません。

これが、この後のフォトログで出てくる困りごとの正体です。第12章で「ステートレス」という考え方として整理します。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 6 / 19
  • リクエストの流れ ②:次のリクエストは2台目へ
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 写真の一覧
  • 利用者
  • プライベート(1a・1c)
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • AZ 1a
  • AZ 1c
  • AZ 1a
  • AZ 1c
  • 利用者はどの台が答えたかを知らないし、知る必要もない
  • だから「どの台が答えても同じ結果になる」ように作る必要がある(第12章のステートレス)
  • ひらめき
  • 次に来たリクエストは別の台へ。台が増えるほど、1台あたりの負担が減る。

ALB を作る4つの部品

ALB は、図の番号の4つの部品を組み合わせて作ります。

番号部品役割たとえ
1リスナーどのポート(第8章)・どの方式で受け付けるか店のどの扉を開けるか
2ルール受けたリクエストを、どのグループへ回すかの条件「修理のお客様は2階へ」の案内板
3ターゲットグループ送り先の台をまとめた組2階の窓口の担当者たち
4ヘルスチェックグループの中の台が元気かどうかの見回り担当者が席にいるかの確認

ターゲットグループに入れる送り先(ターゲット)には、EC2 のインスタンスのほか、IP アドレスや、第22章の Lambda 関数も指定できます。

大事なのは、リスナーとターゲットのポートは別でよいことです。利用者は80番(HTTP の標準)に来ますが、ALB はそれを台の8080番(アプリが待っているポート)へ渡せます。利用者からは、アプリがどのポートで動いているかは見えません。

また、ヘルスチェックはターゲットグループの設定の一部です。グループごとに「どの URL で元気さを確かめるか」を決めます。次に、その仕組みを見ます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 7 / 19
  • ALB を作る4つの部品
  • 送信
  • リスナー
  • 設定
  • ルール
  • 人々
  • ターゲットグループ
  • OK
  • ヘルスチェック
  • どのポートで待つか
  • どこへ回すかの条件
  • 送り先の台の組
  • 元気かの見回り
  • 部品
  • フォトログでの例
  • リスナー
  • HTTP の80番で受ける(第14章で HTTPS の443番に)
  • ルール
  • パスが /api/* なら API 用へ、それ以外は Web 用へ
  • ターゲット
  • Web 1・Web 2 の2台。アプリは8080番で待つ
  • ひらめき
  • リスナーが受け、ルールで行き先を決め、ターゲットグループの中の元気な台へ渡す。

ヘルスチェック:元気な台だけに渡す

ALB は、ターゲットグループの各台に、定期的に「元気?」とリクエストを送っています。これがヘルスチェックです。

設定既定値(HTTP の場合)意味
パス/どの URL に聞くか
間隔30秒何秒ごとに聞くか
タイムアウト6秒何秒待って返事がなければ失敗とするか
不健康のしきい値2回何回続けて失敗したら「不健康」とするか
健康のしきい値5回何回続けて成功したら「健康」に戻すか
成功とみなす返事200返事の番号(HTTP ステータスコード。200 は「OK」)

図では、Web 2 が続けて返事をしなかったので「不健康」と判定され、ALB は Web 2 へリクエストを渡すのをやめました。赤い小包は Web 1 にだけ届いています。利用者から見ると、何事もなかったかのように使い続けられます。

不健康になった台は、捨てられるわけではありません。見回りは続いていて、直って5回続けて返事がよければ、自動で振り分けに戻ります。

逆に言うと、ALB は壊れた台を直したり、新しい台を足したりはしてくれません。1台が壊れたままだと、残りの台だけで全員を受け持つことになります。壊れた台を自動で入れ替えるのは、次の第12章の Auto Scaling の役目です。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 8 / 19
  • ヘルスチェック:元気な台だけに渡す
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 利用者
  • プライベート(1a・1c)
  • 写真の一覧
  • サーバー
  • Web 1
  • OK
  • サーバー
  • Web 2
  • NG
  • AZ 1a
  • 不健康:外した
  • AZ 1a
  • AZ 1c
  • 既定:30秒ごとに GET / を送る。2回続けて失敗で「不健康」、5回続けて成功で「健康」に戻る
  • 不健康な台は捨てられるわけではない。直ったら自動で振り分けに戻る(捨てて入れ替えるのは第12章)
  • ひらめき
  • ALB は定期的に各台へ「元気?」と聞く。何回か続けて返事が悪い台には、リクエストを渡さなくなる。

ヘルスチェックは「何を確かめるか」を決める

既定のヘルスチェックはトップページ(/)に聞きますが、実際には確認用の URLを用意するのがおすすめです。たとえば /health に来たら、「アプリは動いています」と短く返すだけの入口を作ります。

難しいのは、どこまで確かめるかです。

確かめ方よい点困る点
軽すぎる(常に OK を返すだけ)見回りが軽いアプリの中が壊れていても「元気」と答えてしまう
重すぎる(トップページを丸ごと作る)本物に近い見回りだけで台が疲れる。遅いと失敗扱いになる
DB まで確かめるDB の不調に気づけるDB が一瞬止まっただけで全台が不健康になる

最後の行は特に大事です。DB は全台で共有しているので、DB の不調を各台のヘルスチェックに入れると、全台が同時に外れてしまいます。台を入れ替えても DB は直らないので、意味がありません。

そこで、「この台自身が、リクエストに答えられる状態か」だけを見るのがよい落としどころです。DB などの共有部品の不調は、監視(第17章)で別に知らせます。

ちなみに、全部の台が不健康になった場合、ALB は「全台に配る」動きをします(フェイルオープン)。全部止めてしまうより、動くかもしれない台に渡したほうがまし、という考え方です。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 9 / 19
  • ヘルスチェックは「何を確かめるか」を決める
  • GET /health
  • 確かめ方
  • 起きること
  • 200 OK
  • 軽すぎる
  • アプリが壊れても「元気」
  • { "status": "ok" }
  • 重すぎる
  • 見回りだけで台が疲れる
  • DB まで見る
  • DB が止まると全台が外れる
  • おすすめ:アプリ自身が動いていて、リクエストに答えられるかだけを見る(DB の不調は監視で知る。第17章)
  • 全台が不健康になると、ALB は「全台に配る」(フェイルオープン)。止めるよりはまし、という考え方
  • ひらめき
  • トップページではなく、軽い確認用の URL(/health など)を用意する。重くしすぎず、嘘もつかせない。

パスで振り分ける:1つの入口に、何種類ものサーバー

ALB は HTTP の中身を読めるので、URL を見て行き先を変えることができます。これがルールです。

ルールの条件例行き先
パス/api/*API 用のターゲットグループ
パス/admin/*管理画面用のターゲットグループ
どれにも当たらないそれ以外Web 用のターゲットグループ(既定の行き先)

ルールには優先順位があり、上から順に確かめて、最初に当たったものが使われます。どれにも当たらなければ、リスナーの既定の行き先に回ります。

条件には、パスのほかにホスト名(api.photolog.example と www.photolog.example で分ける)、ヘッダー、クエリ文字列(URL の ? の後ろ)なども使えます。条件に当たったら、振り分ける代わりに「別の URL へ転送する」「決まった返事を返す」こともできます。

これのうれしい点は、1つの ALB で複数のサービスを受けられることです。API のサーバーだけ台数を増やす、管理画面は社内の人だけに絞る、といったことが、入口を分けずにできます。ALB は1つごとに時間の料金がかかるので、まとめられるならまとめたほうが安くなります。

フォトログも、画面を返す部分と、スマートフォンのアプリから呼ばれる API を、後でこの方法で分けることになります。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 10 / 19
  • パスで振り分ける:1つの入口に、何種類ものサーバー
  • /api/*
  • 人々
  • API 用のグループ
  • 人々
  • ネットワーク
  • ALB
  • /admin/*
  • 人々
  • 管理画面用のグループ
  • 利用者
  • ルールを上から順に
  • それ以外
  • 人々
  • Web 用のグループ
  • ホスト名(api.example.com)・ヘッダー・クエリでも振り分けられる
  • ひらめき
  • ALB は URL の中身を見られる。パスやホスト名で、別々のターゲットグループへ振り分けられる。

扉の設計:サーバーは「ALB からだけ」受け付ける

ALB を置いたら、第8章のセキュリティグループ(SG)を次の形にします。

SG付ける先入ってくる通信の許可
ALB 用の SGALB80番と443番を 0.0.0.0/0(誰でも)から
サーバー用の SGWeb 1・Web 28080番を「ALB 用の SG」から

ポイントは2行目です。サーバーの扉は、IP アドレスではなく、ALB の SG を指して許しています。第8章で見た「SG から SG を許す」形です。

こう書く理由説明
ALB の IP は変わるALB は裏で機械が増えたり入れ替わったりし、IP が変わる。SG を指せば追いかけなくていい
他からは入れない同じ VPC の中の別のサーバーからでも、ALB を通らない通信は断る
ALB を迂回できないもしサーバーにパブリック IP が付いていても、直接アクセスは断られる

こうしておくと、利用者は必ず ALB を通ることになります。後で ALB に HTTPS(第14章)や WAF(第27章、攻撃を止める盾)を付けたとき、それを迂回される心配がありません。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 11 / 19
  • 扉の設計:サーバーは「ALB からだけ」受け付ける
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 盾
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 利用者
  • プライベート(1a・1c)
  • サーバー
  • Web 1
  • 盾
  • サーバー
  • Web 2
  • 盾
  • AZ 1a
  • AZ 1c
  • AZ 1a
  • AZ 1c
  • ALB の SG:80・443番を 0.0.0.0/0(誰でも)から許す
  • サーバーの SG:8080番を「ALB の SG」から許す。IP ではなく SG を指すので、ALB の IP が変わっても大丈夫
  • ひらめき
  • ALB の SG は世界に開き、サーバーの SG は「ALB の SG から」だけ許す(第8章)。

台を外すときは、話し中の人を待ってから

サーバーを更新するときなど、台をターゲットグループから外したい場面があります。このとき、いきなり外すと、その台で処理中のリクエストが途中で切れてしまいます。写真のアップロード中なら、失敗になります。

そこで ALB は、台の登録を解除すると、次のように動きます。

段階ALB の動き
登録解除の直後その台には、新しいリクエストを送らない
待ち時間の間すでに送ったリクエストは、最後まで続けさせる
待ち時間が過ぎた残っている通信を閉じて、完全に外す

この待ち時間を登録解除の遅延(接続のドレイニングとも言います)と呼び、既定は300秒です。すぐ終わる処理しかないサービスなら、短くすると入れ替えが速くなります。

もう1つ、ALB の後ろのサーバーで知っておきたいことがあります。サーバーから見ると、リクエストの送り元は ALB です。本当の利用者の IP アドレスを知りたいとき(アクセスの記録や、不正な利用の調査など)は、ALB が付けてくれる `X-Forwarded-For` というヘッダー(リクエストに付いてくる追加の情報)を見ます。ログの設定で、これを記録するようにしておきます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 12 / 19
  • 台を外すときは、話し中の人を待ってから
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB
  • 2つの AZ にまたがる1つの入口
  • 人々
  • 新規は来ない・今の分は続ける
  • 利用者
  • プライベート(1a・1c)
  • 新しいリクエスト
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • AZ 1a
  • 登録解除中
  • AZ 1a
  • AZ 1c
  • この待ち時間を「登録解除の遅延」と呼ぶ。更新のために台を外すときに、利用者の通信を途中で切らない
  • 台から見た送り元は ALB。本当の利用者の IP は X-Forwarded-For というヘッダーに入っている
  • ひらめき
  • 登録解除すると、新しいリクエストは送らず、処理中のものが終わるまで待つ(既定300秒)。

ALB と NLB:何を見て振り分けるかの違い

ELB には、ALB のほかに NLB(Network Load Balancer)があります。違いは、何を見て振り分けるかです。

ALBNLB
見るものHTTP・HTTPS の中身(URL・ヘッダー)TCP・UDP の接続だけ(中身は見ない)
振り分けの手がかりパス・ホスト名・ヘッダー宛先のポート
IP アドレス変わる。DNS 名で使うAZ ごとに固定できる(Elastic IP も付けられる)
得意なことWeb サービス・APIとても多くの接続、ゲーム、HTTP 以外の独自の通信

TCP と UDP は、インターネットでデータを運ぶ基本の決まりです。HTTP は TCP の上に乗っている「会話の中身の決まり」なので、NLB は中身の会話を読まずに、接続をそのまま後ろへつなぎます。そのぶん速く、たくさんの接続をさばけます。

NLB を選ぶ主な理由は、固定の IP が必要なとき(取引先に「この IP からの通信だけ許可して」と言われた、など)や、HTTP ではない通信を扱うときです。

さらに、通信の中身を検査する専用の機械(ファイアウォールの製品など)の前に置く Gateway Load Balancer もありますが、ふつうの Web サービスでは使いません。

フォトログは Web のサービスなので、ALB を使います。迷ったら ALB、と覚えておけば、まず間違いありません。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 13 / 19
  • ALB と NLB:何を見て振り分けるかの違い
  • ALB(アプリケーション)
  • NLB(ネットワーク)
  • 見るもの
  • HTTP・HTTPS の中身
  • TCP・UDP の接続だけ
  • 振り分けの手がかり
  • パス・ホスト名・ヘッダー
  • 宛先のポート
  • IP アドレス
  • 変わる(名前で使う)
  • AZ ごとに固定できる
  • 得意なこと
  • Web サービス・API
  • 大量の接続・ゲーム・独自の通信
  • フォトログでは
  • これを使う
  • 使わない
  • ほかに、通信を検査する機械の前に置く Gateway Load Balancer もある(ふつうの Web では使わない)
  • ひらめき
  • Web の中身(パス・ホスト名)で振り分けるなら ALB。速さ・固定 IP・HTTP 以外の通信なら NLB。

作り方:ターゲットグループ → ALB → リスナー

コンソールでは、EC2 の画面の左の「ロードバランシング」から作ります。図の番号の順に進めます。

番号やることフォトログでの設定
1ターゲットグループを作る種類:インスタンス、HTTP・8080番、ヘルスチェックのパス /health
2台を登録するWeb 1(AZ 1a)と Web 2(AZ 1c)
3SG を2つ作るALB 用(80・443 を誰でも)、サーバー用(8080 を ALB の SG から)
4ALB を作るインターネット向け、VPC と2つの AZ のパブリックサブネット、ALB 用の SG
5リスナーを作るHTTP:80 → 1 のターゲットグループへ
6DNS 名を開いて確かめるターゲットが「healthy」になってから

CLI で主要な部分を書くと、次のようになります。

bash
aws elbv2 create-target-group --name photolog-web \
  --protocol HTTP --port 8080 --vpc-id vpc-0aaa \
  --health-check-path /health
aws elbv2 create-load-balancer --name photolog-alb \
  --subnets subnet-pub-1a subnet-pub-1c --security-groups sg-alb
aws elbv2 create-listener --load-balancer-arn <ALB の ARN> \
  --protocol HTTP --port 80 \
  --default-actions Type=forward,TargetGroupArn=<グループの ARN>

ARN は、AWS の中のものを指す長い名前(Amazon Resource Name)です。作ったときの結果に出てきます。

ALB の IP アドレスは変わることがあるので、アクセスするときは必ず DNS 名を使います。第14章で、自分のドメイン(photolog.example.com)をこの ALB に向けます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 14 / 19
  • 作り方:ターゲットグループ → ALB → リスナー
  • ターゲットグループ
  • 台を登録
  • SG を2つ
  • HTTP・8080・/health
  • Web 1・Web 2
  • ALB 用とサーバー用
  • ALB を作る
  • リスナー
  • DNS 名で確認
  • インターネット向け・2 AZ
  • HTTP:80 → グループへ
  • xxx.elb.amazonaws.com
  • ALB の IP は変わるので、IP ではなく DNS 名で使う(第14章で自分のドメインを向ける)
  • ひらめき
  • 送り先の組を先に作ってから、入口(ALB)を作ってつなぐ。最後に ALB の DNS 名を開いて確かめる。

フォトログ v1:入口1つ・AZ ごとに1台

ここまでの内容で、フォトログは次の形になりました。

部品設定
ALB2つの AZ のパブリックサブネット。HTTP:80 で受ける
Web 1・Web 2AZ 1a と 1c のプライベートサブネット。第10章の AMI から起動
SGサーバーは ALB の SG からだけ受ける
ヘルスチェック/health

1台が止まっても、もう1台が答えます。AZ 1a 全体が止まっても、1c で動き続けます。

ところが、2台にした途端、利用者から2つの苦情が届きました。

苦情原因
「投稿した写真が、見えたり見えなかったりする」写真は Web 1 のディスク(第10章の EBS)に保存された。Web 2 に振り分けられた人からは見えない
「ログインしたのに、すぐログアウトされる」ログインの状態(セッション)を Web 1 のメモリに覚えていた。次のリクエストが Web 2 へ行くと「知らない人」扱い

どちらも、台の中に、その台だけが知っている情報を置いていることが原因です。前に見た「どの台が答えても同じ結果になる」が守られていません。

ALB には、同じ利用者を同じ台へ送り続けるスティッキーセッションという機能もあります。でもこれは一時しのぎです。その台が壊れたら、やはり写真もログインも消えます。本当の解決は、次の第12章で見る「台の中に大事なものを置かない」ことです。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 15 / 19
  • フォトログ v1:入口1つ・AZ ごとに1台
  • VPC
  • パブリックサブネット(1a・1c)
  • ネットワーク
  • ALB(フォトログの入口)
  • HTTP:80 → Web のグループ
  • 人々
  • 利用者
  • プライベート(1a・1c)
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • 写真は自分のディスク
  • 写真は自分のディスク
  • AZ 1a
  • AZ 1c
  • 困りごと:Web 1 に上げた写真が、Web 2 に回された人からは見えない
  • 困りごと:Web 1 でログインしたのに、次のリクエストが Web 2 へ行くとログアウト扱い
  • ひらめき
  • ALB の後ろに2台。片方の AZ が止まっても動く。ただし写真とログイン状態の置き場所に新しい問題が出る。

お金:動いている時間と、処理した量

ALB の料金は、主に次のものにかかります。

対象単位注意
動いている時間1時間ごと(途中でも1時間)リクエストがゼロでもかかる
LCU1時間あたりに使った LCU の数処理の量が多いほど増える
パブリック IPv41個×1時間インターネット向けの ALB は、AZ ごとに公開の番号を使う(第9章)
外への通信ALB から利用者へ出たデータ量第4章のデータ転送料

LCU(Load Balancer Capacity Unit)は、ALB がどれだけ働いたかを測る単位です。「新しい接続の数」「同時につながっている数」「運んだデータの量」「ルールを確かめた回数」の4つを測り、そのうち最も多く使ったもので数えます。小さなサービスなら、LCU の料金はわずかです。

気をつけたいのは、作っただけで時間の料金がかかることです。練習で作った ALB を放っておくと、利用者が1人もいなくても毎月かかります。

安くするコツは、前に見たようにルールで1つの ALB にまとめることです。サービスごとに ALB を作ると、そのたびに時間の料金とパブリック IPv4 の料金が増えます。

具体的な単価は、公式の「Elastic Load Balancing の料金」ページで確認してください。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 16 / 19
  • お金:動いている時間と、処理した量
  • 時計
  • 動いている時間
  • 棒グラフ
  • LCU
  • インターネット
  • パブリック IPv4
  • 1時間ごと(使っていなくても)
  • 接続・通信量・ルールの多い方
  • インターネット向けは AZ ごと
  • LCU とは
  • 新しい接続・同時の接続・通信量・ルールの評価数のうち、最も多いもので数える
  • 作っただけで
  • リクエストがゼロでも、時間の分はかかる
  • 安くするには
  • 1つの ALB に複数のサービスをルールでまとめる
  • ひらめき
  • ALB は「動いている時間」と「LCU(処理量の単位)」に課金される。単価は料金ページで確認する。

よくある落とし穴

ALB を置いたのに「つながらない」とき、原因の多くは次のどれかです。

症状よくある原因直し方
全台が「不健康」ヘルスチェックのパスが存在しない(404)、ポートが違うターゲットグループの設定と、アプリの /health を確かめる
502・504 が返るサーバーの SG が ALB からの通信を許していない、アプリが落ちているサーバー用 SG の許可元が「ALB の SG」になっているか
ALB を開くとタイムアウトALB 用 SG で80番を開けていない、ALB をプライベートサブネットに置いたALB のサブネットのルートに IGW があるか(第6章)
片方の AZ の障害で全部止まったサーバーを1つの AZ にしか置いていなかったAZ ごとに台を置く
ある日つながらなくなったALB の IP を直接どこかに書いていたDNS 名(第14章ではエイリアス)で使う
重い処理が途中で切れる既定のアイドルタイムアウト(60秒)を超えた長い処理は後回しの仕組みへ(第24章)

502 は「後ろの台からおかしな返事が来た(または返事がなかった)」、504 は「後ろの台が時間内に答えなかった」という意味の番号です。どちらも、ALB 自体ではなく後ろの台との間に問題があるという合図です。

ALB の画面の「ターゲット」タブには、各台が不健康な理由(タイムアウト、返事の番号の違いなど)が表示されるので、まずそこを見ます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 17 / 19
  • よくある落とし穴
  • NG
  • ヘルスチェックの URL が 404 → 全台「不健康」。原因がアプリではなく設定にある
  • NG
  • サーバーの SG で ALB からの8080番を許していない → ALB は 502/504 を返す
  • NG
  • サーバーを1つの AZ にしか置いていない → その AZ が止まると全部止まる
  • NG
  • ALB の IP を直接書き込む → ある日変わってつながらなくなる。DNS 名で使う
  • NG
  • 60秒以上かかる処理をそのまま返す → 既定のアイドルタイムアウトで切れる(第24章)
  • ひらめき
  • ヘルスチェックの失敗・扉の閉め忘れ・1つの AZ だけ。ALB は「つながらない」原因の宝庫。

片付け:入口から順に消す

ALB まわりは、部品どうしが参照し合っているので、消す順番があります。

番号やること理由
1ALB を削除する時間の料金とパブリック IPv4 の料金が止まる。リスナーも一緒に消える
2ターゲットグループを削除するALB から使われている間は消せない
3サーバーを終了する要らなければ。第9・10章の片付けも合わせて
4SG を削除するサーバー用の SG が ALB 用の SG を参照しているので、サーバー用 → ALB 用の順
bash
aws elbv2 delete-load-balancer --load-balancer-arn <ALB の ARN>
aws elbv2 delete-target-group --target-group-arn <グループの ARN>

ALB の削除には、削除保護という設定もあります。本番の ALB には付けておくと、うっかり消すのを防げます。付いている場合は、先に外してから削除します。

片付けたら、翌日に Billing の画面で、Elastic Load Balancing の料金が増えていないことを確かめます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 18 / 19
  • 片付け:入口から順に消す
  • ネットワーク
  • ALB を削除
  • 人々
  • ターゲットグループ
  • サーバー
  • サーバー
  • 盾
  • SG を整理
  • 時間の課金が止まる
  • ALB の後に削除
  • 要らなければ終了
  • 参照の順に削除
  • aws elbv2 delete-load-balancer --load-balancer-arn arn:aws:elasticloadbalancing:...
  • aws elbv2 delete-target-group --target-group-arn arn:aws:elasticloadbalancing:...
  • ひらめき
  • ALB → ターゲットグループ → サーバー → SG の順。参照されているものは先に消せない。

まとめ:入口はできた。次は「台数を自動で」

この章で見たことをまとめます。

項目内容
1台の限界壊れたら止まり、混んだら遅い。台を横に並べて分け合う
ALB1つの入口。元気な台を選んで振り分ける。利用者は ALB の名前だけ知ればいい
置き場所ALB は2つ以上の AZ のパブリックサブネット、サーバーはプライベートサブネット
部品リスナー → ルール → ターゲットグループ → 台。ヘルスチェックで元気な台だけに
ヘルスチェック確認用の URL を用意し、その台自身が答えられるかだけを見る
扉サーバーは「ALB の SG から」だけ受ける
NLB中身を見ない速い入口。固定 IP や HTTP 以外の通信に。Web なら ALB

入口ができて、台を並べられるようになりました。

でも、まだ手作業がたくさん残っています。台は人が AMI から起動して、ターゲットグループに登録しています。1台が壊れると、ALB はその台を外してくれますが、新しい台を足してはくれません。夜中に急に利用者が増えても、誰かが起きて台を足さない限り、今ある台だけで耐えることになります。

しかも、前に見たとおり、台の中に写真やログイン状態を置いていると、台を足したり入れ替えたりするたびに、利用者が困ります。

次の第12章では、壊れた台を自動で入れ替え、混んだら自動で増やす Auto Scaling を置き、そのために「台の中に大事なものを置かない」ステートレスという考え方を身につけます。

  • AWS でサービスを作る 11 ― ロードバランサー(ALB)
  • 19 / 19
  • まとめ:入口はできた。次は「台数を自動で」
  • 1台の限界
  • 壊れたら止まり、混んだら遅い。横に並べて分け合う
  • ALB
  • 1つの入口。元気な台を選んで振り分ける
  • 置き場所
  • ALB は2つ以上の AZ のパブリック、サーバーはプライベート
  • 部品
  • リスナー → ルール → ターゲットグループ → 台
  • ヘルスチェック
  • 元気な台だけに渡す。確認用の URL を用意する
  • 扉
  • サーバーは「ALB の SG から」だけ許す
  • NLB
  • 中身を見ない速い入口。Web なら ALB
  • 更新
  • 困りごと:台は手で足している。壊れた台は外れるだけで、夜中の急な混雑にも人が対応するのか?
  • ひらめき
  • 次の第12章では、壊れた台を自動で入れ替え、混んだら自動で増やす Auto Scaling を置く。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]