AWSのELB(ロードバランサ)の中で、ALB(アプリケーションロードバランサ)を使用すると、ALB前後でHTTPヘッダーが書き換えられたり(変化)・追加(付与)されたりします。
例えば、その影響でALB経由でのProxyサーバー構成が構築できなかったりするので、具体的にどういう事か検証し確認していましました。
環境・前提条件
User → ALB → EC2
- AWS ALB
- ALBのバックエンドにEC2(Linux+apache+php)サーバーを構築しHTTPヘッダーを出力するページ(test.php)用意
- User側のブラウザツールとしてPostmanを使用
環境を作り、ALBの前後でHTTPヘッダーがどう変化・付与されるか確認してみました。
結論、ALBはHTTPリクエストヘッダーの追加だけじゃなく書き換えもある!
- HTTP Request(書換えられました!まさかの)
- X-Forwarded-For(追加されました。ユーザーのソースIPアドレス)
- X-Forwarded-Proto(追加されました)
- X-Forwarded-Port(追加されました)
- X-Amzn-Trace-Id(追加されました)
- Connection(無くなりました)
今回は特により詳しく確認したかったため「仮に上記検証環境のEC2がProxyサーバーだったら?」というイメージで、Userのブラウザ(Postman)に「ALB DNS名」 or「 EC2 パブリックIPアドレス」をProxy設定してHTTPヘッダーの出力を確認してみました。
厳密にはALBを経由するとHTTP Requestが書き換わることがわかりました。
そのため、EC2 Proxyサーバーの冗長構成でフロントにALBを利用することが出来ないんですね(Proxyサーバーの場合はNLBを利用しましょう)。
以下、今回の結論を導いた検証結果情報になります。
ALB前のリクエストヘッダー相当
実際に、UserとALB間のHTTPリクエストヘッダーを調査しようとすると、パケットキャプチャーとか仕掛けなければならなくなり大変なので、相当する情報として、Userが直接EC2に接続しに行った場合のHTTPリクエストヘッダーをまず調べました。
Userが以下の設定でALBにアクセスしに行ったときの、EC2が受け取ったHTTPリクエストヘッダーの出力です。
- UserのProxy設定に「EC2 パブリックIPアドレス」を設定
- UserのURL Requestは「適当なURLのhttp://a.b.c/test.php」
EC2側の出力としましては、
HTTP Request Headers
HTTP Request | GET http://a.b.c/test.php HTTP/1.1 |
User-Agent | PostmanRuntime/7.26.5 |
Accept | */* |
Cache-Control | no-cache |
Postman-Token | 603b2c7e-03e6-4db3-94e3-9cdb919a26d1 |
Host | a.b.c |
Accept-Encoding | gzip, deflate, br |
Connection | keep-alive |
HTTP Response Headers
Upgrade | h2,h2c |
Connection | Upgrade |
X-Powered-By | PHP/5.4.16 |
HTTPレスポンスヘッダーは厳密には、phpの下のapacheが付加するHTTPレスポンスヘッダーも追加で存在します。
上記が、apacheも加わったユーザー側に返るHTTPレスポンスヘッダーです。apacheのバージョン情報とかもオンされていますね。
ALB後のHTTPリクエストヘッダー
同じUserから今度は、同じHTTPリクエストへッダーを、User→ALBになげ、ALB→EC2でEC2が受け取ったHTTPリクエストヘッダーを確認しました。
Userが以下の設定でALBにアクセスしに行ったときの、EC2が受け取ったHTTPリクエストヘッダーの出力です。
- UserのProxy設定に「ALB DNS名」を設定
- UserのURL Requestは「適当なURLのhttp://a.b.c/test.php」
EC2側の出力としましては、
HTTP Request Headers
HTTP Request | GET /test.php HTTP/1.1 |
X-Forwarded-For | 183.86.*.* |
X-Forwarded-Proto | http |
X-Forwarded-Port | 80 |
Host | a.b.c |
X-Amzn-Trace-Id | Root=1-5f75d5d3-780ad3c84bfe37a27706631f |
User-Agent | PostmanRuntime/7.26.5 |
Accept | */* |
Cache-Control | no-cache |
Postman-Token | 8e9ff610-b111-4e21-9818-6dd0dc2ada1b |
Accept-Encoding | gzip, deflate, br |
「Connection: keep-alive」HTTPヘッダーも無くなっていますね。
HTTP Response Headers
Upgrade | h2,h2c |
Connection | Upgrade |
X-Powered-By | PHP/5.4.16 |