[アップデート]Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされました
お疲れさまです。とーちです。
Network Load Balancer(NLB)でアベイラビリティーゾーンの削除がサポートされるようになりました
実際に試してみた内容を紹介します。
とりあえずまとめ
- NLBの配置サブネットを削除できるようになりました
- 今までは追加のみ可能でしたが、削除もできるようになりました
- AZ障害時の対応の選択肢が増えました
NLBのネットワークインターフェースとDNS名の関係
今回のアップデートを理解しやすくするために、まず、NLBのネットワークインターフェースとDNS名の関係について簡単に説明します。NLBを作成すると裏では以下のようなことが行われています
- NLBのネットワークマッピング設定で指定した各サブネットにNLB用のネットワークインターフェース(ENI)が作成されます
- AWSが提供するNLB用のDNS名(nlb-xxx.elb.amazonaws.com)が発行されます
- このDNS名に対して、作成されたENIのIPアドレスが自動的に関連付けられます
絵で表すとこういうことです。
何が変わったのか
以下の記事にもあるように、これまではNLBの配置サブネットについて、追加することはできても削除することができませんでした。
そのため、NLB配置サブネットを減らしたいときにはNLB自体を再作成する等して対応する必要がありました。
今回のアップデートにより、NLBの配置サブネットを削除することが可能になりました。サブネットを削除すると、以下のような状態になります
どんなときに使える?
NLBの配置サブネットを削除したいケースとして以下のようなものが考えられます
- AZ単位で障害が発生した際に、障害AZだけを切り離したい
- 諸事情により使用するサブネットを減らしたい
特にAZ障害時の対応として、影響を受けているAZだけを切り離せるようになったのは運用の選択肢が増えて嬉しいですね。
実際に試してみる
それでは実際にNLBのネットワークマッピング設定を変更してサブネットを削除してみましょう。
検証環境
今回は以下のような環境で検証を行いました
- 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も確認してみましょう
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でも可能です。
削除後の確認
削除後、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だけを切り離せるようになったのは運用の選択肢が増えて良いアップデートだと感じました。
以上、とーちでした。