api
docker
ラクスDay 14

APIゲートウェイとしてKongを立ち上げる

ラクスアドベントカレンダー14日目!!

最近どこかのサイトで見かけたのを機にちょっと触っているKongというミドルウェアについてのお話です。

マイクロサービスの勉強がてら、ちょっとしたツールをREST APIとして作ろうとしたとき、各サービスのAPIをまとめて管理する仕組みがほしいなぁ...と探していた時に見つけたのが、このKongでした。

Kongとは?

OSSとして開発が進められているAPI GateWayのためのミドルウェアです。
https://getkong.org/
マイクロサービスのデザインパターンである"API Gatewayパターン"では、クライアントは直接サービスとやり取りせず、下図のように必ずAPI GateWayを介して接続します。

gw.PNG

これによるメリットは、ざっと以下の通りでしょうか。

  • APIの所在がすぐわかるため管理しやすい
  • 複数回のAPI呼び出しを一度の呼び出しで済ませることができる
  • 認証などの共通作業を一括して行える

この"API GateWayパターン"の中核となる、GateWayの役割を果たすのがKongです。

Kongを立ち上げる

今回はDockerを用いてKongを使います。
基本的に、こちらに書いてある通りで立ち上げることができます。
https://getkong.org/install/docker/?_ga=2.39172262.425030684.1513175023-410250169.1513175023

私が利用したdocker-compose.ymlはこんな感じです。

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を用いた機能の細分化などが挙げられるので、こちらもあわせて勉強しようと考えています。