Apache APISIX 与 Azure Serverless 的集成
API7.ai
December 1, 2021
Apache APISIXは、主要なクラウドベンダー向けのサーバーレスフレームワークのサポートを提供しています(さらに多くのベンダーが追加予定)。アプリケーションに関数URLをハードコードする代わりに、Apache APISIXはサーバーレスプラグインを有効にしたルートを定義することを推奨しています。これにより、開発者は関数URIをホットアップデートする柔軟性を得られ、さらにFaaSベンダーを別のクラウドプロバイダーに完全に変更することも容易になります。また、このアプローチにより、アプリケーションロジックから認証と認可の懸念を軽減できます。Apache APISIXは非常に強力な認証サポートを提供しており、クライアントコンシューマーが特定のルートにFaaSを介してアクセスすることを識別および認可するために使用できます。この記事では、新しく追加されたazure-functions
プラグインについて説明し、広く使用されているサーバーレスソリューションであるAzure FunctionsをApache APISIXのサーバーレススイートに統合する方法について詳しく説明します。
azure-functionsプラグインの動作原理
azure-functions
プラグインは、ユーザーがAzureのHTTP Trigger
サーバーレス関数へのアップストリームをゲートウェイURIに対して定義できるようにします。このプラグインが有効になっている場合、特定のURIへのリクエストを終了し、クライアントに代わって新しいリクエストをAzure FaaS(新しいアップストリーム)に開始します。このリクエストには、ユーザーが設定した適切な認証情報、リクエストヘッダー、リクエストボディ、パラメータ(これら3つのコンポーネントは元のリクエストから渡されます)が含まれ、レスポンスボディ、ステータスコード、ヘッダーが元のクライアントに返されます。
このプラグインは、APIキーとAzure Active Directoryを介したAzure FaaSサービスへの認証をサポートしています。
Apache APISIXでAzure Functionsを使用する方法
このプラグインの主な目的は、ルート設定で指定されたゲートウェイルートをAzure FunctionsのURIにプロキシすることです。このセクションでは、Azureクラウド上でサーバーレスHTTP Triggerを設定および作成する方法を実践的に説明します。
-
まず、Microsoft Azureにサインアップ/サインインし、試用プランを設定します。Azure Functionsは、100万回の呼び出しまで無料です。価格の詳細については、こちらをご覧ください。
-
Azureポータルにアクセスします(AzureサービスはWebポータル、CLI、VSCodeからアクセスできます。ユーザーフレンドリーさを考慮して、ここではWebを使用します)。
- まず、作成するFaaSを論理的に分割するためにリソースグループを作成します。
- 任意のURLで関数アプリを作成します(ここではtest-apisixを選択します)。
- まず、作成するFaaSを論理的に分割するためにリソースグループを作成します。
-
VSCodeエディタにAzure Functions拡張機能をインストールします。インストール後、拡張機能を介して認証し、ローカル開発用のAzure Functions Core Toolsをインストールします:
npm install -g azure-functions-core-tools@3 --unsafe-perm true
-
作成した関数アプリに以下のスニペットをVSCodeのAzure Functions拡張パネルからデプロイします:
module.exports = async function (context, req) { context.log("HTTP trigger invoked on Test-APISIX."); const name = req.query.name || (req.body && req.body.name); const responseMessage = name ? "Hello, " + name : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response."; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage, }; };
このスニペットは、クエリパラメータ(存在する場合、またはリクエストボディ)から名前を取得し、ユーザーに挨拶します。
azure-functionsプラグインの有効化
以下は、特定のルートに対してazure-functionsプラグインを有効にする方法の例です。HTTP Triggerがデプロイされ、提供準備が整っていることを前提としています。
# 特定のルートに対してプラグインを有効にする
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
"authorization": {
"apikey": "<Azure-Functionにアクセスするための生成されたAPIキー>"
}
}
},
"uri": "/azure"
}'
これで、Apache APISIXゲートウェイのURI /azure
へのリクエスト(HTTP/1.1、HTTPS、HTTP2)が前述の関数URIへのHTTP呼び出しをトリガーし、レスポンスボディとレスポンスヘッダー、レスポンスコードがクライアントにプロキシされます。例えば(ここではAzureクラウド関数はname
クエリパラメータを取り、Hello $name
を返します):
curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2
Hello, Bisakh
Apache APISIXがconfig-default.yamlでenable_http2: true
を有効にしてポート9081で実行されている場合、クライアントとAPISIXエージェント間のHTTP/2
通信はHTTP/1.1と同様にAzure FaaSにプロキシされ、レスポンスは適切なヘッダーとともにクライアントに返されます。例えば:
curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2
Hello, Bisakh
azure-functionsプラグインの無効化
プラグインを無効にするには、プラグイン設定から対応するJSON設定を削除し、適切なアップストリーム設定を追加します。Apache APISIXプラグインはホットリロードされるため、Apache APISIXを再起動する必要はありません。
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/azure",
"plugins": {},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
カスタム設定
azure-functions
プラグインを有効にして新しいルートを作成する際の最小限の設定では、function_uri
はプラグイン設定の必須属性であり、関数URLを指します。プラグインスキーマとメタデータスキーマで調整できる追加オプションが多数あります。
プラグインスキーマ
名前 | タイプ | 必須 | デフォルト | 有効値 | 説明 |
---|---|---|---|---|---|
function_uri | string | 必須 | n/a | n/a | サーバーレス関数コードをトリガーするAzure関数エンドポイント(例:http://test-apisix.azurewebsites.net/api/HttpTrigger)。 |
authorization | object | オプション | n/a | n/a | クラウド関数にアクセスするための認証情報。 |
authorization.apikey | string | オプション | n/a | n/a | 認証内のフィールド。エンドポイントへのリクエストを認可するための生成されたAPIキー。 |
authorization.clientid | string | オプション | n/a | n/a | 認証内のフィールド。エンドポイントへのリクエストを認可するためのクライアントID(Azure Active Directory)。 |
timeout | integer | オプション | 3000 | [100,...] | プロキシリクエストのタイムアウト(ミリ秒)。 |
ssl_verify | boolean | オプション | true | true/false | サーバーのSSL検証を有効にするかどうか。 |
keepalive | boolean | オプション | true | true/false | 将来の近い将来に同じプロキシ接続を再利用するかどうか。falseに設定すると、キープアライブを無効にし、接続を即座に閉じます。 |
keepalive_pool | integer | オプション | 5 | [1,...] | プール内の最大接続数。 |
keepalive_timeout | integer | オプション | 60000 | [1000,...] | 最大アイドルタイムアウト(ミリ秒)。 |
これにより、Azure FaaSの動作をタイムアウトからキープアライブプール、サーバーレスFaaSのSSL証明書の検証まで、厳密に制御する柔軟性が得られます。サーバーレスでは、サービスがイベント駆動型であり、リソースがクラウドプロバイダーによって動的に割り当てられるため、これは非常に重要です。
メタデータスキーマ
同様に、メタデータを使用して調整できるいくつかの属性があります。
名前 | タイプ | 必須 | デフォルト | 有効値 | 説明 |
---|---|---|---|---|---|
master_apikey | string | オプション | "" | n/a | Azure関数URIにアクセスするために使用できるAPIキーシークレット。 |
master_clientid | string | オプション | "" | n/a | 関数URIを認可するために使用できるクライアントID(Active Directory)。 |
azure-functions
プラグインのメタデータは、認証フォールバックの機能を提供します。master_apikey
とmaster_clientid
(Azure Active DirectoryクライアントID)を定義し、ユーザーは(オプションで)ミッションクリティカルなアプリケーション展開のためにマスターAPIキーまたはクライアントIDを定義できます。したがって、プラグイン属性内に認証情報が見つからない場合、メタデータ内の認証情報が使用されます。
相対的な優先順位は以下のとおりです:
- まず、プラグインはApache APISIXエージェントへのリクエストヘッダー内の
x-functions-key
またはx-functions-clientid
キーを探します。 - それらが見つからない場合、azure-functionsプラグインはプラグイン属性内の認証情報をチェックします。存在する場合、Azureクラウド関数に送信されるリクエストにそれぞれのヘッダーを追加します。
- プラグイン属性内に認証情報が見つからない場合、Apache APISIXはこのプラグインのメタデータ設定を取得し、マスターキーを使用します。
新しいマスターAPIキーを追加するには、以下のように更新されたメタデータを/apisix/admin/plugin_metadata
エンドポイントにリクエストします:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"master_apikey" : "<Azureマスターアクセスキー>"
}'
まとめ
azure-functions
プラグインは、Apache APISIXの2番目のサーバーレスプラグインです。他のサーバーレスプラグインも開発中であり、今後のApache APISIXリリースで紹介する予定です。興味がある場合は、ぜひissueを提出して意見を共有してください。新しいプラグインの開発提案については、メーリングリストでも話し合うことができます!