はじめに
ALBを作成する時
- 物理的には複数のサブネットにLBノードを配置する
- ALB自体には一つのDNS名しか振られない
そのDNS名はどのLBノードを指しているのか?という疑問を解決したい。
画像のような実体を表していない構成図の実体を理解した備忘録です。
ALBに振られたDNS名が何を指しているのか理解する
- ALB作成時にLBノードを配置するサブネットを指定するため、構成図は以下の通り
親LBに当たるものが何なのかを理解するためにnslookupする
> nslookup test-lb-1260472969.us-east-1.elb.amazonaws.com
< 98.84.240.113
54.87.217.213
> nslookup test-lb-1260472969.us-east-1.elb.amazonaws.com
< 54.87.217.213
98.84.240.113
> nslookup test-lb-1260472969.us-east-1.elb.amazonaws.com
< 98.84.240.113
54.87.217.213
上記の実行結果から親LBだと思っていた物が、DNSラウンドロビンだったことが分かる
LBノードを増やして再度nslookupする
- サブネットを一つ増やしてLBノードを配置し、ターゲットを指定する
- 構成図は以下の通り
> nslookup test-lb-1260472969.us-east-1.elb.amazonaws.com
< 98.84.240.113
54.87.217.213
34.193.27.174
上記の実行結果からDNSラウンドロビンが返すIPアドレス群はLBノードのIPアドレスであることが分かる
LBノードの生IPにアクセスする
- nslookupによって特定したLBノードの生IPにアクセスする
- LBノードはサブネットに配置しているので、同じAZのターゲットにしかルーティング
しないことを期待した構成図は以下の通り
下記の実行結果からLBノードに直接アクセスしても
同AZのターゲットのみにルーティングしている訳ではなく
ターゲットグループ全体にラウンドロビンでリクエストを振り分けていることが分かる
> curl 98.84.240.113
< instance: us-east-1b
> curl 98.84.240.113
< instance: us-east-1a
> curl 98.84.240.113
< instance: us-east-1c
よって期待から外れ、以下の構成図のようになる
何故このような挙動を取るのか
-
DNSラウンドロビンはLBノードのIPアドレスを順番に返すだけなので
どこかのAZにターゲットが偏って配置された場合、トラフィックが偏ってしまう。
クロスゾーン負荷分散によって、トラフィックの偏りを防止している。 -
クロスゾーン負荷分散をオフにする
- ターゲットグループ属性を編集 > ターゲット選択設定 から変更する
下記の実行結果からクロスゾーン負荷分散をオフにした場合
同AZのターゲットのみルーティングすることが分かる
> curl 98.84.240.113
< instance: us-east-1b
> curl 98.84.240.113
< instance: us-east-1b
つまり、以下の構成図となる
LBノードの効力はAZ単位なのか?サブネット単位なのか?
構成図は以下の通り
以下の実行結果から同AZのサブネットにLBノードが配置されていれば
サブネットにLBノードが配置されていなくても
トラフィックを受信出来ることが分かる
> curl test-lb-1260472969.us-east-1.elb.amazonaws.com
< instance: us-east-1b
> curl test-lb-1260472969.us-east-1.elb.amazonaws.com
< instance: us-east-1b-2
> curl test-lb-1260472969.us-east-1.elb.amazonaws.com
< instance: us-east-1a
さいごに
実体としてALBは
- DNSラウンドロビン
- AZ毎に配置されたLBノードが組むクロスゾーン負荷分散
の2段構造になっている。
ただ、基本的にLBノードの存在を意識する必要はない。
ALB作成時に、ターゲットを配置するAZのサブネットを選択する程度の意識で十分。