NLBにElastic IP(EIP)をアタッチしてもそのIPが使われない場合がある

2020.08.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

インターネット向けのNLB(Network Load Balancer)を作成する場合は、必要に応じてサブネットごとにElastic IPアドレス(以下EIP)を指定することができます。

ですが状況によってはこのEIPが使われないケースがあることを学びましたので、レポートします。
もう少し厳密に書くと、NLB作成時に指定したサブネットが一部使われないケースがあります。従ってそのサブネットのEIPが使われなくなります。

結論から先に

2サブネットにまたがるインターネット向けNLBを作成したとします。 アベイラビリティーゾーン(以下AZ)毎に1サブネットのみ選択可能なため、これは2AZにまたがるNLBとも言えます。

それぞれのAZ毎にEIPを指定します。つまり2つのEIPがこのNLBには紐付いています。

この時、NLBエンドポイント(DNS名)に対するdigコマンド結果は以下になります。

  • Healthyなターゲットリソースがないとき → 2IP
  • 片方のAZにだけターゲットリソースがある → 1IP(リソースがある方のIPのみ)
  • 上記状態からクロスゾーン負荷分散有効 → しばらくしてから2IPに
  • クロスゾーン負荷分散無効で、ターゲットリソース配置AZを変える → IPが変わる(さっきまで使われていなかったEIP、つまり新しくターゲットが配置されたAZのEIPが使われる)

解説

クロスゾーン負荷分散とは

クロスゾーン負荷分散が無効な場合は、ロードバランサーのノードは、同じAZ上に存在するターゲットに対してのみトラフィックを流します。

逆にクロスゾーン負荷分散が有効な場合は、ノードはAZを気にせず同じAZ上のターゲットにも、異なるAZ上のターゲットにも、両方にトラフィックを流します。

NLBのデフォルトはクロスゾーン負荷分散無効

NLBはクロスゾーン負荷分散の設定が無効の状態で作成されます。以下はNLB作成直後の設定状態です。

特定のAZにしかターゲットがいなかったら?

では、クロスゾーン負荷分散無効、かつターゲットリソースが 無い AZのロードバランサーノードはどこにトラフィックを転送するのでしょうか?

こういう場合、そもそもそのAZにノードは作成されません。

故にそのAZ(のサブネット)に設定されたEIPも使われません。

やってみた

EIP作成

EIPは2つ作成します。 NLBはサブネットごとにEIPを指定でき、かつ今回は2サブネット(AZ)にまたがるインターネット向けNLBを作成するためです。

NLB作成 (Healthyなターゲットなし)

EIPを使って2サブネットにまたがるNLBを作成しました。

この状態でdigコマンドでドメイン名からIPアドレスを調べてみましょう。

$ dig eip2-xxxxxxxx.elb.ap-northeast-1.amazonaws.com +short
54.248.204.82
54.178.120.103

設定したEIPが両方返ってきてますね。

片方のAZにのみターゲットを配置

片方のAZのみにターゲットを登録しました。
※今回は 前回のエントリの構成を使用しているので、AuroraインスタンスのIPを登録しています。

しばらくすると…

Healthyになりました。再度digしてみます。

$ dig eip2-xxxxxxxx.elb.ap-northeast-1.amazonaws.com +short
54.248.204.82

レスポンスが一行減りました。ターゲットはap-northeast-1aに存在しているので、ap-northeast-1c の方のIP 54.178.120.103 が減っています。

クロスゾーン負荷分散を有効にする

この状態で、クロスゾーン負荷分散を有効にしてみます。前述のとおりロードバランサーノードのAZとターゲットのAZが同じである必要がなくなるので、ap-northeast-1c の方のIP 54.178.120.103も復活するはずです。

設定変更後1分くらいで 54.178.120.103も返却されるようになりました。予想通りです。

$ dig eip2-xxxxxxxx.elb.ap-northeast-1.amazonaws.com +short
54.248.204.82
54.178.120.103

クロスゾーン負荷分散を無効にしたうえで、ターゲットのAZを変更

クロスゾーン負荷分散を無効に戻した上で、ターゲットが配置されているAZを変えてみます。 ap-northeast-1c の方のIP 54.178.120.103だけが返って、1aの54.248.204.82は返ってこなくなるはずです。

しばらくすると… healthyになりました。再度digしてみます。

$ dig eip2-xxxxxxxx.elb.ap-northeast-1.amazonaws.com +short
54.178.120.103

予想通りになりました!

まとめ

NLBにEIPをアタッチしてもそのIPが使われない場合があるという話から、クロスゾーン負荷分散やNLBとAZの関係性についてご紹介しました。NLBの理解の一助になれば幸いです。

参考情報