はじめに

cloudpackサポートの畠山です。

Amazon Elastic Load Balancingにて提供されている、Network Load Balancer(以下「NLB」という)において、2つのアベイラビリティゾーン(以下「AZ」という)に配置したAmazon EC2(以下「EC2」という)のインスタンスへ均等にバランシングされない事象に遭遇したため、その内容と解決策をまとめました。

前提

Amazon Elastic Load Balancingでは主に負荷分散機能を備えたサービスであることが有名だと思いますが、お問い合わせ頂いたお客様環境ではNLBをマルチAZ(ap-northeast-1a及びap-northeast-1c)で配置しクロスゾーン負荷分散を有効化していたことから、インターネットトラフィックはそれぞれのAZへ均等にバランシングできる想定でした。

事象

弊社サービスをご利用のお客様環境にてNLB利用時に2つの異なるAZへ1台ずつEC2インスタンスを配置しているにも関わらず、 インターネットトラフィックが均等にバランシングされない事象に遭遇されていました。

調査内容

VPCフローログを確認した結果、殆どのインターネットトラフィックがap-northeast-1cに配置しているEC2インスタンスへ流れていました。
調査を進めたところ、特定条件下においてフローハッシュアルゴリズムの結果に偏りが生じていたことを確認しています。

【偏りが生じる状況】

  • フローハッシュアルゴリズムのハッシュ値計算時に使用するSrc/Dst IP:Portやシーケンス番号に偏りがある

かつ

  • NLB のターゲットグループに登録されているターゲットの台数が偶数である

お問い合わせ頂いたお客様環境では、前述した【偏りが生じる状況】の条件を満たしていました。

  • 送信元ポート等の偏り
  • ターゲットグループに登録されているEC2インスタンスの台数が偶数

解決策

以下のような環境とすることで、均等にバランシングできることを確認しました。

【AWS側の構成】

  • ターゲットグループに登録されているEC2インスタンスの台数を奇数とする
    • ap-northeast-1aに2台
    • ap-northeast-1cに1台

まとめ

Src/Dst IP:Portやシーケンス番号に偏りがあるかつNLB のターゲットグループに登録されているターゲットの台数が偶数である状況においては、ターゲットの台数を奇数にすることで均等にバランシングできるようになりました。

さいごに

特定条件下で均等なバランシングが行われない事象に遭遇されている方のご参考になれば幸いです。

その他

AWS ネットワークロードバランサー等の情報は以下を参考にしています。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/introduction.html#network-load-balancer-overview