⚖️

【AWS】Network Load Balancerを経由した自身へのリクエストが成功しない

2023/06/23に公開

どういうこと?

このようにNLBを経由して自身にリクエストを投げても返事が返ってこないということです。

自身以外であれば問題なく通信可能です。

なぜ?

こちらに記載がありました。
preserve_client_ip.enabledtrueである場合、リクエストが別のインスタンスにルーティングされる場合のみ接続が成功するようです。
確認したらわたしの環境はその通りの設定だったため、自身への通信が通らなかったわけですね。

https://repost.aws/ja/knowledge-center/target-connection-fails-load-balancer
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/load-balancer-troubleshooting.html#loopback-timeout

  • リクエスト送信元のIPを保持するため
  • 送信元と送信先が同一のプライベートIPアドレスになってしまい
  • パケットを無効とみなす

ということみたいです。

デフォルト設定はどうなっているの?

このようになっています。

  • インスタンスタイプのターゲットグループ: 有効
  • IP タイプのターゲットグループ (UDP、TCP_UDP): 有効
  • IP タイプのターゲットグループ (TCP、TLS): 無効

タイプinstanceだと通信不可、タイプipだと通信可能
というパターンの場合該当する可能性があります。

その他注意点も記載があるため、使用する際はここを見ます。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation

preserve_client_ip.enabledを設定するメリット

そもそもpreserve_client_ip.enabledを設定するメリットはなんなのでしょうか。

preserve_client_ip.enabledtrue

  • クライアントのオリジナルIP取得が可能
    • ログ分析観点などで有用

preserve_client_ip.enabledfalse

  • クライアントのオリジナルIPを隠すことが出来る
  • 今回の問題を解決出来る

誰からのIPかわかるようになるのは大きいかもですね。
他にもメリットはあると思いますが、いずれ理解できるとうれしい。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/introduction.html

セキュリティグループ・NACLはどうすればいい?

指針が書かれているので、こちらを参照のこと。
クライアントIPを保持しない場合、NLBのIPを許可しなくてはならない、というような説明があります。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/target-group-register-targets.html#target-security-groups

おわりに

リクエスト送信元の設定が必要な場合、この項目を編集しましょう。

参考

https://dev.classmethod.jp/articles/pondering-source-ip-address-of-network-load-balancer/

Discussion