お金をかけずにサーバーの勉強をしよう

Kongインストール(前編)

2022年12月17日

メニューへ戻る

Kongで WebAPIゲートウェイを作ります。

こんにちは。

そもそも WebAPIのゲートウェイってナンだよ?って話なんですが、開発者でない私にも分かりません。
おわり。

でも、パブリッククラウドではよく使われていて、システム内のあちこちに散在している WebAPIを提供しているサーバーの場所を一々利用者が把握せねばならんのか?という課題に対して、入口を一つに集約するという効果はあるようです。

要するに分かりやすい、と。

他には何ですかね、パブリッククラウドがそうしているか分かりませんが、HTTPSで暗号化する終端をゲートウェイサーバーにして、内部の通信は HTTPにするとか、ユーザー認証はゲートウェイサーバーで一括して行うことで、WebAPIのサーバー本体ではそれを考慮しなくて良くなるとかでしょうか。

私もこの辺の利点がよく掴めてないので、ここで作ってみようと。

というわけで、Ubuntu Server 22.04.1に Kong 3.1.1を入れます。

本家サイトはこちら。
Kong

ダウンロードの手順はこちら。
Install Kong Gateway on Ubuntu

ここで凄くハマりました。
Kongには以前 Community Editionと言われていた OSS版がありまして、ここでもそれを入れたいのですが、手順をどう見ても Enterprise Editionのインストール方法にしか見えません。

しかしダウンロードサーバーには Enterprise Editionの他に、間違いなく Community Editionっぽいパッケージが存在しているので「おかしいな〜おかしいな〜」と半日ほど調べまくっていたのですが、?!画面右!
やめてよこういうの!
Kongダウンロード手順をOSS版に変えるリンク
このリンクをクリックすると、文字通りクリッと手順が OSS版になるんですよ。
SPA技術を使っているから、URLも同じなんだなと。

サイト制作側の OSS版を隠したい意図が見え隠れしておりますが、私はやりました!


気を取り直して、OSS版のダウンロード・導入手順を見ていきます。

手順では Ubuntuの対応は Focal(20.04)までで、jammy(22.04)はまだ未対応のように見えますが、2022年12月17日時点でダウンロードサーバーの jammyのところに最新版の 3.1.1の debファイルがあるのを見つけましたので多分行けます。

導入手順として、パッケージインストールと、KongのAPTリポジトリを登録する方法の2通りが紹介されていますので、後者でやってみます。

Kongの APTリポジトリ登録です。

subro@UbuntuServer2204:~$ echo "deb [trusted=yes] https://download.konghq.com/gateway-3.x-ubuntu-$(lsb_release -sc)/ default all" | sudo tee /etc/apt/sources.list.d/kong.list
deb [trusted=yes] https://download.konghq.com/gateway-3.x-ubuntu-jammy/ default all

登録しました。

リポジトリデータベースのアップデートをします。

subro@UbuntuServer2204:~$ sudo apt-get update
〜〜〜 省略 〜〜〜

アップデートできました。

インストールします。

subro@UbuntuServer2204:~$ sudo apt install -y kong=3.1.1
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libc-dev-bin libc-devtools libc6-dev libcrypt-dev libdeflate0 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnsl-dev libtiff5 libtirpc-dev libwebp7 libxpm4 linux-libc-dev manpages-dev rpcsvc-proto
  zlib1g-dev
提案パッケージ:
  glibc-doc libgd-tools
以下のパッケージが新たにインストールされます:
  kong libc-dev-bin libc-devtools libc6-dev libcrypt-dev libdeflate0 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libnsl-dev libtiff5 libtirpc-dev libwebp7 libxpm4 linux-libc-dev manpages-dev
  rpcsvc-proto zlib1g-dev

〜〜〜 以下省略 〜〜〜

インストールできました。


手順の下の方に、Enable Kong Manager という段落があり、(yamlファイル利用に対して)データベースをデータストアに使うことにより GUI画面を使えるようになると書かれていますので、データベースを作りましょう。

データベースを使うことでクラスタを組んだ時には Kongサーバー間でデータの同期をするのにも使えるようです。
(但しEnterprise Editionの機能かも知れない)

対応しているのは、PostgreSQL 9.5以上または Apache Cassandra 2.2以上です。

しかし手順の後ろの方で「Cassandraはいずれサポートが無くなるものなので推奨しない」って書いてあります。
それなら最初から書かなければ良いのに…。
PostgreSQLにします。

PostgreSQLのインストールについては「PostgreSQLインストール」に書いています。

2022年12月17日時点での最新版、15.1がインストールされました。

Kongの手順に戻ると kong用のデータベース設定がありますので、PostgreSQLにログインしてそれをやりましょう。
ユーザー作成とデータベース作成です。
********が(PostgreSQLの)「kong」ユーザーのパスワードですので、お好きに設定して下さい。

subro@UbuntuServer2204:~$ sudo -u postgres psql
could not change directory to "/home/subro": 許可がありません
psql (15.1 (Ubuntu 15.1-1.pgdg22.04+1))
Type "help" for help.

postgres=#CREATE USER kong WITH PASSWORD '********'; CREATE DATABASE kong OWNER kong;
CREATE ROLE
CREATE DATABASE

データベースの準備はできました。


Kongの設定ファイルを作りましょう。

/etc/kong ディレクトリの下に雛形のファイルがあります。

subro@UbuntuServer2204:~$ ls -l /etc/kong
合計 112
-rw-rw-r-- 1 kong kong 106970 12月 10 08:09 kong.conf.default
-rw-rw-r-- 1 kong kong    264 12月 10 08:07 kong.logrotate

kong.conf.default ファイルをコピーして、kong.conf ファイルを作りました。
このファイルを見てみると、全行コメントアウト、かつ設定項目が多く見通しが悪いので、kong.conf は以下の通り有効にしたい行だけにしました。
********はPostgreSQLに設定したパスワードになります。
一応 GUIの Kong Manager とやらの設定もしています。

subro@UbuntuServer2204:~$ cat /etc/kong/kong.conf
database = postgres
pg_password = ********
admin_gui_path = /manager
admin_gui_url = http://UbuntuServer2204:8002/manager

この設定を有効化します。

subro@UbuntuServer2204:~$ sudo kong migrations bootstrap -c /etc/kong/kong.conf
2022/12/17 10:08:41 [warn] ulimit is currently set to "1024". For better performance set it to at least "4096" using "ulimit -n"
Bootstrapping database...
migrating core on database 'kong'...
core migrated up to: 000_base (executed)
core migrated up to: 003_100_to_110 (executed)
core migrated up to: 004_110_to_120 (executed)
core migrated up to: 005_120_to_130 (executed)
core migrated up to: 006_130_to_140 (executed)
core migrated up to: 007_140_to_150 (executed)
core migrated up to: 008_150_to_200 (executed)
core migrated up to: 009_200_to_210 (executed)
core migrated up to: 010_210_to_211 (executed)
core migrated up to: 011_212_to_213 (executed)
core migrated up to: 012_213_to_220 (executed)
core migrated up to: 013_220_to_230 (executed)
core migrated up to: 014_230_to_270 (executed)
core migrated up to: 015_270_to_280 (executed)
core migrated up to: 016_280_to_300 (executed)
core migrated up to: 017_300_to_310 (executed)
migrating acl on database 'kong'...
acl migrated up to: 000_base_acl (executed)
acl migrated up to: 002_130_to_140 (executed)
acl migrated up to: 003_200_to_210 (executed)
acl migrated up to: 004_212_to_213 (executed)
migrating acme on database 'kong'...
acme migrated up to: 000_base_acme (executed)
acme migrated up to: 001_280_to_300 (executed)
migrating basic-auth on database 'kong'...
basic-auth migrated up to: 000_base_basic_auth (executed)
basic-auth migrated up to: 002_130_to_140 (executed)
basic-auth migrated up to: 003_200_to_210 (executed)
migrating bot-detection on database 'kong'...
bot-detection migrated up to: 001_200_to_210 (executed)
migrating hmac-auth on database 'kong'...
hmac-auth migrated up to: 000_base_hmac_auth (executed)
hmac-auth migrated up to: 002_130_to_140 (executed)
hmac-auth migrated up to: 003_200_to_210 (executed)
migrating http-log on database 'kong'...
http-log migrated up to: 001_280_to_300 (executed)
migrating ip-restriction on database 'kong'...
ip-restriction migrated up to: 001_200_to_210 (executed)
migrating jwt on database 'kong'...
jwt migrated up to: 000_base_jwt (executed)
jwt migrated up to: 002_130_to_140 (executed)
jwt migrated up to: 003_200_to_210 (executed)
migrating key-auth on database 'kong'...
key-auth migrated up to: 000_base_key_auth (executed)
key-auth migrated up to: 002_130_to_140 (executed)
key-auth migrated up to: 003_200_to_210 (executed)
migrating oauth2 on database 'kong'...
oauth2 migrated up to: 000_base_oauth2 (executed)
oauth2 migrated up to: 003_130_to_140 (executed)
oauth2 migrated up to: 004_200_to_210 (executed)
oauth2 migrated up to: 005_210_to_211 (executed)
migrating post-function on database 'kong'...
post-function migrated up to: 001_280_to_300 (executed)
migrating pre-function on database 'kong'...
pre-function migrated up to: 001_280_to_300 (executed)
migrating rate-limiting on database 'kong'...
rate-limiting migrated up to: 000_base_rate_limiting (executed)
rate-limiting migrated up to: 003_10_to_112 (executed)
rate-limiting migrated up to: 004_200_to_210 (executed)
migrating response-ratelimiting on database 'kong'...
response-ratelimiting migrated up to: 000_base_response_rate_limiting (executed)
migrating session on database 'kong'...
session migrated up to: 000_base_session (executed)
session migrated up to: 001_add_ttl_index (executed)
49 migrations processed
49 executed
Database is up-to-date

特にエラーも出ませんし、これで良いんでしょうね。


手順ではこの後で Kongの起動となるんですが、パッケージインストールの際、既に systemdによって立ち上がっていますので、再起動します。

subro@UbuntuServer2204:~$ sudo systemctl restart kong.service

subro@UbuntuServer2204:~$ systemctl status kong.service
● kong.service - Kong
     Loaded: loaded (/lib/systemd/system/kong.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-12-17 10:16:30 JST; 2min 12s ago
       Docs: https://docs.konghq.com/
    Process: 7657 ExecStartPre=/usr/local/bin/kong prepare -p /usr/local/kong (code=exited, status=0/SUCCESS)
   Main PID: 7669 (nginx)
      Tasks: 5 (limit: 9365)
     Memory: 256.6M
        CPU: 1.919s
     CGroup: /system.slice/kong.service
             ├─7669 "nginx: master process /usr/local/openresty/nginx/sbin/nginx -p /usr/local/kong -c nginx.conf"
             ├─7681 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─7682 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ├─7683 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─7684 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

12月 17 10:16:30 UbuntuServer2204 systemd[1]: Starting Kong...
12月 17 10:16:30 UbuntuServer2204 systemd[1]: Started Kong.

立ち上がってるっぽい。
中の人は NGINXなんですね。


ヨシ!
ということで、おもむろに Kong Managerに WEBブラウザでアクセスしてみましょう。

こんな画面になり…ませんね。出ない。タイムアウトしました。
ssコマンドでポートの状態を見てみると、8002/tcpで LISTENしてませんわ。

何でかな〜と思ったら、Kong Managerは Enterprise Editionの FREEモード(≠OSS)で使える機能とのこと。
Stack Overflowの外国人も騙されたようです。
OSS勢の負け確定w


ところで Kongが待ち受けているIPアドレスとポートは以下の通りです。

0.0.0.0:8000ユーザーがAPIにHTTPでアクセスするところ
0.0.0.0:8443ユーザーがAPIにHTTPSでアクセスするところ
127.0.0.1:8001管理者がKongの設定をHTTPでするところ
127.0.0.1:8444管理者がKongの設定をHTTPSでするところ

設定は Ubuntu Serverにログインして行うことになりますね。

そういう訳で、ここから黒い画面での設定が始まるのでした。

Kongインストール(中編)」につづく。