こんにちは。アプリケーションサービス部の渡辺です。
最近 Kong が熱いですね!ということで Amazon API Gateway ではなく Kong Gateway を使って AWS Lambda による Web API を構築してみましょう!
Kong Gateway をローカル端末でホストして、クラウドにデプロイした Lambda 関数を呼び出してみます。
はじめに Lambda 関数をつくる
AWS Lambda - Plugin | Kong Docs の通りに進めていきます。
まずは LambdaExecutor
という Lambda 関数のための IAM ロールを作成します。
ポリシーは何も指定しなくて OK です。
次に KongInvoker
という IAM ユーザーを作成します。
Kong Gateway から Lambda 関数を呼び出す際にアクセスキーとシークレットアクセスキーが必要になるので、安全な場所に保存しておきましょう。
最後に Lambda 関数を作成します。
handler の処理は Kong Docs にならって以下にしましょう。
import json def lambda_handler(event, context): """ If is_proxy_integration is set to true : jsonbody='''{"statusCode": 200, "body": {"response": "yes"}}''' """ jsonbody='''{"response": "yes"}''' return json.loads(jsonbody)
Kong をローカル端末でホストする
Get Kong - Kong Gateway - v3.7.x | Kong Docs を参考に進めてみます。
ローカル端末に Docker と curl がインストールされていることを前提としています。
curl -Ls https://get.konghq.com/quickstart | bash
Kong Gateway の quickstart スクリプトを実行し、 Kong Gateway とそれのバックエンドとして PostgreSQL の Docker コンテナを起動します。
以下のような表示がされたら準備 OK です。
• Deploying Kong Gateway to Docker... ℹ Debugging info logged to: /tmp/kong/quickstart/kong-quickstart.log ⏲︎ Downloading Docker images... ✔ ⏲︎ Destroying previous kong-quickstart containers... ✔ ⏲︎ Starting database... ✔ ⏲︎ Starting Kong Gateway... ✔ ⏲︎ Validating kong state... ✔ 🐵 Kong Gateway Ready 🐵 # 以下略
localhost:8002 にアクセスすることで Kong Manager も確認できるでしょう。
Kong Gateway に Lambda 関数を登録
Kong Gateway に route を登録しましょう。
API Gateway で言うところのリソース定義に似ていますね。(筆者の感想)
curl -i -X POST http://localhost:8001/routes \ --data 'name=lambda1' \ --data 'paths[1]=/lambda1'
以下のような 201 レスポンスが返ってきたら OK です。
HTTP/1.1 201 Created Date: Mon, 01 Jul 2024 12:24:07 GMT # 以下略
Kong Manager からも route が登録されたことを確認できます
最後に Kong Gateway のプラグインを追加して Lambda 関数の呼び出しに対応させましょう
このプラグインによる拡張よって Kong Gateway はさまざまなユースケースに対応することができます 🎉
# {値} には作成したリソースの適切な値を入れてください curl -i -X POST http://localhost:8001/routes/lambda1/plugins \ --data 'name=aws-lambda' \ --data-urlencode 'config.aws_key={KongInvoker ユーザー key}' \ --data-urlencode 'config.aws_secret={KongInvoker ユーザー secret}' \ --data 'config.aws_region={Lambda 関数を作成した region}' \ --data 'config.function_name={作成した Lambda 関数の名前}'
以下のような 201 レスポンスが返ってきたら OK です。
HTTP/1.1 201 Created Date: Mon, 01 Jul 2024 12:34:46 GMT # 以下略
Kong Manager からもプラグインが登録されたことを確認できます
動作確認
それでは動作確認してみましょう!
Kong Gateway をローカル端末で起動しているのでエンドポイントは http://localhost:8000/lambda1
です。
curl -i http://localhost:8000/lambda1 # こんな感じでレスポンスが返ってくれば OK HTTP/1.1 200 OK Content-Type: application/json Connection: keep-alive x-amzn-Remapped-Content-Length: 0 X-Amzn-Trace-Id: root=1-6682a3bb-4615047f3d4b7ced6d26d59f;parent=06a73030ca4b6f40;sampled=0;lineage=415e2471:0 X-Amz-Executed-Version: $LATEST Via: kong/3.7.0.0-enterprise-edition x-amzn-RequestId: 5bf4d26f-cd5b-41a0-9060-3189dadd99a3 Date: Mon, 01 Jul 2024 12:40:27 GMT X-Amz-Log-Result: U1RBUlQgUmVxdWVzdElkOiA1YmY0ZDI2Zi1jZDViLTQxYTAtOTA2MC0zMTg5ZGFkZDk5YTMgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiA1YmY0ZDI2Zi1jZDViLTQxYTAtOTA2MC0zMTg5ZGFkZDk5YTMKUkVQT1JUIFJlcXVlc3RJZDogNWJmNGQyNmYtY2Q1Yi00MWEwLTkwNjAtMzE4OWRhZGQ5OWEzCUR1cmF0aW9uOiAxLjUxIG1zCUJpbGxlZCBEdXJhdGlvbjogMiBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogMzQgTUIJCg== Content-Length: 18 X-Kong-Response-Latency: 1 X-Kong-Request-Id: 7dd8da2087ae2b29fec43b7dd60cc854 {"response":"yes"}
まとめ
ローカル端末でホストした Kong Gateway と Lambda 関数で Web API を作成することができました。
ではプロダクション運用ではどうなのでしょう?
Kong Gateway は Kubernetes の Helm chart や SaaS 型の Dedicated Cloud Gateways などの方法で利用することができます。
今回はローカルで動作させてみることを目標にやってみましたが、プロダクション運用を考えるとさまざまな選択肢があってうれしいですね!
また記載できませんでしたが、パフォーマンスやプラグインによる拡張性のメリットなどなど Kong Gateway 並びに Kong のエコシステムは API 全体における魅力的な様々な価値を提供してくれています。
本記事が皆さんの何かの役に立てば幸いです!
読んでくださりありがとうございました!