私はAmazon API Gatewayを利用したことがありました。テストを行う際、そこで全て完結して便利だな程度で利用していました。
同じようなAPI GatewayにKongというものがあることを知りました。Kongとは、いろんなところに存在するAPIをKongを通じて利用できるようにする仕組み、APIプラットフォームです。
オープンソースとして公開されています。Kongがどのようなものか掴むためインストールする方法を紹介します。
Kongとは?
Kong社が2015年に公開したAPIゲートウェイと、そのプラットフォーム。
導入できる主な機能
- 認証
 - セキュリティ
 - ロギング
 - トラフィック制御
 
また、
- nginxベースにより、高速、高負荷に強い
 - プラグインを組み込みよる柔軟な拡張可能
 
等の特徴があります。
検証バージョン
Docker-compose 版を利用しました。
Docker : 2.1.0.0 (36874)
macOS : High Sierra
Docker以外 のインストールも様々用意されてます。
動作確認にむけた手順
1.一式をダウンロード、展開
2.docker-composeにてイメージビルド、コンテナ起動
$ docker-compose up -d
3.コンテナ実行
$ docker-compose exec kong ash
4.cURL にて動作確認
$ curl -i http://localhost:8001/
↓ レスポンス
HTTP/1.1 200 OK
・・・(割愛)
Kongの利用
5-minute Quickstartの案内を実行してみました。
1.コンテナ実行
$ docker-compose exec kong ash
/ # 
2.DB マイグレーション(データベース準備)( .confファイルを指定すれば、独自の構成も試せます。)
/ # kong migrations bootstrap [-c /path/to/kong.conf]
3.Kong 開始
/ # kong start [-c /path/to/kong.conf]
(停止する場合)
/ # kong stop
(リロードする場合)
/ # kong reload
KongデフォルトListenポート
- 8000 : クライアントからのHTTPトラフィック用、upstreamサービスに転送
 - 8443 : クライアントからのHTTPSトラフィック用、8000と似ているがHTTPSのみ
 - 8001 : Kong Admin API用途
 - 8444 : Kong Admin API用途、HTTPSトラフィック用
 
4.APIを追加
cURLリクエストを発行してMockbin APIをKongに追加します。
Mockbin APIについては、こちら
$ curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=example-service' \
--data 'url=http://mockbin.org'
↓ レスポンス
HTTP/1.1 201 Created
Date: Tue, 06 Aug 2019 01:35:25 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.2.1
Content-Length: 270
{
  "host":"mockbin.org",
  "created_at":1565055325,
  "connect_timeout":60000,
  "id":"62b7781c-1c5a-4094-a6d5-7a0f77946fb3",
  "protocol":"http",
  "name":"example-service",
  "read_timeout":60000,
  "port":80,"path":null,
  "updated_at":1565055325,
  "retries":5,
  "write_timeout":60000,
  "tags":null
}
5.ServiceへのRouteの追加
Route : ユーザーからのAPIアクセス先
Service : KongとマイクロサービスAPIをつなぐ機構 
 (動作イメージ) 
           【 Kong管理、設定 】
            ——————- 
[ユーザー] → [Route] → [Service] → [マイクロサービスAPI]
            ——————-
cURLで設定
$ curl -i -X POST \
--url http://localhost:8001/services/example-service/routes \
--data 'hosts[]=example.com'
↓ レスポンス
{
    "id": "0194d098-aef8-4bdc-ad20-9b5b098896ab",
    "tags": null,
    "paths": null,
    "destinations": null,
    "protocols": [
        "http",
        "https"
    ],
    "created_at": 1565056217,
    "snis": null,
    "hosts": [
        "example.com"
    ],
    "name": null,
    "preserve_host": false,
    "regex_priority": 0,
    "strip_path": true,
    "sources": null,
    "updated_at": 1565056217,
    "https_redirect_status_code": 426,
    "service": {
        "id": "62b7781c-1c5a-4094-a6d5-7a0f77946fb3"
    },
    "methods": null
}
Kongへサービスを追加、リクエストのプロキシの準備をしました。
サービスを確認する場合、
$ curl -i http://localhost:8001/services
↓ レスポンス
{
    "next": null,
    "data": [
        {
            "host": "mockbin.org",
            "created_at": 1565055325,
            "connect_timeout": 60000,
            "id": "62b7781c-1c5a-4094-a6d5-7a0f77946fb3",
            "protocol": "http",
            "name": "example-service",
            "read_timeout": 60000,
            "port": 80,
            "path": null,
            "updated_at": 1565055325,
            "retries": 5,
            "write_timeout": 60000,
            "tags": null
        }
    ]
}
6.Kong経由でリクエストの転送確認
Kongがリクエストをサービスに転送しているか確認します。デフォルトでは、ポート8000にリクエストを処理します。
$ curl -i -X GET \
--url http://localhost:8000/ \
--header 'Host: example.com'
↓ レスポンス
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 10750
Connection: keep-alive
Server: openresty/1.13.6.2
Date: Tue, 06 Aug 2019 02:34:27 GMT
Etag: W/"29fe-zRGDbSTAzeA2BElashPm2g"
Vary: Accept-Encoding
Via: kong/1.2.1
X-Kong-Upstream-Status: 200
X-Kong-Upstream-Latency: 489
X-Kong-Proxy-Latency: 741
Kong-Cloud-Request-ID: d3256aba92959ad19174c48880b708d8
・・・ (割愛)
無事、Kongにサービスを追加しました。
今回は
Kongを通じてAPI実行を5-minute Quickstartの案内で行ってみました。
構えてしまうほど難しいことはなく、サクッと進められた印象です。Docker版以外も試してみたいものです。それだけ Docker版での導入は楽ということかもしれません。
今後は KongのNext Stepに紹介されていますように ConfigファイルやCLI 、Proxy設定、Admin API等をきちんと理解してもう少し実践的なものを紹介できたらなと考えております。
ありがとうございました。
