ALB vs NLB — ロードバランサーの選択基準
AWS でロードバランサーを選ぶとき、実際の選択肢は 2 つです。Application Load Balancer(ALB)と Network Load Balancer(NLB)です。結論を先に書くと、HTTP(S) サービスは ALB がデフォルトで、固定 IP・非 HTTP プロトコル・PrivateLink が必要になったら NLB に行きます。 機能が重なる領域があって迷いやすいのですが、分かれる条件はいくつかに絞られます。2 つのロードバランサーと ACM 証明書の基礎は AWS 中級 #6 で扱いました。料金は us-east-1 基準です。
ひと目でわかる比較 #
| 区分 | ALB | NLB |
|---|---|---|
| 動作レイヤー | L7(HTTP/HTTPS、gRPC) | L4(TCP/UDP/TLS) |
| ルーティング | パス・ホスト・ヘッダーベースのルール | なし(リスナーポート → ターゲットグループ) |
| 固定 IP | 不可(DNS 名のみ) | AZ ごとに固定 IP、EIP 指定可 |
| 送信元 IP | X-Forwarded-For ヘッダーで伝達 | パケットのまま保持 |
| ターゲットタイプ | インスタンス、IP、Lambda | インスタンス、IP、ALB |
| 時間あたり料金 | 約 $0.0225 | 約 $0.0225 |
| 容量単位 | LCU あたり約 $0.008 | NLCU あたり約 $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 台で済ませるのが正解です。
選択の手順 #
- プロトコルから見ます: HTTP(S)・gRPC でなければ NLB に確定です。TCP、UDP、TLS パススルーは ALB では処理できません。
- 固定 IP と PrivateLink の要件を確認します: 許可リストへの登録、VPC エンドポイントサービスとしての公開のどちらかがあれば NLB です。
- L7 機能の要否を見ます: パス・ホストルーティング、認証連携、WAF、Lambda ターゲットが必要なら ALB です。複数のコンテナサービスを 1 つの入り口で受ける構成(ECS Fargate vs EC2 で扱ったサービスの前段)が典型です。
- 両方ならチェーンを検討します: NLB → ALB 構成で 2 つの要件を同時に満たせます。
- 料金は 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 チェーンで構成します。