次の方法で共有


API Management のバックエンド

適用対象: すべての API Management レベル

API Management の "バックエンド" (つまり "API バックエンド") は、フロントエンド API とその操作を実装する HTTP サービスです。

特定の API をインポートすると、API Management によって API バックエンドが自動的に構成されます。 たとえば、以下をインポートするときに、API Management によってバックエンド Web サービスが構成されます。

API Management が API バックエンドとしての使用をサポートする Azure リソースは他にもあります。その例を次に示します。

バックエンドの利点

API Management ではバックエンド エンティティがサポートされているため、API のバックエンド サービスを管理できます。 バックエンド エンティティは、バックエンド サービスに関する情報をカプセル化し、API 間での再利用性を促進し、ガバナンスを強化します。

次の 1 つ以上のバックエンドを使用します。

  • バックエンド サービスへの要求の資格情報を承認する
  • ヘッダーまたはクエリ パラメーターの認証用に名前付きの値が構成されている場合に、API Management の機能を利用して Azure Key Vault でシークレットを維持できます。
  • サーキット ブレーカー ルールを定義し、バックエンドを過剰な要求から保護します。
  • 複数のバックエンドへのルート要求または負荷分散要求

バックエンド エンティティの構成と管理は、Azure portal で、または Azure API やツールを使用して行います。

バックエンドを作成する

バックエンドは、Azure portal で作成することも、Azure API またはツールを使用して作成することもできます。

ポータルでバックエンドを作成するには:

  1. ポータルにサインインし、API Management インスタンスに移動します。
  2. 左側のメニューで、 API>Backends>+ 新しいバックエンドの作成を選択します。
  3. [ バックエンド ] ページで、次の操作を行います。
    1. バックエンドの 名前オプションの説明を入力します。
    2. バックエンド ホスティングの種類 (たとえば、関数アプリやロジック アプリなどの Azure リソースの Azure リソース、カスタム サービスのカスタム URLService Fabric クラスターなど) を選択します。
    3. [ランタイム URL] に、API 要求の転送先となるバックエンド サービスの URL を入力します。
    4. [ 詳細設定] で、必要に応じてバックエンドの証明書チェーンまたは証明書名の検証を無効にします。
    5. [ このバックエンド サービスをバックエンド プールに追加する] で、必要に応じてバックエンドの 負荷分散プール を選択または作成します。
    6. [ サーキット ブレーカー規則] で、必要に応じてバックエンドの サーキット ブレーカー を構成します。
    7. [ 承認資格情報] で、必要に応じて、バックエンドへのアクセスを承認するように資格情報を構成します。 オプションには、要求ヘッダー、クエリ パラメーター、 クライアント証明書、または API Management インスタンスで構成されたシステム割り当てマネージド ID またはユーザー割り当て マネージド ID が含まれます。
    8. を選択してを作成します。

バックエンドを作成したら、いつでもバックエンド設定を更新できます。 たとえば、サーキット ブレーカー規則を追加したり、ランタイム URL を変更したり、承認資格情報を追加したりします。

承認資格情報のマネージド ID を構成する

API Management インスタンスで構成されたシステム割り当てマネージド ID またはユーザー割り当て マネージド ID を 使用して、バックエンド サービスへのアクセスを承認できます。 承認資格情報のマネージド ID を構成するには、次の操作を行います。

  1. バックエンド構成の [承認資格情報 ] セクションで、[ マネージド ID ] タブを選択し、[ 有効] を選択します。

  2. [クライアント ID] で、インスタンスで構成されているシステム割り当て ID またはユーザー割り当て ID のいずれかを選択します。

  3. リソース ID に、ターゲットの Azure サービスまたはバックエンドを表す独自の Microsoft Entra アプリケーションのアプリケーション ID を入力します。 例: Azure OpenAI サービスの https://cognitiveservices.azure.com

    その他の例については、 認証マネージド ID ポリシーのリファレンスを 参照してください。

  4. を選択してを作成します。

注記

また、バックエンド サービスにアクセスするための適切なアクセス許可または RBAC ロールをマネージド ID に割り当てます。 たとえば、バックエンドが Azure OpenAI サービスである場合は、マネージド ID に Cognitive Services User ロールを割り当てることができます。

set-backend-service ポリシーを使用してバックエンドを参照する

バックエンドを作成したら、API でバックエンド識別子 (名前) を参照できます。 set-backend-service ポリシーを使って、受信 API 要求をバックエンドに転送します。 API 用にバックエンド Web サービスを既に構成している場合は、set-backend-service ポリシーを使って、バックエンド エンティティに要求をリダイレクトできます。 次に例を示します。

<policies>
    <inbound>
        <base />
        <set-backend-service backend-id="myBackend" />
    </inbound>
    [...]
<policies/>

注記

または、base-url を使用することもできます。 通常、形式は https://backend.com/api です。 構成ミスを防ぐため、末尾にスラッシュを追加しないでください。 通常、バックエンドの base-url と HTTP(S) エンドポイントの値は、フロントエンドとバックエンドの間のシームレスな統合を可能にするために一致する必要があります。 API Management インスタンスでは、バックエンド サービス名が base-url に追加されることに注意してください。

set-backend-service ポリシーで条件付きロジックを使用して、場所、呼び出されたゲートウェイ、またはその他の式に基づいて有効なバックエンドを変更できます。

たとえば、呼び出されたゲートウェイに基づいて別のバックエンドにトラフィックをルーティングするポリシーを次に示します。

<policies>
    <inbound>
        <base />
        <choose>
            <when condition="@(context.Deployment.Gateway.Id == "factory-gateway")">
                <set-backend-service backend-id="backend-on-prem" />
            </when>
            <when condition="@(context.Deployment.Gateway.IsManaged == false)">
                <set-backend-service backend-id="self-hosted-backend" />
            </when>
            <otherwise />
        </choose>
    </inbound>
    [...]
<policies/>

サーキット ブレーカー

API Management ではバックエンド リソースのサーキット ブレーカー プロパティが公開されており、多すぎる要求でバックエンド サービスが過負荷になるのを防ぐことができます。

  • サーキット ブレーカー プロパティを使って、サーキット ブレーカーをトリップするルールを定義します。たとえば、定義した期間中の障害状態の数や割合、障害を示す状態コードの範囲などです。
  • サーキット ブレーカーがトリップすると、API Management により、定義された期間バックエンド サービスへの要求の送信が停止され、クライアントに 503 サービス利用不可応答が返されます。
  • 構成されたトリップ期間が経過すると、サーキットはリセットされ、バックエンドに対してトラフィックが再開されます。

バックエンドのサーキット ブレーカーは、バックエンドが過負荷状態から復旧できるようにするためのサーキット ブレーカー パターンの実装です。 これにより、API Management ゲートウェイとバックエンド サービスを保護するために実装できる一般的なレート制限ポリシーとコンカレンシー制限ポリシーが強化されます。

注記

  • 現時点では、バックエンド サーキット ブレーカーは API Management の従量課金レベルではサポートされていません。
  • API Management アーキテクチャは分散型性質を持つため、サーキット ブレーカーのトリップ ルールはおおよそのものです。 ゲートウェイの異なるインスタンスは同期せず、同じインスタンスの情報に基づいてサーキット ブレーカー ルールを適用します。
  • 現在、バックエンド サーキット ブレーカーに構成できるルールは 1 つだけです。

Azure portal、API Management REST API、または Bicep または ARM テンプレートを使用して、バックエンドでサーキット ブレーカーを構成します。 次の例では、1 時間にサーバー エラーを示す 状態コードが 3 つ以上ある場合に API Management インスタンス myAPIM5xx でサーキット ブレーカーがトリップします。

この例のサーキット ブレーカーは、1 時間後にリセットされます。 応答に Retry-After ヘッダーが存在する場合、サーキット ブレーカーは値を受け入れ、指定された時間待機してからバックエンドに要求を再度送信します。

  1. Azure portal で、API Management インスタンスに移動します。
  2. 左側のメニューで、[API]>[バックエンド]> を選択し、バックエンドを選択します。
  3. バックエンド ページで、 設定>Circuit ブレーカーの設定>新規追加を選択します。
  4. [ 新しいサーキット ブレーカーの作成 ] ページで、次の規則を構成します。
    • ルール名: myBackend などのルールの名前を入力します。
    • エラー数: 「3」と入力します
    • 失敗間隔: 既定値の 1 時間のままにします。
    • エラー状態コードの範囲: 500 から 599 を選択します。
    • 乗車期間: 既定値の 1 時間のままにします。
    • HTTP 応答で 'Retry-After' ヘッダーを確認します。 True (Accept) を選択します。

負荷分散プール

API やそれらのバックエンド全体の負荷分散要求に複数のバックエンドを実装する場合、API Management ではバックエンド "プール" がサポートされます。 プールは、負荷分散のための単一のエンティティとして扱われるバックエンドのコレクションです。

バックエンド プールは、次のような場合に使用します。

  • 個々のバックエンドのサーキット ブレーカーを持つことができる複数のバックエンドに負荷を分散させます。
  • アップグレードのために、あるバックエンドのセットから別のバックエンドに負荷をシフトします (ブルーグリーン デプロイ)。

注記

  • プールには最大 30 個のバックエンドを含めることができます。
  • API Management アーキテクチャは分散型の性質を持つため、バックエンドの負荷分散はおおよそのものです。 ゲートウェイの異なるインスタンスは同期せず、同じインスタンスの情報に基づいて負荷分散を適用します。

負荷分散のオプション

API Management では、バックエンド プールに対して次の負荷分散オプションがサポートされています。

負荷分散オプション 説明
ラウンドロビン 要求は、既定でプール内のバックエンド間で均等に分散されます。
重み付け 重みはプール内のバックエンドに割り当てられ、要求は各バックエンドの相対的な重みに基づいて分散されます。 ブルーグリーンデプロイなどのシナリオに役立ちます。
優先度ベース バックエンドは優先度グループに編成されます。 要求は、優先順位の高いグループに最初に送信されます。グループ内では、要求は均等に、または割り当てられた重みに従って分散されます。

注記

サーキット ブレーカー ルールがトリップされているため、優先度の高いグループ内のすべてのバックエンドが使用できない場合にのみ、優先度の低いグループのバックエンドが使用されます。

セッションの認識

上記のいずれかの負荷分散オプションを使用して、必要に応じて セッション認識 (セッション アフィニティ) を有効にして、セッション中に特定のユーザーからのすべての要求がプール内の同じバックエンドに送信されるようにします。 API Management は、セッション状態を維持するためにセッション ID Cookie を設定します。 このオプションは、たとえば、AI チャット アシスタントや他の会話エージェントなどのバックエンドを使用して、同じセッションからの要求を同じエンドポイントにルーティングするシナリオで役立ちます。

注記

負荷分散されたプールでのセッション認識は、まず AI Gateway 早期更新グループにリリースされています。

セッション認識のための Cookie の管理

セッション認識を使用する場合、クライアントは Cookie を適切に処理する必要があります。 クライアントは、 Set-Cookie ヘッダー値を格納し、セッション状態を維持するために後続の要求と共に送信する必要があります。

API Management ポリシーを使用して、セッション認識用の Cookie を設定できます。 たとえば、Assistants API ( Azure AI Foundry Models の Azure OpenAI の機能) の場合、クライアントはセッション ID を保持し、本文からスレッド ID を抽出し、ペアを保持し、呼び出しごとに適切な Cookie を送信する必要があります。 さらに、クライアントは、Cookie を送信するタイミングまたは Cookie ヘッダーを送信しないタイミングを知る必要があります。 これらの要件は、次のポリシー例を定義することで適切に処理できます。

<policies>
  <inbound>
    <base />
    <set-backend-service backend-id="APIMBackend" />
  </inbound>
  <backend>
    <base />
  </backend>
  <outbound>
    <base />
    <set-variable name="gwSetCookie" value="@{
      var payload = context.Response.Body.As<JObject>();
      var threadId = payload["id"];
      var gwSetCookieHeaderValue = context.Request.Headers.GetValueOrDefault("SetCookie", string.Empty);
      if(!string.IsNullOrEmpty(gwSetCookieHeaderValue))
      {
        gwSetCookieHeaderValue = gwSetCookieHeaderValue + $";Path=/threads/{threadId};";
      }
      return gwSetCookieHeaderValue;
    }" />
    <set-header name="Set-Cookie" exists-action="override">
      <value>Cookie=gwSetCookieHeaderValue</value>
    </set-header>
  </outbound>
  <on-error>
    <base />
  </on-error>
</policies>

ポータル、API Management REST API、または Bicep または ARM テンプレートを使用して、バックエンド プールを構成します。 次の例では、API Management インスタンス myAPIM のバックエンド myBackendPool がバックエンド プールで構成されています。 プール内のバックエンドの例は、backend-1backend-2 という名前が付けられています。 両方のバックエンドが最も優先度の高いグループに含まれています。グループ内では、 backend-1 の方が backend-2 よりも重みが大きくなります。

  1. Azure portal で、API Management インスタンスに移動します。
  2. 左側のメニューで、[API]>[バックエンド]> を選択し、バックエンドを選択します。
  3. [バックエンド] ページ 、[ ロード バランサー ] タブを選択します。
  4. [ + 新しいプールの作成] を選択します。
  5. [ 新しい負荷分散プールの作成 ] ページで、次の操作を行います。
    • 名前: myBackendPool などのプールの名前を入力します。
    • 説明: 必要に応じて説明を入力します。
    • プールにバックエンドを追加する: プールに追加するバックエンドを 1 つ以上選択します。
    • バックエンドの重みと優先順位: プール内の各バックエンドの重みと優先度を構成するには、[ 重みと優先度のカスタマイズ ] を選択します。 たとえば、backend-1 と backend-2 という名前の 2 つのバックエンドを追加した場合は、backend-1 の重みを 3 に、backend-2 の重みを 1 に設定し、両方のバックエンドの優先順位を 1 に設定します。
    • を選択してを作成します。

制限事項

  • Developer レベルと Premium レベルの場合、ゲートウェイのエンドポイントの URL とバックエンドの URL が同じであるときに、内部仮想ネットワークにデプロイされた API Management インスタンスから HTTP 500 BackendConnectionFailure エラーがスローされることがあります。 この制限に遭遇した場合は、テクニカル コミュニティ ブログの内部仮想ネットワーク モードにおける自己連鎖 API Management 要求の制限に関する記事の手順に従ってください。
  • 現在、バックエンド サーキット ブレーカーに構成できるルールは 1 つだけです。