Apache APISIX 与 Azure Serverless 的集成

API7.ai

December 1, 2021

Ecosystem

Apache APISIXのAzure Serverlessとの統合

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を設定および作成する方法を実践的に説明します。

  1. まず、Microsoft Azureにサインアップ/サインインし、試用プランを設定します。Azure Functionsは、100万回の呼び出しまで無料です。価格の詳細については、こちらをご覧ください。

  2. Azureポータルにアクセスします(AzureサービスはWebポータル、CLI、VSCodeからアクセスできます。ユーザーフレンドリーさを考慮して、ここではWebを使用します)。

    1. まず、作成するFaaSを論理的に分割するためにリソースグループを作成します。リソースグループの作成
    2. 任意のURLで関数アプリを作成します(ここではtest-apisixを選択します)。関数アプリの作成
  3. VSCodeエディタにAzure Functions拡張機能をインストールします。インストール後、拡張機能を介して認証し、ローカル開発用のAzure Functions Core Toolsをインストールします:

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
    
  4. 作成した関数アプリに以下のスニペットを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.yamlenable_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_uristring必須n/an/aサーバーレス関数コードをトリガーするAzure関数エンドポイント(例:http://test-apisix.azurewebsites.net/api/HttpTrigger)。
authorizationobjectオプションn/an/aクラウド関数にアクセスするための認証情報。
authorization.apikeystringオプションn/an/a認証内のフィールド。エンドポイントへのリクエストを認可するための生成されたAPIキー。
authorization.clientidstringオプションn/an/a認証内のフィールド。エンドポイントへのリクエストを認可するためのクライアントID(Azure Active Directory)。
timeoutintegerオプション3000[100,...]プロキシリクエストのタイムアウト(ミリ秒)。
ssl_verifybooleanオプションtruetrue/falseサーバーのSSL検証を有効にするかどうか。
keepalivebooleanオプションtruetrue/false将来の近い将来に同じプロキシ接続を再利用するかどうか。falseに設定すると、キープアライブを無効にし、接続を即座に閉じます。
keepalive_poolintegerオプション5[1,...]プール内の最大接続数。
keepalive_timeoutintegerオプション60000[1000,...]最大アイドルタイムアウト(ミリ秒)。

これにより、Azure FaaSの動作をタイムアウトからキープアライブプール、サーバーレスFaaSのSSL証明書の検証まで、厳密に制御する柔軟性が得られます。サーバーレスでは、サービスがイベント駆動型であり、リソースがクラウドプロバイダーによって動的に割り当てられるため、これは非常に重要です。

メタデータスキーマ

同様に、メタデータを使用して調整できるいくつかの属性があります。

名前タイプ必須デフォルト有効値説明
master_apikeystringオプション""n/aAzure関数URIにアクセスするために使用できるAPIキーシークレット。
master_clientidstringオプション""n/a関数URIを認可するために使用できるクライアントID(Active Directory)。

azure-functionsプラグインのメタデータは、認証フォールバックの機能を提供します。master_apikeymaster_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を提出して意見を共有してください。新しいプラグインの開発提案については、メーリングリストでも話し合うことができます!

Tags: