4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWSAdvent Calendar 2022

Day 24

ALBからNLBに乗り換える

Last updated at Posted at 2022-12-24

エアクロゼットのエンジニアのアインです。最近、私たちがアプリケーションロードバランサーからネットワークロードバランサーに切り替えしたばかりなので本ブログでその経験についてシェアさせていただきます。

ALBとNLBの概要

ALBとは

ALB(Application Load Balancer - アプリケーションロードバランサー)は第7層(OSIモデルのアプリケーション層)で動作するロードバランサーです。

Screen Shot 2022-12-18 at 19.00.42.png

ALBは、HTTPおよびHTTPSプロトコルを使用したアプリケーションの負荷分散をサポートします。
ALBがサポートする主な機能は:

  • Layer-7 Load balancing: EC2、マイクロサービスなどのターゲットへのHTTPおよびHTTPSリクエストを分散できます。
  • HTTPSをサポートします。
  • 転送: あるURLから別のURLへの転送ができます。

注意点としてはALB作る時に必ずALBに対応するSecurity Groupがを設定しないといけません。

NLBとは

NLB(Network Load Balancer - ネットワークロードバランサー)は第4層(OSIモデルのトランスポート層)で動作するロードバランサーです。

Screen Shot 2022-12-18 at 18.59.38.png

NLBがTCP, UDP, TCP_UDP, TLSをサポートしています。NLBがトラフィックの多いアプリを対応できるように設計されています。また非常に低いレイテンシで一秒あたり数百万リクエストが対策できます。

NLBがサポートする主な機能は:

  • Layer-4 Load balancing: EC2、マイクロサービスなどのターゲットへのTCP及びUDPリクエストが分散できます。
  • 低いレイテンシ。
  • クライアントセッションターミネーションをサポートするし、ロードバランサーへのTLS終了タスクのオフロードができます。

NLBを作る時にSecurity Group設定が不要となります

ALBとNLBの違う点

ALB第7層に動作するからcontextまたcookieデータを結構気にするんですがNLB第4層に動作するから特にネットワーク周りの情報のみ気にしています。

他は:

  • NLBがトランスポート層で動くから単なるリクエストをターゲットにフォワードするだけですけどALBがルーティングのためリクエストのヘッダの内容を見ています。
  • NLBがトランスポート層で動作するのきっかけでアプリケーションの可用性をあまり担保できなくて、普通にはNLBがサーバーがICMP pingに応答できるかどうか、またはサーバーがTCPハンドシェイクを保証できるかどうかによって、この可用性を定義します。ALBが成功なHTTP GETリクエストを通じてアプリケーションの可用性が全然担保できます。
  • 例として2つアプリケーションAとBが同じIPアドレスを使用すればNLBが2つのアプリが全く分別できないからNLBがオフラインアプリあるいはクラッシュ中アプリにリクエスト送る可能性があります。

現状のシステム

現状のエアクロゼットのアプリ、Webのインフラはこんな感じです。

Screen Shot 2022-12-18 at 21.45.32.png

システムの説明

エアクロはWebユーザとモバイルアプリのユーザ両方とも対応しているので2つホストがあり:

2つホストが1つのみALBを向いています。ALBには次通りにルーティングしています:

  • HTTPでアクセスする場合HTTPSに転送します。
  • ホストapi.air-closet.comだったらAPI EC2インスタンスと紐づくapi-target-groupにルーティングします。
  • ホストwww.air-closet.comの場合はURIをチェックして /api形式ならAPI EC2インスタンスと紐づくapi-target-groupにルーティングします。
  • 残りとデフォルトはWeb EC2インスタンスと紐づくweb-target-groupにルーティングします。

具体的にはこれです。

Screen Shot 2022-12-18 at 22.01.57.png

出会った問題

モバイルアプリとWebの両方で訪問者数が増加するピーク時に、次の2つのことをやらないといけないです。

  • ALBのアクセスキャパシティを増えるためAWSにELB暖機申請が必要でやらなければアプリとWebがめっちゃくちゃ遅くなるはずです。
  • API EC2インスタンスを増強します。

基本的にはAPI EC2インスタンス増強のことが全然避けられないですがELB暖機申請がさようならできると思ってます。そのためにALBからNLBに切り替えようと考えております。理由としてはNLBの概要通り

NLBがトラフィックの多いアプリを対応できるように設計されています。また非常に低いレイテンシで一秒あたり数百万リクエストが対策できます。

ということなんです。

切り替え後のシステム

切り替えした後のシステムはこんな感じとなっております。

Screen Shot 2022-12-18 at 22.09.23.png

とても複雑に見えますよね? 順を追って説明しますのでご安心ください。

切り替え後の問題

インフラを変えると問題が発生する可能性が結構高いですよね。下記は我々が出会った問題です。

  • どうやってWebからAPIに呼び出せる??? 元々WebからAPIにルーティングするはALBのボールですけどNLBがリクエストもらう際にすぐターゲットにフォワードするからルーティングを全然やらないです。
  • どうやってHTTPからHTTPSに転送できる???ALBには転送ルールが設定できるんですがNLBにとっては全然無理です。

問題を解決する

実際にはWeb EC2インスタンスの中にnginxを設定しており、目的はnginxがReverse ProxyとしてWebに守ってあげます。
ですのでルーティングを全部nginxに移動しようと思ってます。

どうやってWebからAPIに呼び出せる???問題に対してはこんな感じでnginxを設定する

server {
  listen 80 default_server;

  location /api* {
    proxy_pass https://api.air-closet.com;
  }
}

そうすればAPIルーティングはこんな感じになっています。

Screen Shot 2022-12-18 at 22.24.00.png

WebからのAPI呼び出しのURLはhttps://www.air-closet.com/api/*という形式になり、これらの呼び出しはNLBによって処理されず、EC2インスタンスに直接送信されて、ここで、nginxはURIが/api*に類似していることを認識しているため、nginxはこの呼び出しをAPIホストhttps://api.air-closet.comにフォワードします。

ではAPIルーティングはこれで対応済みです。これからHTTPからHTTPSに転送するのを見てみます。

Web用のNLBに2つリスナーを設定します。

  • TCP:80 - HTTPプロトコル専用。
  • TLS:443 - HTTPSプロトコル専用。

Screen Shot 2022-12-20 at 12.57.53.png

Screen Shot 2022-12-18 at 17.33.48.png

これらの各リスナーに対応するのは、次のターゲットグループです。

  • TCP:81 - http-web-target-group: 81ポートにリッスンする
  • TCP:80 - https-web-target-group: 80ポートにリッスンする。

Screen Shot 2022-12-18 at 17.30.46.png
Screen Shot 2022-12-18 at 17.30.22.png

まとめするとこんな感じになっております。

Screen Shot 2022-12-19 at 22.23.27.png

NLBがトランスポート層に動作するからNLBと繋がってるターゲットグループのプロトコルは必ずTCPです。

上に書いている通り

実際にはWeb EC2インスタンスの中にnginxを設定しており、目的はnginxがReverse ProxyとしてWebに守ってあげます。

デフォルトにnginxが80ポートにリッスンするんですが今回で言うと80ポートだけではなくて81ポートにもハンドリング必要なんでnginx81ポートにリッスンする設定を追加しようと思っております。こんな感じですね。

server {
  listen 81 default_server;

  return 301 https://web.com$request_uri;
}

説明するとリクエストが81ポートに来るならいつもHTTPSに転送されています。
だから今のNLB、ターゲットグループとWeb EC2インスタンスはこんな感じになります。

Screen Shot 2022-12-19 at 22.32.19.png

簡単に説明するとユーザーがhttp://www.air-closet.comにアクセスすると、リクエストはNLBによってhttp-web-target-groupに転送されて、このターゲットグループはまたリクエストをWeb EC2インスタンスにフォワードします。インスタンスの81ポートにリッスンしているnginxがリクエストを受け取りhttps://www.air-closet.comにリダイレクトします。

ルーティングとリダイレクトは一旦大丈夫ですけどSecurity Groupはどうなるかなって思っております。今回はNLBを使ってるから全てのリクエストがEC2インスタンスに転送されるのでインスタンスが全てのIPアドレスからHTTPのリクエストをもらえるように設定が要ると考えていますので一応下の感じで設定しています。

Screen Shot 2022-12-18 at 17.27.33.png

簡単に言うと全てのIPアドレス(0.0.0.0/0)からHTTPTCPリクエストを80ポート81ポートで受信しています。

システムの最終の形

システムの最終の形はこんな感じになっております。

Screen Shot 2022-12-20 at 13.04.34.png

旧システムと比べるとかなり複雑に見えますが、今のNLBがリクエストを転送するだけでルーティングとリダイレクトを担当してないからALBより暇となっております。ですからAWSに暖機申請が不要になります。

これからまた別の問題が発生するかもしれないと思いますが解決できればまた新しい知識が勉強になりますので引き続きよろしくおねがいします。

では今回のALBとNLBのブログが以上となります、また別のブログにお会いましょう。

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?