最近仕事でELBとその後段にあるnginxに対してProxy Protocolなるものの設定をする必要があって色々調べたので、せっかくだから自分のブログに備忘録として記録を残すことにします。自分が携わっている業務固有の情報が特にあるわけでもないので。
何故この対応をする必要が出てきたか?
諸事情で以下のブログ記事と同じくTCP(443)でロードバランシングをしているELBでリクエストを最初に受け取っている環境があり、この環境下ではELB配下にあるnginxのアクセスログにリクエストの送信元IPアドレスが記録されていないことが判明して不便だったので、それの対処をする必要が出てきたからです。
送信元IPアドレスが記録されていなかった原因と対処法
上記ブログ記事と同じ内容になってしまうのですが、原因を挙げると以下のようになります。
- AWSのELBはHTTP/HTTPSでロードバランシングする時はX-Forwarded-Forヘッダがサポートされるが、TCPロードバランシングする時はX-Forwarded-Forヘッダはサポートされないので、そのままだと送信元IPアドレスを伝えなくなってしまっていたから
- 公式サイトのドキュメント “Classic Load Balancer のリスナーの設定” などを参照
- この場合、AWSのELBと後段のnginxでProxy Protocolの設定を有効にする必要があり、どちらもその設定を有効化していなかったため
要はELB, nginxともにProxy Protocolの設定を有効にすれば解決、ということですね。ここに辿り着くまでに結構時間がかかってしまったので反省。
Proxy Protocolをサポートするのに具体的に必要なこと
ぶっちゃけ以下の記事を読んで設定を変更すれば問題ないはずです。実際私も以下のドキュメントと記事を読んで設定しました。
一つ付け加えられるとしたら、上記の記事のELBの設定変更ではawscliを使っているのですが、terraformでELBの設定を管理している場合は aws_proxy_protocol_policy
のresourceを設定することで可能になる、というところでしょうか。
後は各自の環境で必要な作業をして設定を変更してあげれば目的は達成できるはずです。
もうちょっとまともにコード書いてまとめようかと思ったのですが、時間かかっていつまでも記事をアップできなくなりそうなので、こんな感じで締めたいと思います。