こんにちは、ゲームソリューショングループの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サーバにアクセスしてみた」ことを記事にしました。
どなたかの参考になると幸いです。