オープンソースのAPIゲートウェイ「Kong」レビュー

ここ1、2年でWeb APIを提供する企業はもちろん、それを活用した企業提携などが増えてきました。新しいWebサービスであればWeb APIを提供しないケースのが少ないくらいで、APIファーストと言った言葉も生まれています。

そんな中、次に問題になるのがWeb APIの管理です。既存システムの中に作り込んでいく、モノシリックな方法もあるでしょうが、今回はWeb APIを切り離して提供することでシステムの疎結合やマイクロサービス化を実現できるKongを紹介します。

Kongについて

KongはオープンソースのAPIゲートウェイで、簡単にWeb APIを構築して本体サイトとのプロキシとして動作します。また、認証を行ったり、CORSやSSLなどの認証、トラフィックコントロール、解析や監視といった機能をプラグインで提供します。

Kong - Open-Source API Management and Microservice Management

インストールについて

インストール方法は各種ありますが、試用する上で最も簡単なのはDockerを使った方法です。まず最初にcassandraをインストールします。PostgreSQLを利用することもできます。

// Cassandraの場合

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


// PosgreSQLの場合

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

そしてKongをインストールします。以下はCassandraの例ですが、PostgreSQLの場合はKONG_DATABASEをpostgresにします。

$ docker run -d --name kong \
              --link kong-database:kong-database \
              -e "KONG_DATABASE=cassandra" \
              -p 8000:8000 \
              -p 8443:8443 \
              -p 8001:8001 \
              -p 7946:7946 \
              -p 7946:7946/udp \
              --security-opt seccomp:unconfined \
              mashape/kong

これでKongが立ち上がっています。他にもHerokuや各種Linuxディストリビューション向けにインストールできます。

使ってみる

では実際に試してみます。最初にWeb APIを作ります。以下は http://mockbin.com/ へのアクセスを行う Web APIです。

curl -i -X POST \
  --url http://192.168.99.100:8001/apis/ \
  --data 'name=mockbin' \
  --data 'upstream_url=http://mockbin.com/' \
  --data 'request_host=mockbin.com'

返却値は次のようになります。Web APIができあがりました。

{
    "created_at": 147195273100, 
    "id": "f07dfa94-3d92-4689-a660-752ddbed7758", 
    "name": "mockbin", 
    "preserve_host": false, 
    "request_host": "mockbin.com", 
    "strip_request_path": false, 
    "upstream_url": "http://mockbin.com/"
}

では実際にWeb APIにアクセスしてみます。アクセスはGETです。

curl -i -X GET \
  --url http://192.168.99.100:8000/ \
  --header 'Host: mockbin.com'

そうすると実際に http://mockbin.com/ へアクセスした結果のHTMLが返ってきます。

キー認証を有効にする

次にキー認証(key-auth)を有効にしてみます。

curl -i -X POST \
  --url http://192.168.99.100:8001/apis/mockbin/plugins/ \
  --data 'name=key-auth'

結果は次のようになります。

{
    "api_id": "f07dfa94-3d92-4689-a660-752ddbed7758", 
    "config": {
        "hide_credentials": false, 
        "key_names": [
            "apikey"
        ]
    }, 
    "created_at": 1471952956000, 
    "enabled": true, 
    "id": "9d7a4df6-f7ef-4580-97ef-c1f1950e4631", 
    "name": "key-auth"
}

では先ほどと同じようにWeb APIにアクセスしてみます。

$ curl -i -X GET \
  --url http://192.168.99.100:8000/ \
  --header 'Host: mockbin.com'  
HTTP/1.1 401 Unauthorized
Date: Tue, 23 Aug 2016 11:49:57 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
WWW-Authenticate: Key realm="kong"
Server: kong/0.9.0
{"message":"No API key found in headers or querystring"}
となり、Web APIキーが求められるようになりました。このように簡単な操作でWeb APIへのアクセスを制限できるようになります。

クライアントを作成する

ではアクセスするためにクライアントを作成してみます。まずユーザを作成します。

curl -i -X POST \
  --url http://192.168.99.100:8001/consumers/ \
  --data "username=Jason"
  :
{
    "created_at": 1471953051000, 
    "id": "f029ce6a-cb67-4ed6-9bea-ae742292b042",
    "username": "Jason"
}

ユーザを作成したら、そのユーザに合わせたキーを作成します。キーの文字列は自由です。

curl -i -X POST \
  --url http://192.168.99.100:8001/consumers/Jason/key-auth/ \
  --data 'key=ENTER_KEY_HERE'
  :
{
    "consumer_id": "f029ce6a-cb67-4ed6-9bea-ae742292b042", 
    "created_at": 1471953091000, 
    "id": "9dc1cb77-d97c-4a2f-8909-f3102ba094f4", 
    "key": "ENTER_KEY_HERE"
}

このようにしてキー認証ができるようになりました。では実際にアクセスしてみます。

curl -i -X GET \
  --url http://192.168.99.100:8000 \
  --header "Host: mockbin.com" \
  --header "apikey: ENTER_KEY_HERE"

ヘッダーにキーを追加した結果、先ほどと同じようにWeb APIへアクセスできるようになりました。


KongはAPIゲートウェイなので、実際にアクセスする仕組みは別途開発する必要があります。ただし、元々のWebサービス側に認証の仕組みを用意していない場合(メディアサイトなど)、Web APIがパブリックにアクセスされてしまうと制御できずにサーバに過剰な負荷がかかる可能性があります。そうした時にアクセスを適切に制御できるAPIゲートウェイが役立ちます。

Kongは各種機能をプラグインで追加できるので、Web APIのニーズに合わせたカスタマイズが自由にできます。Web APIを有効に活用していく中でも役立つソフトウェアではないでしょうか。

Kong - Open-Source API Management and Microservice Management