Kong KonnectのDedicated Cloud Gatewayを無料枠で試してみる

4/16にKongがDedicated Cloud Gatewayというのを[発表](https://konghq.com/blog/product-releases/dedicated-cloud-gateways)した。
これは従来はProxyとなるDataPlaneを自環境に置く必要があったのだが、Dedicate Cloud GatewayではKongのSaaS側に置くようにすることが出来るようになる。
![20240417090002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/ee2ca649-ec25-3789-0437-21ad23784766.png)
（[About Gateway Manager](https://docs.konghq.com/konnect/gateway-manager/)より引用。Hybrid contol planeが従来の構成）

機能のオフィシャルな説明は[こちら](https://docs.konghq.com/konnect/gateway-manager/dedicated-cloud-gateways/)。
Data Planeの運用をユーザがする必要がなくなるため、以下のようなメリットがありそう。
- 設計・運用不要でアップグレードも自動化される
- 設計・運用が不要なため、サービスのリリースも早く出来る
- スケールも容易なため、サービスの拡張がしやすくなる

これを試してみる。
[Konnect](https://cloud.konghq.com/)は無料枠で$500ほど割り当てられるので、この枠で頑張る。

## 必要なもの
今回の検証では以下が必要となる。
- [Konnect](https://cloud.konghq.com/)にアクセス出来る環境
- Konnectのアカウント
- クレジットカード
- [`deck` CLI](https://docs.konghq.com/deck/1.36.x/installation/)
- ドメイン

`deck`CLIは設定を流し込むのに使うが、UIで慣れてる人はなくても設定できるので必須ではない。
ドメインも今回検証で利用したが、なくてもEdgeDNSから参照できるため問題ない。
アカウントは無料で作れるので、基本的にはブラウザとクレジットカードがあれば試すことが出来る。
なお、Dedicated Cloudを使うには無料枠でもクレジットカードの登録が必須となるため、その点は注意が必要。
（検証をテンポ良く行い、検証後すぐに環境を削除すれば無料枠で収まる）

## 検証
### Dedicated Cloud Gatewayのデプロイ
Konnectにログインした後、左サイドバーの`Gateway Manager`から`New Control Plane`->`Kong Gateway`をクリック。
![20240417084455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b0bfdfad-1679-bba9-7228-5b762d6a346a.png)

Kong Gatewayの設定画面になるので、`Name`にそれっぽい名前を入れる。
証明書は今回はお試しなので用意せず、内部で自動生成されるものを使う。
`Start Your Data Plane Nodes`でDataPlaneをどこに配置するかを聞かれるので、`Dedicated Cloud Instances`を選択する。
選択すると無料枠の場合はクレジットカードの登録を求められる。
![20240417090931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/11195ea3-cfa0-090f-ee11-4578792c9011.png)
クレジットカードの情報を登録し、Kong Gatewayの設定画面に戻ると先に進めるようになるので、`I agree to the terms and conditions`にチェックを入れて`Next Step`で先に進む。

次の画面でDataPlaneの設定を行う。
![20240417091437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/74ecfac0-5539-5823-0890-b8c1786dc6f6.png)
各項目は以下の通り。

- `Select a Version`：バージョンを指定する
- `Configure Mode`：スケールのモードを指定する
  - `Autopilot`：オートスケールを有効にする
  - `Custom`：3種類のサイズの中からインスタンスの設定を選ぶ
- `Configure Cluster`：ControlPlaneの配置先を選ぶ。現状はAWSのみだが将来的にはAzure等も選べる模様。またRegionやNodeなども指定できる。
- `API Access`：APIの公開設定を選ぶ
  - `PUBLIC`：インターネット全体に公開される。セキュリティ面からテスト用途のみでの利用が推奨される。
  - `PRIVATE`：[AWS Transit Gatewayを使って公開する](https://docs.konghq.com/konnect/gateway-manager/data-plane-nodes/transit-gateways/)

ここではお試しなので、`Configure Mode`->`Custom`->`Dev / Staging`を選び、`Region`を`Tokyo`とし、それ以外はデフォルトで設定した。
なお、この際左下にコストが表示される。
![20240417093808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e63c0ee4-45d3-42c9-0a29-62b509eed17b.png)
現時点での設定では無料枠でも収まりそうだ。

`Create Cluster`をクリックしてクラスタを作成する。
しばらく作成中の画面となり、`Cloud Cluster Has Been Configured`が表示され続ける。
また、`Data Plane Nodes`にはAWS上にインスタンスが作成され、初期化中(Initializing)なのが確認できる。
![20240417094254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/a4b1a8f8-f1a8-8a5c-3297-fbdee03c2df0.png)
初期化には20分くらい掛かるので気長に待つ。
しばらくすると以下のような感じでData Planeが作成される。
![20240417101108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/010acbb6-6dfa-3261-4c69-a7d27c0ab33f.png)

次にData Planeにアクセスするためのドメインの設定をする。ここはドメインを持っていない人はスキップしてOK。
Konnectの左サイドバーの`Custom Domains`から`New Custom Domain`をクリックし、自分が持っているドメインを入力する。
例えば`hogehoge.com`を持っていて、Data Planeには`konnect-dp.hogehoge.com`でアクセスしたい場合は以下のような感じになる。
![20240417105501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/ab3fcfd3-4a6c-1522-3188-844e24373756.png)
するとCNAMEとContentが表示されるので、これをドメインレジストラ側で設定する。Route53の場合は以下のような感じになる。
![20240417105806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/9939346e-5a76-4527-ce84-d899924d8c63.png)
(自分はRoute53を使っていないので[Custom Domains](https://docs.konghq.com/konnect/reference/custom-dns/#domain-registrar-configuration)から引用）
登録後、Custom Domainsの登録したドメインのStatusが`VALID`になればOK。
![20240417105840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/8c595793-4f0a-825a-5d19-d9e78c2b1f19.png)

### 動作確認
ここではhttpbin.orgのipを表示させるURL([https://konnect-dp.hogehoge.com/ip](https://konnect-dp.hogehoge.com/ip))に行くようService,Routeを作成する。
設定は`deck`で行う。
まず、設定を`deck`で流し込むためにTokenを取得する。
Konnect上で右上の自分のアカウントをクリックし、`Personal Access Tokens`->`Generate Token`からTokenを取得し環境変数に設定する。
```sh
export KONNECT_TOKEN=kpat_ER1xxx
```
念の為接続確認する。`deck gateway ping`で以下のようなメッセージが取得できればOK。
```sh
$ deck gateway ping --konnect-token $KONNECT_TOKEN
Successfully Konnected to the demo organization!
```
`deck`で流す設定ファイルを作成する。
```yaml
cat <<EOF > ./simple.yaml
_format_version: "3.0"
_konnect:
  control_plane_name: dedicated
services:
- host: httpbin.org
  name: httpbin-ip
  path: /ip
  port: 80
  protocol: http
  routes:
  - name: ip
    paths:
    - /ip
    methods:
    - GET
EOF
```
設定をKonnect側に反映する。
```sh
deck gateway sync simple.yaml --konnect-token $KONNECT_TOKEN
```
なお、2回目以降でsyncすると、以下のようなエラーが出る。
```sh
Error: 3 errors occurred:
	while processing event: Delete sni konnect-dp.hogehoge.com failed: HTTP status 400 (message: "Entity with tag \"konnect-managed\" is immutable.")
	while processing event: Delete sni xxxxxxx.aws-ap-northeast-1.edge.gateways.konghq.com failed: HTTP status 400 (message: "Entity with tag \"konnect-managed\" is immutable.")
	while processing event: Delete sni xxxxxxx.gateways.konghq.com failed: HTTP status 400 (message: "Entity with tag \"konnect-managed\" is immutable.")
```
Konnect側で自動設定された項目で変更不可の領域があり、そこにsyncをかけたためエラーが出ているっぽいが、他の設定値は反映されるのでおそらく無視してOK。
設定反映後、[https://\<設定したドメイン\>/ip](https://<設定したドメイン>/ip)にアクセスしてみる。
```
$ curl https://konnect-dp.hogehoge.com/ip
{
  "origin": "xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx"
}
```
上記のように[https://httpbin.org/ip](https://httpbin.org/ip)にアクセスした結果と同じものが取得でき、正常にData Planeとして利用できていることが確認できる。

次にEdgeDNSからもアクセス出来ることを確認する。
Konnectの左サイドバーから`Gateway Manager`から作成したGatewayを選択しOverview画面に移動する。
その後で右上の`Connect`をクリックすると`Public Edge DNS`が表示されるので、このアドレスをコピーする。
![20240417111440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/243c60a5-e660-64ae-81e7-a34f3ab9d269.png)
ドメインでアクセスした時と同じように`curl`を叩いてみる。
```
$ curl https://xxxxxx.gateways.konghq.com/ip
{
  "origin": "xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx"
}
```
同じようにIPが取得できることが確認できる。

最後に今回の検証でかかった費用だが、5ドル程度であった。
Konnectの左サイドバーの`Plan and Usage`で確認できる。
![20240417111743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/16d70b82-081e-a06f-57b4-892dc98000fb.png)
（別件の検証で60ドル近く使っていて、441ドル残った状態で検証をスタートしている）
ということで、無事無料枠で収まった。

最後に作成したGatewayを削除すること。
![20240417111937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/61c88c4c-d939-8b38-020e-16c50a8425ff.png)

## 所感
今まではKong Gatewayを使うのにVMなりK8sなり何かしら環境を立てる作業が必要だったのが、手ぶらで構築できるようになったので管理がかなり楽になりそうだと思われる。
環境を用意するとKongだけでなくOS・インフラ側のメンテも必要になるため、その辺りがなくなるのは運用側からしたら大きなメリットだと思われる。