ALB vs NLB — ロードバランサーの選択基準

読了 6分

AWS でロードバランサーを選ぶとき、実際の選択肢は 2 つです。Application Load Balancer(ALB)と Network Load Balancer(NLB)です。結論を先に書くと、HTTP(S) サービスは ALB がデフォルトで、固定 IP・非 HTTP プロトコル・PrivateLink が必要になったら NLB に行きます。 機能が重なる領域があって迷いやすいのですが、分かれる条件はいくつかに絞られます。2 つのロードバランサーと ACM 証明書の基礎は AWS 中級 #6 で扱いました。料金は us-east-1 基準です。

ひと目でわかる比較 #

区分ALBNLB
動作レイヤーL7(HTTP/HTTPS、gRPC)L4(TCP/UDP/TLS)
ルーティングパス・ホスト・ヘッダーベースのルールなし(リスナーポート → ターゲットグループ)
固定 IP不可(DNS 名のみ)AZ ごとに固定 IP、EIP 指定可
送信元 IPX-Forwarded-For ヘッダーで伝達パケットのまま保持
ターゲットタイプインスタンス、IP、Lambdaインスタンス、IP、ALB
時間あたり料金約 $0.0225約 $0.0225
容量単位LCU あたり約 $0.008NLCU あたり約 $0.006

L7 vs L4 — リクエストを読むか、素通しするか #

ALB はリクエストの中身を読んで判断するロードバランサーです。パス(/api/*)、ホスト(admin.example.com)、ヘッダー、クエリ文字列を見て、別々のターゲットグループに振り分けます。HTTP リダイレクトと固定レスポンスをロードバランサー側で処理し、Cognito・OIDC 認証を組み込んでバックエンドの手前でログインを強制でき、WAF を直接つなげます。HTTP/2、gRPC、WebSocket に対応し、Lambda をターゲットにすることもできます。複数のマイクロサービスを 1 台のロードバランサーで受ける構成が ALB の主戦場です。

NLB はパケットを開かずに素通しするロードバランサーです。ルーティングルールがない代わりに処理の道のりが短く、追加の遅延はミリ秒未満に収まり、秒間数百万リクエストや急激なトラフィックスパイクをウォームアップなしで受け止めます。TCP・UDP・TLS リスナーに対応しているため、ゲームサーバー、MQTT ブローカー、DNS、データベースプロキシのような HTTP ではないトラフィックは、そもそも NLB しか選択肢がありません。

NLB でしかできないこと #

  • 固定 IP: NLB は AZ ごとに IP が固定され、EIP を直接指定できます。ファイアウォールの許可リストに IP を登録する必要がある企業間連携では、この条件ひとつで NLB に確定します。ALB は DNS 名だけを提供し、IP は随時変わります。
  • 送信元 IP の保持: NLB ではクライアント IP がパケットにそのまま残ります。ALB の背後では、アプリケーションが X-Forwarded-For ヘッダーを読むように直す必要があります。
  • PrivateLink: VPC エンドポイントサービスとして他アカウントにサービスを公開するには NLB が必須です。ALB は単独で PrivateLink の入り口になれません。
  • TLS パススルー: 暗号化をバックエンドまで途切れさせない要件(エンドツーエンド暗号化の監査など)は、TCP リスナーで通過させる NLB でしか実現できません。もちろん NLB も ACM 証明書で TLS を終端できます。

逆方向の誤解も整理しておきます。セキュリティグループは以前 ALB 専用でしたが、2023 年から NLB にも付けられるようになり、もう差別化ポイントではありません。ヘルスチェックは両方対応で、NLB は TCP ヘルスチェック(ポートが開いているかの確認)もできます。

料金 — 時間単価は同じで、LCU で分かれます #

どちらも時間あたり約 $0.0225 で、トラフィックがなくても月およそ $16 かかります。差が出るのは容量単位の料金です。ALB は LCU あたり約 $0.008、NLB は NLCU あたり約 $0.006 ですが、単価より重要なのは1 単位に収まる容量です。

  • LCU(ALB)1 個: 新規接続 秒間 25、アクティブ接続 3,000、処理量 時間あたり 1GB、ルール評価 秒間 1,000 のうち、最も使った次元で課金
  • NLCU(NLB、TCP 基準)1 個: 新規接続 秒間 800、アクティブ接続 100,000、処理量 時間あたり 1GB

新規接続で見ると、NLCU 1 個は LCU の 32 倍を収容します。接続が多くて短いワークロード(ポーリングクライアント、数万台の IoT デバイス)では、同じトラフィックでも NLB の請求書が大きく縮みます。一方、接続数が少なく帯域中心なら、どちらも処理量の次元(時間あたり 1GB)に引っかかるため差はわずかです。どの次元に当たっているかは CloudWatch の ConsumedLCUs メトリクスで確認します。

隠れコストはクロスゾーン負荷分散です。ALB はデフォルトで有効かつ AZ 間の転送料金なしですが、NLB はデフォルト無効で、有効にすると AZ 間のデータ転送料金がかかります。NLB への移行でうっかり有効にすると、料金が急に増える項目になります。ALB 側の落とし穴はアイドルタイムアウト(デフォルト 60 秒)で、時間のかかるレスポンスやロングポーリングは、タイムアウトを延ばさないと 504 で切られます。

両方必要なら — NLB → ALB チェーン #

固定 IP は必要だけれどパスルーティングも使いたい、という場合は選ばなくてもかまいません。NLB のターゲットタイプに ALB を指定して、NLB(固定 IP・PrivateLink)→ ALB(L7 ルーティング)→ サービスというチェーンを組めます。ロードバランサー 2 台分の料金がかかるので、あくまで 2 つの要件が実際に同時にあるときの構成で、片方の要件がなければ 1 台で済ませるのが正解です。

選択の手順 #

  1. プロトコルから見ます: HTTP(S)・gRPC でなければ NLB に確定です。TCP、UDP、TLS パススルーは ALB では処理できません。
  2. 固定 IP と PrivateLink の要件を確認します: 許可リストへの登録、VPC エンドポイントサービスとしての公開のどちらかがあれば NLB です。
  3. L7 機能の要否を見ます: パス・ホストルーティング、認証連携、WAF、Lambda ターゲットが必要なら ALB です。複数のコンテナサービスを 1 つの入り口で受ける構成(ECS Fargate vs EC2 で扱ったサービスの前段)が典型です。
  4. 両方ならチェーンを検討します: NLB → ALB 構成で 2 つの要件を同時に満たせます。
  5. 料金は LCU の次元で検算します: 接続ヘビーなら NLB が安く、帯域中心ならほぼ同じです。時間あたりの固定費は同じなので、使っていないロードバランサーが残っていないかも常時点検リストで合わせて見ます。

まとめ #

  • HTTP(S) サービスは ALB がデフォルトです。パス・ホストルーティング、認証、WAF、Lambda ターゲットまで、L7 機能はすべて ALB 側にあります。
  • 固定 IP、送信元 IP の保持、PrivateLink、TLS パススルー、非 HTTP プロトコルのどれかに当てはまれば NLB です。
  • 時間単価はどちらも約 $0.0225 で同じで、請求書は LCU の計算で分かれます。新規接続の容量が 32 倍違うため、接続ヘビーなワークロードは NLB が有利です。
  • NLB のクロスゾーン負荷分散はデフォルトで無効、有効にすると AZ 間の転送料金がかかります。ALB はアイドルタイムアウト 60 秒がデフォルトです。
  • 固定 IP と L7 ルーティングが同時に必要なら、NLB → ALB チェーンで構成します。
X