API Management ツールの Kong にプラグインを設定する

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

ずいぶん時間が空いてしまいましたが、前回は Docker で Kong を起動し、基本的な設定をする ところまでをやりました。

今回はプラグインをいくつか追加してみたいと思います。

本家の英語ドキュメントは こちら です。

前提

前回までで Kong をインストールし、http://httpbin.org に転送する API http://localhost:8000/test を作成してある状態です。

key-auth プラグイン

作成済みの API にユーザー認証によるアクセス制限を追加します。

[code language=”bash”]
curl -i -X POST \
–url http://localhost:8001/apis/test/plugins/ \
–data ‘name=key-auth’
[/code]

今回のように /test/plugins/ として、API 別に Plugin を追加することも可能ですし、グローバルに追加することも可能です。

もう一度、同じ API にアクセスしてみます。

[code lang=bash]
curl -i -X GET \
–url http://localhost:8000/test/get?data=value
[/code]

今度は以下のように認証エラーが返ってきました。

[code lang=bash]
HTTP/1.1 401 Unauthorized
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Date: Wed, 07 Mar 2018 11:50:04 GMT
Server: kong/0.12.2
Transfer-Encoding: chunked
WWW-Authenticate: Key realm="kong"

{
"message": "No API key found in request"
}
[/code]

正しく Plugin が動作していることが分かりましたので、アクセスできるユーザーを追加します。

[code lang=bash]
curl -i -X POST \
–url http://localhost:8001/consumers/ \
–data "username=Jason"
[/code]

Jason さんが追加されました。

[code lang=bash]
HTTP/1.1 201 Created
Content-Type: application/json
Connection: keep-alive

{
"username": "Jason",
"created_at": 1428555626000,
"id": "bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"
}
[/code]

そのまま Jason に対して API Key を発行します。

[code lang=bash]
curl -i -X POST \
–url http://localhost:8001/consumers/Jason/key-auth/ \
–data 'key=ENTER_KEY_HERE'
[/code]

これで、この APIKEY を header に付与することで、最初の API にアクセスできるようになりました。

再度アクセスしてみます。

[code lang=bash]
curl -i -X GET \
–url http://localhost:8000/test/get?data=value \
–header "apikey: ENTER_KEY_HERE"
[/code]

次の結果が返ってきて、無事アクセスできたことが分かります。

[code lang=bash]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 440
Connection: keep-alive
Server: meinheld/0.6.1
Date: Wed, 07 Mar 2018 12:29:18 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0
Via: kong/0.12.2
X-Kong-Upstream-Latency: 157
X-Kong-Proxy-Latency: 26

{
"args": {
"data": "value"
},
"headers": {
"Accept": "*/*",
"Apikey": "ENTER_KEY_HERE", # <- Apikey のヘッダー
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0",
"X-Consumer-Id": "0eb28a3c-4c43-4dd8-9471-ea3005ec72fb",
"X-Consumer-Username": "Jason", # <- Consumer のヘッダー
"X-Forwarded-Host": "XXX.XXX.XXX.XXX"
},
"origin": "XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX",
"url": "http://localhost/get?data=value"
}
[/code]

Rate Limit プラグイン

Plugin 名は rate-limiting とし、今回は秒単位で 1回、分単位で 5回の制限を掛けてみます。

[code lang=bash]
curl -i -X POST \
–url http://localhost:8001/apis/test/plugins \
–data "name=rate-limiting" \
–data "config.second=1" \
–data "config.minute=5"
[/code]

エンドポイントにアクセスします。1 秒以内に 2回、または 1分以内に 6回アクセスすると拒否されるはずですので、例えば以下のコマンドを 2行分一気に貼り付けたりしてみましょう。

[code lang=bash]
curl -i -X GET –url "http://localhost:8000/test/get?data=value1&data=value2" –header "apikey: ENTER_KEY_HERE"
curl -i -X GET –url "http://localhost:8000/test/get?data=value1&data=value2" –header "apikey: ENTER_KEY_HERE"
[/code]

1秒間に 2回アクセスすると、次のような JSON が返ってきて、1秒内の制限に引っ掛かっていますが、1分内には残り 2回アクセスできることが分かります。

[code lang=bash]
HTTP/1.1 429
Date: Thu, 08 Mar 2018 07:06:06 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-RateLimit-Limit-second: 1
X-RateLimit-Remaining-second: 0
X-RateLimit-Limit-minute: 5
X-RateLimit-Remaining-minute: 2
Server: kong/0.12.2

{"message":"API rate limit exceeded"}
[/code]

consumer_id などと組み合わせることで柔軟な制限を指定できます。

以上です。次はもう少し高度なプラグインを触ってみましょう。

タイトルとURLをコピーしました