Apache APISIX でサーバーレス API を管理する

Bobur Umurzokov

Bobur Umurzokov

January 18, 2023

Technology

サーバーレスコンピューティングは、開発者がインフラストラクチャの管理を必要とせずにアプリケーションを迅速に構築できるようにします。クラウド内のサーバーレスAPIを使用すると、クラウドサービスプロバイダーがコードを実行するために必要なインフラストラクチャを自動的にプロビジョニング、スケーリング、および管理します。この記事では、Apache APISIX API GatewayAzure Functionsと統合して、JavaベースのサーバーレスAPIを管理する方法を学びます。

学習目標

この記事を通じて、以下のことを学びます:

  • サーバーレスAPIとは何か?
  • 複雑なサーバーレスAPIトラフィックを管理するためのAPIゲートウェイの役割。
  • Apache APISIX Gatewayのセットアップ方法。
  • Azure Functionsを使用してサーバーレスAPIを構築する方法。
  • サーバーレスAPIをアップストリームサービスとして公開する方法。
  • APISIX認証プラグインを使用してサーバーレスAPIを保護する方法。
  • レート制限ポリシーを適用する方法。

Apache APISIXは、AWS Lambdaなどの他のサーバーレスソリューションと使用できる追加のプラグインを提供しています。

チュートリアルの実践的な部分に入る前に、いくつかの概念を確認しましょう。

サーバーレスAPIとは?

サーバーレスAPIは、従来のAPIと同じですが、サーバーレスバックエンドを利用しています。ビジネスや開発者にとって、サーバーレスコンピューティングは、サーバーのメンテナンスやスケーリングを心配する必要がなくなることを意味します。また、サーバーレスAPIは、リクエストが行われるたびにサーバーリソースを作成するため、スケーリングの問題を回避します。サーバーレスAPIは、オリジンサーバー上でホストされるため、レイテンシを削減します。最後に、サーバーレスコンピューティングは、マイクロサービスを構築するなどの従来の方法よりもはるかにコスト効率が高いです。

Azure Functionsを使用したサーバーレスAPI

Azure Functionは、クラウド内で小さなコードを実行する簡単な方法です。そのコードをホストするためのインフラストラクチャを心配する必要はありません。C#、Java、JavaScript、PowerShell、Python、またはサポートされている言語リストにある任意の言語でFunctionを記述できます。

Azure Functionsを使用すると、Webフレームワークの頭痛を伴わずに、WebアプリのHTTP APIを迅速に構築できます。Azure Functionsはサーバーレスであるため、HTTPエンドポイントが呼び出されたときにのみ課金されます。エンドポイントが使用されていないときは課金されません。これら2つの要素を組み合わせることで、Azure Functionsのようなサーバーレスプラットフォームは、トラフィックの予期せぬ急増が発生するAPIに理想的な選択肢となります。

サーバーレスAPIトラフィック管理のためのAPIゲートウェイ

APIゲートウェイは、サーバーレスAPIの基本的な部分です。なぜなら、定義されたAPIとそのAPIへのリクエストを処理する関数との間の接続を担当するからです。サーバーレスベースのAPIアーキテクチャにおけるAPIゲートウェイの利点は多くあります。APIゲートウェイの主要なエッジ機能(認証、レートスロットリング、可観測性、キャッシュなど)に加えて、サーバーレスAPIを呼び出しイベントをサブスクライブし、コールバックを使用して処理し、認証リクエストを外部認証サービスに転送する能力があります。

Apache APISIXデモでサーバーレスAPIを管理する

十分な理論的知識を身につけたので、実践的なセッションに移りましょう。GitHubでホストされているサンプルプロジェクトリポジトリapisix-manage-serverless-apisを使用します。このチュートリアルで使用するソースコードとサンプルのcurlコマンドを見つけることができます。

ミニプロジェクトでは、ProductReviewサービスのサーバーレスAPIをシミュレートする、Javaで書かれた2つの簡単なAzure関数を使用します。

前提条件

プロジェクトのセットアップ

まず、GitHubからプロジェクトリポジトリをクローンします:

git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git

お気に入りのコードエディタでプロジェクトフォルダを開きます。このチュートリアルではVS Codeを使用します。

Apache APISIXを実行する

Apache APISIXとAzure Functionsをローカルで実行するには、以下の手順に従います:

新しいターミナルウィンドウを開き、プロジェクトのルートフォルダからdocker compose upコマンドを実行します:

docker compose up -d

上記のコマンドは、Apache APISIXとetcdをDockerと一緒に実行します。例えば、Dockerデスクトップがマシンにインストールされている場合、実行中のコンテナを確認できます:

Apisix is running on Docker

このデモではローカル環境にAPISIXをインストールしましたが、Azure Container Instanceにデプロイして実行することもできます。次のチュートリアルを参照してください。

Azure Functionsを実行する

次に、/upstreamフォルダに移動します:

mvn clean install mvn azure-functions:run

2つの関数がターミナルウィンドウで起動します。ブラウザで両方のサーバーレスAPIをリクエストできます:

例えば:

Products Serverless API

Reviews Serverless API

Azure Functionsをデプロイする

次に、以下のコマンドを実行して関数コードをAzure Function Appにデプロイします:

mvn azure-functions:deploy

または、関数プロジェクトをAzureにデプロイする方法に関するこのチュートリアルに従うこともできます。

関数アプリ名は、artifactIdに基づいてランダムに生成され、ランダムに生成された番号が追加されます。チュートリアルのコマンドでは、関数アプリ名serverless-apisが言及されています。

関数が動作することを確認するために、ブラウザで直接URLをリクエストして呼び出しをテストできます:

https://serverless-apis.azurewebsites.net/api/products https://serverless-apis.azurewebsites.net/api/reviews

APISIXでサーバーレスAPIを公開する

セットアップが完了したら、APISIXでサーバーレスAzure関数APIをアップストリームサービスとして公開します。そのためには、productsreviewsのサーバーレスバックエンドAPIに対して、azure-functionプラグインを有効にした新しいRouteを作成する必要があります。

azure-functionプラグインがルートで有効になっている場合、APISIXはそのルートのパスでリクエストをリッスンし、そのリクエストからのパラメータを使用してリモートのAzure Functionコードを呼び出します。

Productsのルートを作成する

Products関数のルートを作成するには、以下のコマンドを実行します:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false } }, "uri": "/products" }'

デモの目的で、azure-functionsプラグインのssl_verify属性をfalseに設定して、SSL検証を無効にしています。APISIXからAzure Functionsへのより安全なリクエストを実行するために、これを有効にすることもできます。他の設定パラメータを学ぶことができます。

curlリクエストでテストする

curlを使用してリクエストを送信し、APISIXがパスを正しくリッスンし、リクエストをアップストリームサービスに正常に転送するかどうかを確認できます:

curl -i -XGET http://127.0.0.1:9080/products HTTP/1.1 200 OK [ { "id": 1, "name": "Product1", "description": "Description1" }, { "id": 2, "name": "Product2", "description": "Description2" } ]

素晴らしい!Azure Function上の実際のサーバーレスAPIから応答を得ました。

次に、reviews関数に対して同様の設定を行います。

Reviewsのルートを作成してテストする

Azure Functionプラグインを有効にした2番目のルートを作成します:

curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false } }, "uri": "/reviews" }'

サーバーレスAPIの応答をテストします:

curl -i -XGET http://127.0.0.1:9080/reviews

このセクションでは、新しいルートを導入し、サーバーレスAPIにazure-functionsプラグインを追加して、APISIXがリモートのAzure Functionsを呼び出し、トラフィックを管理できるようにしました。次のセクションでは、APIコンシューマーを認証し、レート制限などのランタイムポリシーを適用する方法を学びます。

APISIX認証プラグインでサーバーレスAPIを保護する

これまで、サーバーレスAPIは公開されており、未承認のユーザーがアクセス可能でした。このセクションでは、認証機能を有効にして、未承認のリクエストをサーバーレスAPIに許可しないようにします。

Apache APISIXは、APIリクエストに関連付けられたIDをクレデンシャルとトークンの検証を通じて確認できます。また、APIを通過してバックエンドサービスに到達するトラフィックを決定する能力もあります。利用可能なすべての認証プラグインを確認できます。

サーバーレスAPIの新しいコンシューマーを作成し、既存のルートにbasic-authプラグインを追加して、許可されたユーザーのみがアクセスできるようにします。

サーバーレスAPIの新しいコンシューマーを作成する

以下のコマンドは、ユーザー名とパスワードなどのクレデンシャルを持つ新しいコンシューマーを作成します:

curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "username": "consumer1", "plugins": { "basic-auth": { "username": "username1", "password": "password1" } } }'

既存のProductsとServicesルートにbasic authプラグインを追加する

次に、ルートにbasic-authプラグインを設定して、APIが呼び出されるたびにAPISIXがAPIコンシューマーのクレデンシャルを含むリクエストヘッダーをチェックするようにします:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {} }, "uri": "/products" }'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false }, "basic-auth": {} }, "uri": "/reviews" }'

basic authプラグインをテストする

ユーザー認証情報をヘッダーに含めずにサーバーレスAPIをリクエストすると、未承認エラーが返されます:

curl -i http://127.0.0.1:9080/products HTTP/1.1 401 Unauthorized {"message":"Missing authorization in request"}

期待通りです。しかし、正しいユーザー認証情報をリクエストに含めて同じエンドポイントにアクセスすると、正常に動作します:

curl -i -u username1:password1 http://127.0.0.1:9080/products HTTP/1.1 200 OK

Apache APISIXの助けを借りて、基本的な認証プラグインを使用してサーバーレスAPIをリクエストしようとするクライアントのIDを検証しました。

サーバーレスAPIにレート制限ポリシーを適用する

このセクションでは、スロットリングポリシーを適用してサーバーレスAPIを悪用から保護します。Apache APISIX Gatewayでは、レート制限を適用して着信コールの数を制限できます。

レート制限ポリシーを適用してテストする

ProductsとReviews関数の既存のルート設定を選択して、limit-countプラグインを使用してレート制限ポリシーを適用し、APIの異常な使用から保護します。APIコンシューマーごとに60秒間に2回のAPIコールを制限します。

既存のProductsルートにlimit-countプラグインを有効にするには、Jsonルート設定のplugins属性にプラグインを追加する必要があります:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {}, "limit-count": { "count": 2, "time_window": 60, "rejected_code": 403, "rejected_msg": "Requests are too frequent, please try again later." } }, "uri": "/products" }'

Apache APISIXは、最初の2つのリクエストを通常通り処理します。しかし、同じ期間内の3番目のリクエストは、カスタムエラーメッセージとともに403 HTTP Forbiddenコードを返します:

HTTP/1.1 403 Forbidden {"error_msg":"Requests are too frequent, please try again later."}

次のステップ

この記事では、Azure FunctionsとApache APISIX Gatewayを使用してJavaベースのサーバーレスAPIを作成し、APIをアップストリームサービスとして公開し、適切に保護し、リクエスト数を制限するためのレート制限を適用する方法を段階的に学びました。これにより、APIゲートウェイとサーバーレスAPIの統合の他のユースケースへの扉が開かれます。

APISIX Gatewayの他の機能を探求し、さまざまな組み込みプラグインをチェーンしてリクエストを変換し、サーバーレスAPIの可用性、パフォーマンス、使用状況を監視し、API応答をキャッシュし、APIのバージョン管理によってさらに進化させることができます。これにより、開発時間の短縮、スケーラビリティの向上、コスト削減が可能になります。

Apache APISIXは完全にオープンソースのAPIゲートウェイソリューションです。サーバーレスAPIのためのより高度なAPI管理機能が必要な場合は、APISIXを基盤とするAPI7 EnterpriseまたはAPI7 Cloudを使用できます。

関連リソース

推奨コンテンツ

Tags: