Kong Gatewayを使う際、ネットワークの制約などでGatewayとエンドポイントのサービスを直接繋ぐ事ができないことがあると思う。
こういったネットワークの制約を解消するには一般的にはProxyを挟むことで解決するが、Kong Gatewayの場合でもEnterprise Editionを利用している場合はProxyを利用する事が出来る。
ここではForward Proxy Advancedプラグインを使って、Proxy経由でのアクセス方法を確認してみる。
Kong Gatewayを自PCに立てて、そこからEC2上に立てたProxy経由で奥にいるnginxにアクセスする。
準備
Kong Gatewayの用意
今回はEnterprise Editionで検証するため、最初にライセンスファイルを環境変数に格納する。
export KONG_LICENSE_DATA=$(cat license.json)
Kong Gatewayで利用するネットワークを作成する。
docker network create kong-net
Kong Gatewayで利用するDB(Postgres)を立てる。
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kongpass" \
postgres:13
DBを初期化する。
docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PASSWORD=test" \
kong/kong-gateway:3.7.1.2 kong migrations bootstrap
Kong Gatewayを起動する。
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" -e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-e KONG_LICENSE_DATA \
-p 8000:8000 \
-p 8001:8001 \
-p 8002:8002 \
kong/kong-gateway:3.7.1.2
Proxyの用意
squidのコンテナを使ってサクッと立てる。
squidを起動するEC2のインスタンスにログインし、設定ファイルを作成する。
cat <<EOF > ./squid.conf
http_port 3128
http_access allow all
EOF
squidを起動する。
docker run -d --name squid \
-v ./squid.conf:/etc/squid/squid.conf \
-e TZ="Asia/Tokyo" -p 3128:3128 \
ubuntu/squid
nginxの用意
こちらもコンテナでサクッと作成する。
nginxを起動するEC2のインスタンスにログインし、nginxを起動する。
docker run -d --name nginx -p 80:80 nginx
起動後、ローカルPCからProxy経由で接続できることを確認する。
NGINX_HOST=http://172.31.78.82
PROXY_HOST=xx.xx.xx.xx:3128
curl -k $NGINX_HOST -x $PROXY_HOST
問題なければnginxのHTMLが取得できる。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
:(省略)
検証
検証を行うにあたり、ServiceとRouteを作成する。
最初にServiceを作成する。宛先は先ほど作成したnginxを指定する。
curl -X POST http://localhost:8001/services/ \
--data name=nginx-service \
--data url=$NGINX_HOST
次にRouteを作成する。
curl -X POST http://localhost:8001/services/nginx-service/routes \
--data name=nginx-route \
--data 'paths[]=/nginx'
このタイミングではRouteに対してcurlを実行しても、nginxにアクセス出来ないためコマンドが帰ってこない。
$ curl localhost:8000/nginx
次にRouteに対してForward Proxy Advanced Pluginの設定を行う。
ここではKong Managerから設定する。
RouteからNew Pluginを選択し、Forward Proxyを選択する。
次に設定画面でProxyの設定を行う。
ここではHttp Proxy Host
とHttp Proxy Port
のみ設定した。
HTTPSを使う場合はHttps部分の設定も併せて行う。
また、View Advanced Parameters
の方にユーザ名とパスワードを入力するボックスも用意されているので、認証が必要な場合はそちらも併せて設定する。
設定後、Routeに対してアクセスしてみる。
$ curl localhost:8000/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
:(省略)
無事取得する事ができた。
以上より、アクセスにProxyが要求される環境でも、このプラグインを使えば簡単にKong Gatewayを利用できることが確認できた。