ラクスアドベントカレンダー14日目!!
最近どこかのサイトで見かけたのを機にちょっと触っているKongというミドルウェアについてのお話です。
マイクロサービスの勉強がてら、ちょっとしたツールをREST APIとして作ろうとしたとき、各サービスのAPIをまとめて管理する仕組みがほしいなぁ...と探していた時に見つけたのが、このKongでした。
Kongとは?
OSSとして開発が進められているAPI GateWayのためのミドルウェアです。
https://getkong.org/
マイクロサービスのデザインパターンである"API Gatewayパターン"では、クライアントは直接サービスとやり取りせず、下図のように必ずAPI GateWayを介して接続します。
これによるメリットは、ざっと以下の通りでしょうか。
- APIの所在がすぐわかるため管理しやすい
- 複数回のAPI呼び出しを一度の呼び出しで済ませることができる
- 認証などの共通作業を一括して行える
この"API GateWayパターン"の中核となる、GateWayの役割を果たすのがKongです。
Kongを立ち上げる
今回はDockerを用いてKongを使います。
基本的に、こちらに書いてある通りで立ち上げることができます。
https://getkong.org/install/docker/?_ga=2.39172262.425030684.1513175023-410250169.1513175023
私が利用したdocker-compose.ymlはこんな感じです。
version: '2'
services:
kong_vol:
image: busybox
volumes:
- /var/lib/postgresql/data
kong-database:
image: postgres:9.4
environment:
- POSTGRES_USER=kong
- POSTGRES_DB=kong
volumes_from:
- kong_vol
kong-migration:
image: kong
depends_on:
- kong-database
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=kong-database
command: kong migrations up
kong:
image: kong:latest
depends_on:
- kong-database
- kong-migration
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=kong-database
- KONG_PG_DATABASE=kong
ports:
- "8000:8000"
- "8443:8443"
- "8001:8001"
- "8444:8444"
ただし、Kongは依存するDBが立ち上がっていないと、起動に失敗します。。。
そのため、立ち上げる時はdocker-compose up -d
を時間をおいて2回実行する必要があります。。。
(これ、なんとかならないのかな)
Kongのキホン
立ち上げ方だけではあんまりなので、使い方を簡単に。
Kongでは、管理者とそれ以外で接続ポートが分けられています。
- 8001:管理者が接続するポート
- 8444:一般ユーザがAPIリクエストを投げてくるポート
管理者は、以下に説明する通り8001ポートにリクエストを送ることで、Kongの設定や操作を行うことができます。(これらのポートは設定で変更することも可能です。)
Kongを使う
Kongへの操作はAPIで行うことができます。
詳しくは公式ドキュメントをご覧ください。ここでは代表的なもののみ紹介します。
https://getkong.org/docs/0.11.x/admin-api/
API一覧表示
登録したAPI一覧は以下のURLにHTTPリクエストをGETメソッドで送ることで取得できます。
GET:/apis/
登録されているAPIについて
API情報の取得
登録されたAPIについては以下のようなリクエストを送ることで詳細を取得できます。
GET:/apis/{name or id}
APIの登録
APIはそれぞれ以下URLに対して、リクエストパラメータを指定することで登録できます。
POST:/apis/
パラメータ | 内容 |
---|---|
name | APIの一意な名前 |
uris | APIの一意なURL。このURIが指定されたときにこのAPIが呼ばれる。 |
upstream_url | APIが呼ばれたときに実行されるAPI |
ここでのパラメータは一部です。
他にも、HTTPリクエストのメソッドを指定するためのパラメータなど様々な設定をすることができます。
APIの削除
登録したAPIの削除は以下の通りです。
DELETE:/apis/{name or id}
Kongの活用方法
Kongを触ってみてまず驚いたことは、Kongの設定や操作自体がRestの概念で出来ていることでした。
Restは知識としては知っていましたが、実際に「登録時にはPOSTでリクエスト」や、「削除時にはDELETEメソッド」などの指定方法を触ることで、知識だけでなくRestの学習ができた感じです。
私的には、今後Kongを用いたAPIアプリケーションを作成して遊んでみようと思うのですが、このそもそも、API GateWayを用いたデザインパターンでは、API GateWayがすべてを担うため、
1.API GateWayが落ちた時にすべてが不通となる
2.API GateWayがファットになる
といった問題点があります。
解決策としては、BFFを用いた機能の細分化などが挙げられるので、こちらもあわせて勉強しようと考えています。