【正解】C
【0からの解説】
まず Network Load Balancer (NLB) のゾーン DNS の仕組みを理解します。NLB を作成すると、各 AZ にゾーン固有の DNS 名(例: us-east-1a.my-nlb-xxxx.elb.amazonaws.com)と、全 AZ を含むリージョン DNS 名(my-nlb-xxxx.elb.amazonaws.com)が払い出されます。
クロスゾーン負荷分散をオフにした NLB では、各ゾーン固有の DNS 名にアクセスすると、その AZ 内のターゲットにのみトラフィックが分散されます。これを使えば「同一 AZ にとどめる」ことができますが、問題はそのゾーンに正常なターゲットが 1 つもなくなったときです。クロスゾーン無効の NLB では、AZ 内に正常なターゲットがなくなると、その AZ の NLB ノードの IP は DNS 応答から外れますが、ゾーン固有 DNS 名だけを使っていると他 AZ へ自動的にフェイルオーバーする確実な仕組みが弱くなります。
そこで Route 53 のフェイルオーバールーティングを組み合わせます。AZ ごとに、プライマリレコード=ローカル AZ のゾーン NLB DNS 名、セカンダリレコード=リージョン NLB DNS 名(全 AZ をカバー)とし、ヘルスチェックでプライマリを監視します。通常時はプライマリ(ローカル AZ)が応答してトラフィックは同一 AZ にとどまり、ローカル AZ に正常なターゲットがなくなるとヘルスチェックが失敗してセカンダリ(リージョン全体)に切り替わり、他方の AZ へトラフィックが流れます。これがまさに要件「同一 AZ 優先、なければ他 AZ」を満たすため、C が正解です。
【誤りの選択肢】
A:加重(weighted)ルーティングは指定した重みの比率でトラフィックを振り分ける仕組みで、ヘルスチェックに基づく「プライマリが落ちたらセカンダリ」という明確なフェイルオーバー挙動を本来の目的としていません。フェイルオーバー要件にはフェイルオーバールーティング(C)が適切です。
B:クロスゾーン負荷分散をオフにしてゾーン固有 DNS をルックアップすれば同一 AZ には保てますが、ローカル AZ のターゲットが全滅したときに他 AZ へ確実にフェイルオーバーさせる仕組みが欠けています。Route 53 フェイルオーバーによるセカンダリ(リージョン全体)への切り替えがないため、要件の後半(なければ他 AZ へ)を満たしきれません。
D:スティッキーセッションはクライアントのセッションを特定のターゲットに固定する機能であり、「AZ をまたぐトラフィックを抑制し、なければ他 AZ にフォールバックする」という AZ レベルのルーティング制御は実現できません。要件と無関係です。
【参考】
Network Load Balancer のゾーン別 DNS とクロスゾーン負荷分散Route 53 フェイルオーバールーティングポリシー