architecture
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
NLB固定IPとEIP — Elastic IPによるネットワークロードバランサーの設計
Network Load BalancerへのElastic IP割り当て、AZごとのEIP設計、NLBのターゲットタイプ(インスタンス/IP/ALB)、クロスゾーン負荷分散の無効設定、IPホワイトリストが必要な構成でのNLB活用を解説。
一言結論
ロードバランサーに固定IPが必要な場合はNLBにEIPを割り当て(AZごとに1つ)、さらにL7ルーティングも必要であればNLBの背後にALBをターゲットとして連結する構成が唯一の解答だ。
NLB に固定IPが必要な理由
ALBはDNS名のみでIPアドレスが変動するのに対し、NLBはElastic IP(EIP)を割り当てて固定IPを提供できる。
ALBの制限:
→ IPアドレスは変動(DNSを使う必要がある)
→ クライアント側にIPホワイトリストを設定できない
NLBの固定IP:
→ AZごとに1つのEIPを割り当て
→ クライアントにIPアドレスを教えてホワイトリスト登録できる
→ ファイアウォールルールの管理が容易
固定IPが必要なユースケース:
✅ レガシーシステムがDNSではなくIPでの通信のみ対応
✅ クライアントのファイアウォールがIPホワイトリスト方式
✅ 規制要件でIPアドレスの明示が必要
✅ オンプレミス → AWSの接続でSite-to-Site VPN使用
EIPを使ったNLBの作成
# EIPの割り当て
aws ec2 allocate-address --domain vpc
# → AllocationId: eipalloc-aaa
aws ec2 allocate-address --domain vpc
# → AllocationId: eipalloc-bbb
# EIPを指定してNLBを作成(各AZに1つのEIP)
aws elbv2 create-load-balancer \
--name my-nlb-with-eip \
--type network \
--scheme internet-facing \
--subnet-mappings '[
{
"SubnetId": "subnet-az1-xxx",
"AllocationId": "eipalloc-aaa"
},
{
"SubnetId": "subnet-az2-yyy",
"AllocationId": "eipalloc-bbb"
}
]'
EIPなし(プライベートIPのみ):
→ サブネットのIPアドレスが自動割り当て
→ インターナルNLBはこれで十分
EIPあり(固定IP):
→ 外部クライアントに固定IPを提供
→ AZごとに1つのEIPが必要
NLBのターゲットタイプ
インスタンス(instance):
→ EC2インスタンスをターゲット
→ インスタンスIDで登録
→ クライアントIPはソースIPとしてインスタンスに届かない(NLBのNATIP)
IP:
→ IPアドレスでターゲット登録
→ ECS Fargate タスク、コンテナのIPを直接指定
→ オンプレミスサーバーもターゲット登録可能(DX/VPN経由)
ALB(ALBをターゲット):
→ NLBの固定IPとALBのL7ルーティングを組み合わせ
→ 固定IPが必要かつL7ルーティングも必要な場合
→ NLB → ALB → ターゲットグループ
クロスゾーン負荷分散
デフォルト設定:
NLB: クロスゾーン負荷分散 無効(ALBは有効)
クロスゾーン無効の動作:
AZ-aに来たリクエスト → AZ-aのターゲットのみ
AZ-bに来たリクエスト → AZ-bのターゲットのみ
クロスゾーン有効の動作:
すべてのリクエスト → 全AZのターゲットに均等分散
注意: NLBのクロスゾーン負荷分散を有効にすると
AZ間のデータ転送料金が発生する
# クロスゾーン負荷分散の設定
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn arn:aws:elasticloadbalancing:... \
--attributes '[
{
"Key": "load_balancing.cross_zone.enabled",
"Value": "true"
}
]'
NLB ヘルスチェックの設定
# NLBターゲットグループの作成
aws elbv2 create-target-group \
--name my-nlb-targets \
--protocol TCP \
--port 8080 \
--vpc-id vpc-xxx \
--target-type ip \
--health-check-protocol TCP \
--health-check-port 8080 \
--health-check-interval-seconds 10 \
--healthy-threshold-count 3 \
--unhealthy-threshold-count 3
NLBヘルスチェックの特徴:
→ HTTP/HTTPS/TCP/TLSプロトコルをサポート
→ タイムアウトは設定できない(TCPタイムアウトに従う)
→ HealthCheckTimeoutSeconds は HTTP/HTTPS のみ設定可能
→ 最小間隔: 10秒
セキュリティグループ
NLBのセキュリティグループ:
→ 2023年のアップデートでNLBにもセキュリティグループを設定可能に
→ 以前はNLBにセキュリティグループはなく、ターゲットのSGで制御
注意:
NLBにSGを設定しない場合:
→ ターゲットのSGでNLBのソースIPを許可する必要がある
→ ソースIPがクライアントのIPのため、IPが不定
NLBにSGを設定した場合:
→ SGでインバウンドトラフィックを制御できる
→ ターゲットSGにはNLB SGを許可するルールを追加
試験頻出ポイント
| シナリオ | 回答 |
|---|---|
| ロードバランサーに固定IPが必要 | NLB + EIP |
| 固定IP + L7ルーティングの両方が必要 | NLB → ALB(ALBをターゲット) |
| Fargate タスクをNLBターゲットに | IPターゲットタイプ |
| NLBのクロスゾーン負荷分散のデフォルト | 無効(ALBは有効) |
| オンプレミスサーバーをNLBターゲットに | IPターゲットタイプ(DX/VPN経由) |
まとめ
NLBの固定IPはEIPをAZごとに割り当てることで実現する。固定IPが必要かつL7ルーティングも必要な場合はNLB→ALBのチェーン構成を使う。クロスゾーン負荷分散はNLBではデフォルト無効でAZ間転送コストが発生する点に注意する。