これはなんですか
AWSのApi Gateway上のAPIが提供されましたが、IPアドレス制限をかけられたせいで自宅の手元PCからアクセスできないため、暫定処置として 許可されているIPアドレスのところに http -> httpsへのプロクシを nginx で立てた。
その際にどはまりしたのでなぜはまったのかのと、どうすればいいかを記録として残す。
なお、リダイレクトじゃなくてよプロクシ動作だよと、先に申し添えておきます。
構成
手元PCのREST Client(http) -> nginx -> (https)APIGW
/proxy/api/getResource
というパスで受けて、 APIGW上の /api/getResource
というエンドポイントにつなぐ。
まず最初に解答
set $backend_https_server xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com;
location /proxy/api/getResource {
resolver 8.8.8.8;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_server_name on;
proxy_ssl_name $backend_https_server;
proxy_set_header Host "xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com:443";
proxy_pass https://$backend_https_server:443/api/getResource;
}
解説
- API Gatewayの仕様で10分周期前後でIPアドレスが変わる
- nginxは設定にそのままホスト名を埋めると、IPアドレスをキャッシュするという挙動をするため、一度変数にしてから(1行目)URLを組み立てるようにする。そうすると毎回DNSを参照してくれる。
- API Gatewayの仕様でSNIと呼ばれる仕組みを用いている
- 一つのIPアドレスで複数のVirtualHostを受け付けているので
proxy_ssl_server_name
,proxy_ssl_name
は必須。 - あと何故かSSLv3で通信しようとしていたので
proxy_ssl_protocols
も必要。
- 一つのIPアドレスで複数のVirtualHostを受け付けているので
- API Gatewayはhttpsで公開されていた
-
proxy_set_header
相手はHostヘッダでどのapiにつなげばいいか判断しているので、きちんと埋めてあげること。
おわりに
もしかしたら2,3個省いてもいい構文があるかもしれません。これで接続しました、記事書いてる時間すら惜しい状況下残しとくと有益そうなのでメモとして置いときます。
ネット上にhttpからhttpsはあまり例がなく、上記のマルチスペクトル防御シー・・すぐ変わるIPアドレスのやり方とhttp->httpsのプロクシを組み合わせたものが見つからなかった。(upstreamの構文もためしましたがIPアドレスをキャッシュしていました)