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種類のロードバランサー比較
| 特徴 | ALB | NLB | CLB |
|---|---|---|---|
| OSIレイヤー | L7 (HTTP/HTTPS) | L4 (TCP/UDP/TLS) | L4/L7 |
| 固定IP | なし(DNS名) | Elastic IP対応 | なし |
| 静的IP | なし | あり(サブネットごと) | なし |
| ヘルスチェック | HTTP/HTTPS | TCP/HTTP/HTTPS | HTTP/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のチェーン構成を使う。