SJ blog
architecture
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

ALB vs NLB vs CLB — ロードバランサー完全比較と選択基準

AWSの3種類のロードバランサー(ALB、NLB、CLB)の動作レイヤー、プロトコルサポート、スティッキーセッション、固定IP、mTLS、WebSocket対応の違いと設計パターンを解説。

一言結論

CLBはレガシーで新規利用は避けるべきであり、HTTP/HTTPSのL7ルーティングにはALB、固定IPや超低レイテンシーのTCP/UDPにはNLBを使い、固定IPかつL7ルーティングが両方必要な場合はNLB→ALBのチェーン構成が唯一の解だ。

3種類のロードバランサー比較

特徴ALBNLBCLB
OSIレイヤーL7 (HTTP/HTTPS)L4 (TCP/UDP/TLS)L4/L7
固定IPなし(DNS名)Elastic IP対応なし
静的IPなしあり(サブネットごと)なし
ヘルスチェックHTTP/HTTPSTCP/HTTP/HTTPSHTTP/TCP
WebSocket
gRPC
mTLS✅(v2024)
ターゲットタイプインスタンス/IP/Lambdaインスタンス/IP/ALBインスタンス
推奨度✅(推奨)✅(推奨)❌(レガシー)

ALB(Application Load Balancer)

L7でHTTPヘッダー、パス、クエリパラメータ等に基づいてルーティングできる。

# ALBリスナールールの例
aws elbv2 create-rule \
  --listener-arn arn:aws:elasticloadbalancing:...:listener/app/my-alb/xxx \
  --conditions '[
    {
      "Field": "path-pattern",
      "Values": ["/api/*"]
    }
  ]' \
  --actions '[{
    "Type": "forward",
    "TargetGroupArn": "arn:aws:elasticloadbalancing:...:targetgroup/api-tg/xxx"
  }]' \
  --priority 10

ALBの主要機能:

コンテンツベースルーティング:
  /api/*         → APIサーバーターゲットグループ
  /static/*      → S3(Redirect)
  *.example.com  → ホストベースルーティング

認証統合:
  Amazon Cognitoユーザープール
  OpenID Connect(OIDC)
  SAML 2.0
  
Lambdaターゲット:
  HTTPリクエストを直接Lambdaに転送
  → EC2なしでサーバーレスAPIを構築

NLB(Network Load Balancer)

L4での超低レイテンシー(数百マイクロ秒)と固定IPが特徴。

固定IPアドレス:
  各AZのサブネットにEIPを割り当て可能
  → IPホワイトリストが必要なクライアントからの接続に対応
  
超低レイテンシー:
  TCPコネクションをターゲットに直接渡す(L4プロキシ)
  → ゲーム、VoIP、金融取引に適する
  
ALBをターゲットにできる(NLB→ALB):
  固定IPが必要だがL7ルーティングも必要な場合に使う
  → NLBが固定IPを提供 + ALBがL7処理
# NLBにElastic IPを割り当てる設定(ALBとの違い)
aws elbv2 create-load-balancer \
  --name my-nlb \
  --type network \
  --subnet-mappings '[
    {
      "SubnetId": "subnet-aaa",
      "AllocationId": "eipalloc-xxx"
    },
    {
      "SubnetId": "subnet-bbb",
      "AllocationId": "eipalloc-yyy"
    }
  ]'

スティッキーセッション(Sticky Sessions)

同一クライアントからのリクエストを同じターゲットに転送する。

ALBのスティッキーセッション:
  LBCookieStickiness: ALBが独自Cookieを設定(AWSALB)
  AppCookieStickiness: アプリケーションのCookieに基づく

NLBのスティッキーセッション:
  ソースIPベース(Cookieなし)
  5分のタイムアウト(変更不可)
# ALBターゲットグループのスティッキーセッション設定
aws elbv2 modify-target-group-attributes \
  --target-group-arn arn:... \
  --attributes '[
    {"Key": "stickiness.enabled", "Value": "true"},
    {"Key": "stickiness.type", "Value": "lb_cookie"},
    {"Key": "stickiness.lb_cookie.duration_seconds", "Value": "86400"}
  ]'

接続ドレイニング(Deregistration Delay)

ターゲットをターゲットグループから外す際に既存のコネクションを完了させる待機時間。

# 接続ドレイニングを60秒に設定
aws elbv2 modify-target-group-attributes \
  --target-group-arn arn:... \
  --attributes '[
    {"Key": "deregistration_delay.timeout_seconds", "Value": "60"}
  ]'

ALBとWAFの組み合わせ

CloudFront → WAF → ALB → EC2

または:

ALB → WAF(ALBに直接アタッチ)
  → ALBのリクエストをWAFでフィルタリング
  → 余分なホップがなくシンプルな構成

Cross-Zone Load Balancing

有効(デフォルト: ALBは有効、NLBは無効):
  全AZのターゲットに均等にトラフィックを分散
  各AZのインスタンス数が異なっても均等

無効:
  各AZに来たトラフィックはそのAZのターゲットにのみ転送
  AZごとに均等だがインスタンスあたりは不均等になる可能性

試験頻出ポイント

シナリオ回答
HTTP URLパスに基づくルーティングALB
固定IPアドレスが必要NLB(EIP)
Lambdaを直接ターゲットにしたいALB
WebSocketが必要ALB または NLB
gRPCが必要ALB
固定IP+L7ルーティングの両方NLB → ALBをターゲット
超低レイテンシーのゲームサーバーNLB

まとめ

CLBはレガシーで新規では使わない。ALBはHTTP/HTTPS向けのL7ルーティング、NLBはTCP/UDP/TLSの超低レイテンシーと固定IPが特徴だ。固定IPが必要かつL7ルーティングも必要な場合はNLB→ALBのチェーン構成を使う。