SJ blog
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間転送コストが発生する点に注意する。