Kong Gateway で AWS Lambda を呼び出してみる

記事タイトルとURLをコピーする

こんにちは。アプリケーションサービス部の渡辺です。
最近 Kong が熱いですね!ということで Amazon API Gateway ではなく Kong Gateway を使って AWS Lambda による Web API を構築してみましょう!

Kong Gateway をローカル端末でホストして、クラウドにデプロイした Lambda 関数を呼び出してみます。

はじめに Lambda 関数をつくる

AWS Lambda - Plugin | Kong Docs の通りに進めていきます。

まずは LambdaExecutor という Lambda 関数のための IAM ロールを作成します。
ポリシーは何も指定しなくて OK です。

ユースケースは Lambda にしましょう

次に KongInvoker という IAM ユーザーを作成します。
Kong Gateway から Lambda 関数を呼び出す際にアクセスキーとシークレットアクセスキーが必要になるので、安全な場所に保存しておきましょう。

ポリシーは AWSLambdaRole を付与しておきましょう

最後に Lambda 関数を作成します。

ロールは先ほど作成した LambdaExecutor にしましょう

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 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 が登録されたことを確認できます

lambda1 という名前の 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 からもプラグインが登録されたことを確認できます

AWS Lambda プラグインが有効になっている

動作確認

それでは動作確認してみましょう!
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 全体における魅力的な様々な価値を提供してくれています。

本記事が皆さんの何かの役に立てば幸いです!
読んでくださりありがとうございました!

渡辺 隼人 (記事一覧)

アプリケーションサービス部 ディベロップメントサービス1課

音楽と猫ちゃんが好き