[アップデート]Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされました

[アップデート]Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされました

Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされるようになりました
Clock Icon2025.02.18

お疲れさまです。とーちです。

Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされるようになりました
実際に試してみた内容を紹介します。

https://aws.amazon.com/about-aws/whats-new/2025/02/aws-network-load-balancer-removing-availability-zones

とりあえずまとめ

  • NLBの配置サブネットを削除できるようになりました
  • 今までは追加のみ可能でしたが、削除もできるようになりました
  • AZ障害時の対応の選択肢が増えました

NLBのネットワークインターフェースとDNS名の関係

今回のアップデートを理解しやすくするために、まず、NLBのネットワークインターフェースとDNS名の関係について簡単に説明します。NLBを作成すると裏では以下のようなことが行われています

  1. NLBのネットワークマッピング設定で指定した各サブネットにNLB用のネットワークインターフェース(ENI)が作成されます
  2. AWSが提供するNLB用のDNS名(nlb-xxx.elb.amazonaws.com)が発行されます
  3. このDNS名に対して、作成されたENIのIPアドレスが自動的に関連付けられます

絵で表すとこういうことです。

image.png

何が変わったのか

以下の記事にもあるように、これまではNLBの配置サブネットについて、追加することはできても削除することができませんでした

https://dev.classmethod.jp/articles/nlb-add-az-and-assign-private-ip/

そのため、NLB配置サブネットを減らしたいときにはNLB自体を再作成する等して対応する必要がありました。

今回のアップデートにより、NLBの配置サブネットを削除することが可能になりました。サブネットを削除すると、以下のような状態になります

image.png

どんなときに使える?

NLBの配置サブネットを削除したいケースとして以下のようなものが考えられます

  • AZ単位で障害が発生した際に、障害AZだけを切り離したい
  • 諸事情により使用するサブネットを減らしたい

特にAZ障害時の対応として、影響を受けているAZだけを切り離せるようになったのは運用の選択肢が増えて嬉しいですね。

実際に試してみる

それでは実際にNLBのネットワークマッピング設定を変更してサブネットを削除してみましょう。

検証環境

今回は以下のような環境で検証を行いました

image.png

  • NLBはプライベートサブネットに配置
  • NLBの配置サブネットは2つ
  • NLBの配置サブネットごとにターゲットとなるEC2を用意
  • NLBのクロスゾーン負荷分散設定は無効
  • EC2にはNginxを立ててシンプルなhtmlを返すようにセッティング

削除前の状態確認

まずは削除前の状態を確認します。DNS名前解決の状況を見てみましょう

sh-5.2$ dig test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com

;; ANSWER SECTION:
test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com. 35 IN A 172.18.1.120
test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com. 35 IN A 172.18.0.228

上記のように2つのIPアドレスに名前解決されています。

ENIも確認してみましょう

image.png

2つのENIが存在していることが確認できます。

接続確認も行ってみましょう

sh-5.2$ curl http://test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com
<title>NLB-update</title>
<h1>Hello World!</h1>
sh-5.2$ curl http://172.18.1.120
<title>NLB-update</title>
<h1>Hello World!</h1>
sh-5.2$ curl http://172.18.0.228
<title>NLB-update</title>
<h1>Hello World!</h1>

ついでなので、ENIやDNSの名前解決設定がどのくらいで削除されるのか確認するために、以下のスクリプトも流しておきます。

# 1秒間隔で監視し、タイムスタンプ付きでログファイルに記録
while true; do
  echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" | tee -a nlb_monitor.log
  aws ec2 describe-network-interfaces --network-interface-ids eni-xxxxx --query 'NetworkInterfaces[].Status' --output text | tee -a nlb_monitor.log
  dig +short nlb-xxx.elb.amazonaws.com | tee -a nlb_monitor.log
  echo "" | tee -a nlb_monitor.log
  sleep 1
done

サブネットの削除実行

では、この状態でNLB配置サブネットを削除してみましょう。

サブネットの削除はマネージメントコンソールから以下の手順でできます。もちろんAPIやAWS CLIでも可能です。

image.png

image.png

削除後の確認

削除後、digコマンドで名前解決の結果を確認すると、1つのIPアドレスのみが返されるようになりました

sh-5.2$ dig test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com

;; ANSWER SECTION:
test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com. 60 IN A 172.18.0.228

curlでの接続確認も行ってみましょう

sh-5.2$ curl http://test-mgmt-nlbupdate-elb-f29bc5ef90c821ca.elb.ap-northeast-1.amazonaws.com
<title>NLB-update</title>
<h1>Hello World!</h1>
sh-5.2$ curl http://172.18.0.228
<title>NLB-update</title>
<h1>Hello World!</h1>

当然ですが、削除されたENIのIPである http://172.18.1.120 には繋がりません(無応答)

また流しておいたスクリプトを確認すると以下のような感じでした。

=== 2025-02-18 07:43:28 === # 数秒の誤差はありますが、このタイミングでNLBの配置サブネットを削除してます
in-use
172.18.0.228
172.18.1.120

=== 2025-02-18 07:43:30 ===
in-use
172.18.0.228
172.18.1.120

<中略>

=== 2025-02-18 07:43:47 === #名前解決結果から172.18.1.120が削除
in-use
172.18.0.228

<中略>

=== 2025-02-18 07:43:54 === #なぜか172.18.1.120が復活
in-use
172.18.1.120
172.18.0.228

=== 2025-02-18 07:43:56 ===
in-use
172.18.0.228

=== 2025-02-18 07:43:57 ===
in-use
172.18.0.228

=== 2025-02-18 07:43:59 ===
in-use
172.18.0.228
172.18.1.120

=== 2025-02-18 07:44:01 ===
in-use
172.18.0.228
172.18.1.120

=== 2025-02-18 07:44:02 === # ENIが削除された

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228

<中略>

=== 2025-02-18 07:44:07 === # なぜかまたなぜか172.18.1.120が復活

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228
172.18.1.120

=== 2025-02-18 07:44:09 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228

=== 2025-02-18 07:44:11 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228
172.18.1.120

=== 2025-02-18 07:44:12 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228

=== 2025-02-18 07:44:14 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228
172.18.1.120

<中略>

=== 2025-02-18 07:44:19 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228

=== 2025-02-18 07:44:20 ===

An error occurred (InvalidNetworkInterfaceID.NotFound) when calling the DescribeNetworkInterfaces operation: The networkInterface ID 'eni-019bff949a1fc3d27' does not exist
172.18.0.228

<以降は同じ結果>

名前解決の結果として、何回か削除した 172.18.1.120 が出てきていますが、これはDNSキャッシュ等の影響によるものかもしれません(が、詳細については不明です)
いずれにせよ状態が安定するまでには、07:43:28〜07:44:19 と1分程度はかかることは覚えておいたほうが良さそうです。

まとめ

今回のアップデートで、NLBの配置サブネットを削除できるようになりました。特にAZ障害時の対応として、影響を受けているAZだけを切り離せるようになったのは運用の選択肢が増えて良いアップデートだと感じました。

以上、とーちでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.