Kongの基本的な機能を触って、Kong経由でEC2上のWebサーバにアクセスしてみた

2023.06.16

こんにちは、ゲームソリューショングループのsoraです。
今回は、「Kongの基本的な機能を触って、Kong経由でEC2上のWebサーバにアクセスしてみた」ことについて書いていきます。

EC2にKongをインストールして、サービス追加やルート追加などの基本的な設定や動作を確認していきます。

構成について

パブリックサブネット上でEC2にKongをインストールして、Webページ表示用のEC2にアクセスします。
Webページ表示用EC2は既にあったものを使用したため、パブリックサブネットに配置されています。
ただ、プライベートサブネットに配置しても、今回のKongの設定自体は変わらないと思います。

Kongについて

Kongとは何かについては、少し古い記事ですが以下記事をご参照ください。

Kong Gateway周りの構成としては以下の図のようになっています。
Kong公式ページより引用

  • Consumer:API呼び出しのプロキシの役割
  • Route:クライアントからのリクエストとサービスをマッチさせるためのルールを定義
    各ルートは1つのサービスに紐づけられる。1つのサービスに複数ルートを紐づけることも可能
  • Service:アップストリームサービスのAPI
  • AdminAPI:Consumer、Route、Service、Pluginの管理と設定を行う

Pluginによって、Lambdaとの接続やデータの変換など、様々な機能を導入することが可能です。

今回はOSS版を使用して、このAdminAPI経由で操作を行います。
ちなみに、AdminAPIがリッスンするデフォルトポートは8001です。

Kong用EC2の作成

公式ページを参考にして、EC2にKongをインストールします。
今回はDBレスモードで使用しないため、Kongの設定を保存するためのDBとしてPostgreSQLもインストールします。

# PostgreSQLのインストール
$ sudo amazon-linux-extras install -y postgresql14
$ sudo yum install -y postgresql-server

# PostgreSQLのデータベースクラスタの作成
$ sudo su - postgres
-bash-4.2$ initdb
-bash-4.2$ exit

# PostgreSQLの起動(と起動設定)
$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

# Kongのダウンロード/インストール
$ curl -Lo kong-enterprise-edition-3.3.0.0.aws.amd64.rpm "https://download.konghq.com/gateway-3.x-amazonlinux-2/Packages/k/kong-enterprise-edition-3.3.0.0.aws.amd64.rpm"
$ sudo yum install -y kong-enterprise-edition-3.3.0.0.aws.amd64.rpm

# Kongのconfigファイルの準備
$ sudo cp /etc/kong/kong.conf.default /etc/kong/kong.conf

# PostgreSQLへのユーザ作成、データベース作成
$ psql -U postgres
postgres=# CREATE USER kong WITH PASSWORD 'super_secret'; CREATE DATABASE kong OWNER kong;
postgres-# kong migrations bootstrap -c /etc/kong/kong.conf 
postgres-# \q

# Kongの起動
$ sudo su -
$ kong migrations bootstrap
$ kong start
Kong started

# Kongの動作確認
$ curl  http://localhost:8001/
{"version":"3.3.0.0",……}

Webページ表示用EC2の作成

Nginxなどをインストールして、アクセスしたときにWebページが表示できれば中身は何でも良いです。
今回は以下記事で作成したWebサーバを使用します。

Kongの設定

Service

まずはサービスを作成します。
AdminAPIに対して、POSTしてサービスの登録をします。

# サービスの登録
$ curl -X POST http://localhost:8001/services \
-d 'name=web-server' \
-d 'url=http://(宛先EC2のDNS名):8080/(パス)'

# 登録されているサービスの確認
$ curl http://localhost:8001/services

# (参考)サービスの削除
$ curl -X DELETE http://localhost:8001/services/(サービス名かサービスID)

Route

次にサービスに紐づくルートを作成します。
こちらも同様にAdminAPIに対して、POSTして登録します。

# ルートの作成
$ curl -X POST http://localhost:8001/services/web-server/routes \
-d 'paths[1]=/web'

# 登録されているルートの確認
$ curl http://localhost:8001/routes

# (参考)ルートの削除
$ curl -X DELETE http://localhost:8001/routes/(ルート名かルートID)

Log Level

今回の実装には不要ですが、ログレベルの設定も確認します。

# ログレベルの確認
$ curl http://localhost:8001/debug/node/log-level
{"message":"log level: notice"}

# ログレベルの変更
$ curl -X PUT http://localhost:8001/debug/node/log-level/debug
{"message":"log level changed"}

# ログレベルの確認
$ curl http://localhost:8001/debug/node/log-level
{"message":"log level: debug"}

接続してみる

準備ができたため、Kong用EC2サーバで先ほど登録したサービスにアクセスします。

$ curl http://localhost:8000/web
<h1>sora</h1>
<h2>所属</h2>
<p>営業統括本部 ゲームソリューショングループ ソリューションアーキテクト</p>     
<h2>今後ブログにしようと思っていること</h2>                                     
<ul>                                                                            
    <li>CDK(Python)で出たエラー</li>                                            
    <li>Goで色々作ってみた成果物</li>                                           
    <li>構築したことのない構成やサービスをCDKで構築</li>                        
</ul>

Kong用EC2からWebページ用EC2にアクセスすることができました。

最後に

今回は、「Kongの基本的な機能を触って、Kong経由でEC2上のWebサーバにアクセスしてみた」ことを記事にしました。
どなたかの参考になると幸いです。