API Management ツールの Kong を触ってみた

こんにちは。エクセルソフトの田淵です。

今回は API Management ツールの Kong を Docker で動かしてみます。
Dockerについては、弊社ページUbuntuにインストールしたエントリー などをご参照ください。

2017/6/12 時点での最新バージョン 0.10.x の情報です。バージョンアップにより、仕様が変わる場合があります。

Kong インストール

最初にユーザー情報やキャッシュ情報などが記録される Kong 用のデータベースを準備します。

casandora の場合

$ docker run -d --name kong-database \
  -p 9042:9042 \
  cassandra:3

PostgreSQL の場合

$ docker run -d --name kong-database \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  postgres:9.4

Kong は次のコマンドで起動できます。KONG_DATABASE を使用しているデータベースに合わせ casandorapostgres を指定します。

$ docker run -d --name kong \
  --link kong-database:kong-database \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  -e "KONG_PG_HOST=kong-database" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  -p 7946:7946 \
  -p 7946:7946/udp \
  kong:latest

API を登録する

コンソールから HTTP アクセスするには通常 curl を使用すると思いますが、HTTPie を使用すると楽です。HTTPie については Qiitaにエントリー をアップしました。以降は両方のコマンドを記載していきます。

API 登録は Admin API に対して POST することで実行していきます。Add API のリファレンスは Admin API – v0.10.x | Kong を参照してください。

http

$ http POST http://localhost:8001/apis name=test uris=/test upstream_url=http://httpbin.org

curl

$ curl -i -X POST \
  --url http://localhost:8001/apis/ \
  --data 'name=test' \
  --data 'uris=/test' \
  --data 'upstream_url=http://httpbin.org'

次のような JSON が帰ってくれば成功です。

HTTP/1.1 201 Created
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Date: Fri, 09 Jun 2017 08:29:38 GMT
Server: kong/0.10.3
Transfer-Encoding: chunked

{
  "created_at": 1496996979000,
  "http_if_terminated": true,
  "https_only": false,
  "id": "aff18f8e-564c-4029-8af7-72fd98d42db3",
  "name": "test",
  "preserve_host": false,
  "retries": 5,
  "strip_uri": true,
  "upstream_connect_timeout": 60000,
  "upstream_read_timeout": 60000,
  "upstream_send_timeout": 60000,
  "upstream_url": "http://httpbin.org",
  "uris": [
  "/test"
  ]
}

API が作成されたので、クライアントからアクセスしてみましょう。httpbin.org をそのまま転送しているため、http://localhost:8000/testhttp://httpbin.org と同じ結果を返します。httpbin.org/get?data=value にアクセスするように Kong にアクセスしてみましょう。

http

$ http http://localhost:8000/test/get?data=value

curl

$ curl -i -X GET \
  --url http://localhost:8000/test/get?data=value

次のような JSON 結果が返ってくれば成功です。

HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 303
Content-Type: application/json
Date: Fri, 09 Jun 2017 09:02:59 GMT
Server: meinheld/0.6.1
Via: kong/0.10.3
X-Kong-Proxy-Latency: 41
X-Kong-Upstream-Latency: 355
X-Powered-By: Flask
X-Processed-Time: 0.000751972198486

{
  "args": {
  "data": "value"
  },
  "headers": {
  "Accept": "*/*",
  "Accept-Encoding": "gzip, deflate",
  "Connection": "close",
  "Host": "httpbin.org",
  "User-Agent": "HTTPie/0.9.2"
  },
  "origin": "172.17.0.1, XXX.XXX.XXX.XXX",
  "url": "http://httpbin.org/get?data=value"
}

Header 情報にある Via: kong/0.10.3 と戻り値の JSON にある "origin": "172.17.0.1, XXX.XXX.XXX.XXX" で正しく Kong を経由して http://httpbin.org/get?data=value にアクセスしていることが分かります。

ここで戻り値の

X-Kong-Proxy-Latency: 40
X-Kong-Upstream-Latency: 347

に注意しておいてください。

同じ URL にもう一度アクセスしてみましょう。

X-Kong-Proxy-Latency: 0
X-Kong-Upstream-Latency: 370

今度は Kong がキャッシュしているので Kong のレイテンシーが 0 になっているのが分かります。

まとめ/次のステップ

Kong を使用して API を Forward して提供できることが分かりました。次は各種プラグインを使用して認証やアクセス制御などを行ってみます。

試してみてください

KONG評価版の他にもOSS版があります。OSS版はAPI ManagementのみでAnalyticsやDeveloper Portalの機能とサポートがありませんが、まず触ってみたいという場合はおすすめです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする