invsというリクエストを標準出力に表示させるサーバーを作ってみました。
なぜこれを作ったのかというと
今までAWSのサーバーなどでロードバランサーやCloudFrontを経由して来たリクエストをncコマンドで確認していたのですがncコマンドは何でもできて便利な一方、リクエストを見たいだけでも指定コマンドが複雑で毎回調べていたので簡単に使えるようにしました。
また、ヘルスチェックなど見たくない標準出力を表示しないようにする機能やリバースプロキシの機能もつけて便利にデバッグできるようにしました。
インストール方法
goの環境が入っている場合は以下のようにインストールできます。
go get github.com/kozakana/invs
クロスコンパイル
サーバーにgoの環境がない場合はMacなど手元の環境でクロスコンパイルしてscpなどで送ります。
今回AmazonLinux2で試したので以下の様にgoの環境がある場所でbuildして使用しています。
GOOS=linux GOARCH=amd64 go build
オプション
-p
サーバーを起動するポートを指定できます。
# invs -p 9999
--filter-url
指定した文字列が含まれるURLのみリクエストを表示します。
# invs --filter-url
--exclude-url
指定した文字列が含まれるURLはリクエストを表示しません。
# invs --exclude-url health
/healthcheck
などのアクセスは表示されません(レスポンスは200で返します)
--proxy-host
リバースプロキシ先のhostとポートを指定できます。
# invs --proxy-host 172.31.24.126:80
リクエストを見る
AWS環境を使って実際に試してみました。Chromeからリクエストを送っています。
*IPアドレスなど一部を伏せています
起動
今回は80番ポートで起動します。
sudo ./invs -p 80
直接リクエスト
GET / HTTP/1.1
Host: 13.231.xxx.xxx
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
GET /favicon.ico HTTP/1.1
Host: 13.231.xxx.xxx
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Referer: http://13.231.xxx.xxx/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
ロードバランサー(ALB)経由でのリクエスト
+-----+ +-----+
| ALB | | EC2 |
| | => | |
+-----+ +-----+
Connection
ヘッダーがなくなり、X-Amzn-Trace-Id
X-Forwarded-For
X-Forwarded-Port
X-Forwarded-Proto
のヘッダーが追加されているのがわかります。
GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
X-Amzn-Trace-Id: Root=1-5ce60a98-1c4a3ce6c9b337f447e8bea0
X-Forwarded-For: 110.4.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http
GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Referer: http://test-1968106xxx.ap-northeast-1.elb.amazonaws.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
X-Amzn-Trace-Id: Root=1-5ce60a98-ec6c0ab6ad2e1bbe3b0924b2
X-Forwarded-For: 110.4.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http
CloudFront->ロードバランサー(ALB)経由でのリクエスト
+-----+ +-----+ +-----+
|Cloud| | ALB | | EC2 |
|Front| => | | => | |
+-----+ +-----+ +-----+
CloudFrontからのリクエストの場合はConnection
ヘッダーがなくなり、Via
X-Amz-Cf-Id
X-Amzn-Trace-Id
X-Forwarded-For
X-Forwarded-Port
X-Forwarded-Proto
のヘッダーが追加されていました。
GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Amazon CloudFront
Via: 1.1 456e40d63981bdbeea319544611f7xxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vqi1HWM1PVDoL0EUOIh_ccXIHHU93n4i10FpfhY1UQ3tNrYKUEmDrw==
X-Amzn-Trace-Id: Root=1-5ce60cce-e1d500985d90ce8c60e172f0
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http
GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
User-Agent: Amazon CloudFront
Via: 1.1 456e40d63981bdbeea319544611f7xxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: UGmqGqRdOfG3r-DY9zrWjgW4rcD-IAd0hGqkz5oIz6At415A7-r_1g==
X-Amzn-Trace-Id: Root=1-5ce60ccf-52f82d2a8b638fc2e9ce0f62
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http
ロードバランサーからのヘルスチェック
ヘルスチェックのURLは/healthcheck
にしています。
GET /healthcheck HTTP/1.1
Host: 172.31.xxx.xxx
Connection: close
Accept-Encoding: gzip, compressed
Connection: close
User-Agent: ELB-HealthChecker/2.0
ヘルスチェックを表示したくない場合は--exclude-url
のオプションを使って
# invs --exclude-url healthcheck
のようにすれば表示されなくなります。
リバースプロキシ
sudo ./invs -p 80 --proxy-host 172.31.24.126:80
proxy-hostオプションを指定することで指定先のサーバーに転送できます。
+-----+ +-----+ +-----+ +-----+
|Cloud| | ALB | | EC2 | | EC2 |
|Front| => | | => |Proxy| => | |
+-----+ +-----+ +-----+ +-----+
172.31.24.126:80
GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Amazon CloudFront
Via: 1.1 914d96cee7bcce13e9c9de2002a9axxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: jE2_4A_rTuVWIcCdU-x-J6pwsUwVda0Ml8zbLgeGBVP8oqAn-N5t_Q==
X-Amzn-Trace-Id: Root=1-5ce66ae0-b59f60647d100e20be5a8a3c
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http
GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
User-Agent: Amazon CloudFront
Via: 1.1 914d96cee7bcce13e9c9de2002a9axxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: wCFCKHmjJq7x8ZP4zPUYQsdG8DO5wKdfhPe4F1FyXk_Ch5YIi64A3w==
X-Amzn-Trace-Id: Root=1-5ce66ae0-62608948eb971d37a4ad10b5
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http