Kong GatewayをProxy経由で利用する


Kong Gatewayを使う際、ネットワークの制約などでGatewayとエンドポイントのサービスを直接繋ぐ事ができないことがあると思う。
こういったネットワークの制約を解消するには一般的にはProxyを挟むことで解決するが、Kong Gatewayの場合でもEnterprise Editionを利用している場合はProxyを利用する事が出来る。
ここでは[Forward Proxy Advanced](https://docs.konghq.com/hub/kong-inc/forward-proxy/)プラグインを使って、Proxy経由でのアクセス方法を確認してみる。

今回検証する構成は以下のようにする。
![20240822114258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/851da3af-c987-b6e4-d4f0-a57ad6da6f07.png)


Kong Gatewayを自PCに立てて、そこからEC2上に立てたProxy経由で奥にいるnginxにアクセスする。

## 準備
### Kong Gatewayの用意
今回はEnterprise Editionで検証するため、最初にライセンスファイルを環境変数に格納する。
```sh
export KONG_LICENSE_DATA=$(cat license.json)
```
Kong Gatewayで利用するネットワークを作成する。
```sh
docker network create kong-net
```
Kong Gatewayで利用するDB（Postgres）を立てる。
```sh
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を初期化する。
```sh
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を起動する。
```sh
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のインスタンスにログインし、設定ファイルを作成する。
```sh
cat <<EOF > ./squid.conf
http_port 3128
http_access allow all
EOF
```
squidを起動する。
```sh
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を起動する。
```sh
docker run -d --name nginx -p 80:80 nginx
```
起動後、ローカルPCからProxy経由で接続できることを確認する。
```sh
NGINX_HOST=http://172.31.78.82
PROXY_HOST=xx.xx.xx.xx:3128
curl -k $NGINX_HOST -x $PROXY_HOST
```
問題なければnginxのHTMLが取得できる。
```html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
：（省略）
```

## 検証
検証を行うにあたり、ServiceとRouteを作成する。
最初にServiceを作成する。宛先は先ほど作成したnginxを指定する。
```sh
curl -X POST http://localhost:8001/services/ \
  --data name=nginx-service \
  --data url=$NGINX_HOST
```
次にRouteを作成する。
```sh
curl -X POST http://localhost:8001/services/nginx-service/routes \
  --data name=nginx-route \
  --data 'paths[]=/nginx'
```
このタイミングではRouteに対してcurlを実行しても、nginxにアクセス出来ないためコマンドが帰ってこない。
```sh
$ curl localhost:8000/nginx

```

次にRouteに対してForward Proxy Advanced Pluginの設定を行う。
ここではKong Managerから設定する。
RouteからNew Pluginを選択し、Forward Proxyを選択する。
![20240822140946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/686aeacd-2bb2-3c57-81d8-3bea2a68717e.png)
次に設定画面でProxyの設定を行う。
ここでは`Http Proxy Host`と`Http Proxy Port`のみ設定した。
![20240822141158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c3d83c3e-21c9-7d9b-e2da-7a291cfed988.png)
HTTPSを使う場合はHttps部分の設定も併せて行う。
また、`View Advanced Parameters`の方にユーザ名とパスワードを入力するボックスも用意されているので、認証が必要な場合はそちらも併せて設定する。

設定後、Routeに対してアクセスしてみる。
```sh
$  curl localhost:8000/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
：（省略）
```

無事取得する事ができた。
以上より、アクセスにProxyが要求される環境でも、このプラグインを使えば簡単にKong Gatewayを利用できることが確認できた。