Azure API Managementのバックエンドプール

このエントリは2024/01/24現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。

Azure API Management (以下、APIM) のバックエンドで、負荷分散できるようにバックエンドプールを構成できるようになった。2024/01/24現在Public Previewで、v2でも利用できる。

バックエンドは以下のドキュメントに記載がある。

API Management のバックエンド / Backends in API Management
https://learn.microsoft.com/azure/api-management/backends

バックエンドプール

バックエンドで親子関係を作る。親子関係を構成するバックエンドは以下のように設定する。Poolの下にPoolを配置できないので注意。

  • 親: properties.typePool
  • 子: properties.typeSingle(従来のバックエンドと同じ)

APIMでは、親バックエンドをset-backend-serviceポリシーでバックエンドサービスとして指定する。これにより、APIMはPoolの要素であるバックエンドをラウンドロビンで呼び出すことができる。

例えば、Azure OpenAI Service (以下AOAI) のTPMを稼ぐために、複数リージョンに作成したAOAIインスタンスへ負荷分散する、というTipsがある。この場合、L7 Load Balancerを使うか、APIMのポリシーを駆使して負荷分散ロジックを構成する必要があった。しかしながらこの機能が入ったことで、L7 Load Balancerが不要になるケースが出てくる(Preview時点ではラウンドロビンのみサポート)。

設定にあたっては、現時点ではBicep、ARM、もしくはREST APIのみ利用でき、バージョンは2023-05-01-preview以後を使う必要がある(CLIやPowerShellにはコマンドがなく、Portalにも固有の設定ページはない)。

Backend
https://learn.microsoft.com/rest/api/apimanagement/backend?view=rest-apimanagement-2023-05-01-preview
Microsoft.ApiManagement service/backends 2023-05-01-preview
https://learn.microsoft.com/azure/templates/microsoft.apimanagement/2023-05-01-preview/service/backends

設定例

例えば、以下のようなバックエンドサービスをプールとして構成することを考える。

  • <URL1>/api/test
  • <URL2>/api/test

APIフロントエンドは以下のように設定しておく。

<APIMのURL>/suffix/foo

この場合、バックエンドの呼び出しURLは、Inboundセクションで変更しない限り以下のようになる。

<URL1 or URL2>/api/test/foo

まず、プールの要素となるバックエンドを構成する(説明のため、test1を代表例とし、properties.credentialsなどは省略)。以下のJSONをREST APIに投げ込んでバックエンドを作成する。

{
    "type": "Microsoft.ApiManagement/service/backends",
    "apiVersion": "2023-05-01-preview",
    "name": "test1",
    "properties": {
        "description": "backend (test1)",
        "type": "Single"
        "protocol": "http",
        "url": "<URL1>/api/test"
    }
}

test2についても同様に構成する。

そしてバックエンドプールを構成する。バックエンドプールのURLは必須ではあるが意味がないので、この例ではlocalhostを指定している。通常のバックエンドと同様、REST APIに投げ込んでおく。

{
    "type": "Microsoft.ApiManagement/service/backends",
    "apiVersion": "2023-05-01-preview",
    "name": "backendPool",
    "properties": {
        "description": "Load balanced backends",
        "type": "Pool",
        "protocol": "http",
        "url": "http://localhost",
        "pool": {
            "services": [
                {
                    "id": "/backends/test1"
                },
                {
                    "id": "/backends/test2"
                }
            ]
        }
    }
}

これでおしまい。あとはトレースで動作確認すれば、ラウンドロビンで負荷分散していることがわかる。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください