2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラクスパートナーズAdvent Calendar 2024

Day 14

API Managementで IPアドレスごとにトークンの使用を制限する。

Last updated at Posted at 2024-12-13

はじめに

自己紹介

AzureのクラウドエンジニアとしてAzure OpenAIを使用した環境の構築などを行っています。
2024年12月でエンジニア経験がちょうど1年たちました。

つくるもの

Azure API Managementを使用して、
IPアドレスごとにAzure OpenAI API トークンの使用を制限する。

エンタープライズでAzure OpenAIの利用する際に「部署ごとにトークンの利用数を制限したい」といったリクエストが今後出てくるのではと考えています。
Azure API ManagementでIPアドレスをキーとしてトークン制限を行うポリシーが設定できるということで、実際にやってみました。

対象読者

・Azure OpenAIとAPI Managementを連携して使いたい人
・Azure OpenAIの言語モデルトークンの使用量をIPアドレスで制限したい人

Azure OpenAIとは

Azure OpenAIは、MicrosoftのクラウドプラットフォームAzure上でOpenAIのAIモデルを利用できるサービスです。

Azure API Managementとは

Azure API Managementは、APIの公開、管理、保護、分析を効率化するMicrosoftのクラウドサービスです。APIの動作を制御するためにポリシーを設定することができます。

環境準備

ポリシー設定前にAzure API ManagementやAzure OpenAIを構築します。
ここは本題ではなく、公式ドキュメントあるため簡単に流れだけ紹介します。

1.Azure OpenAIのデプロイと、モデルのデプロイ

こちらの公式ドキュメントを参考にAzure OpenAIと言語モデルをデプロイしました。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/create-resource?pivots=web-portal

2024/12/13現在、このトークン制限のポリシーを使用できるのは以下の6つのモデルだけのようです。今回はgpt-4をデプロイしました。

  • gpt-3.5
  • gpt-4
  • gpt-3.5-turbo-instruct
  • text-embedding-3-large
  • text-embedding-3-small
  • text-embedding-ada-002

2.Azure API Managementのデプロイ

Azure API Managementをデプロイします。
https://learn.microsoft.com/ja-jp/azure/api-management/get-started-create-service-instance
apim.png

3.Azure API ManagementにAzure OpenAIのAPIをインポート

以下のURLを参考に作成したAzure API ManagementにAzure OpenAIのAPIをインポートしていきます。
https://learn.microsoft.com/ja-jp/azure/api-management/azure-openai-api-from-specification

APIs>Add API>Azure OpenAI Serviceを選択
APIM-AOAI.png

やろうとしていたトークンによる制限がまさかのポリシータブで簡単に設定できるようになっていました。先ほど作成したAzure OpenAIインスタンスを選択し、簡単に作成することができました。
APIM-AOAI2.png

APIのインポートが完了しました。リクエストURLに記載する必要のあるdeployment-id,api-versionのvalueを入力します。
APIM-AOAI3.png

4.APIのテスト

APIから応答がちゃんと帰ってくるかテストします。

Creates a completion for the chat messegeの操作を選択 > テスト タブをひらきます。会話を構成するメッセージのリストを送ると、言語モデルが適切なレスポンスを返してくれる操作です。
APIM-AOAI4.png

適当なHTTPリクエストを入力し、HTTPステータス 200 OKが返ってくることを確認しました。
testok.png

ポリシーの適用確認

1.ポリシー設定を確認

現状どのようなポリシーが設定されているかを確認します。
APIインポートのときにポリシータブで設定した内容は
インポートしたAPI > All operations > Policies に設定されていました。
すべてのAPIの操作に対してIPアドレスごとのトークン制限がかかるようになっています。
policy.png

設定されていたポリシーはこちら。

<policies>
    <inbound>
        <set-backend-service id="apim-generated-policy" backend-id="xxxxx-openai-endpoint" />
        <azure-openai-token-limit tokens-per-minute="100" counter-key="@(context.Request.IpAddress)" estimate-prompt-tokens="true" />
        <authentication-managed-identity resource="https://cognitiveservices.azure.com/" />
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

ポリシーの意味を調べてみました。

  • set-backend-service
    API Management がリクエストをどのバックエンドサービスに送信するかを設定します。

  • azure-openai-token-limit
    Azure OpenAI サービスへのリクエスト数を制限します。
    tokens-per-minute="100" は、1分間あたり最大100トークンのリクエストを許可することを意味します。

  • counter-key="@(context.Request.IpAddress)"
    IPアドレスごとに制限をかけることができます。

  • estimate-prompt-tokens="true"
    プロンプトトークン数を推定して、トークン制限に反映させる設定です。

(補足)

各操作のInbound processing/Outbound processingにポリシーを設定することもできるようです。
policy2.png

Add Policyをおすと、IP制限や呼び出し制限などの設定できるポリシーを確認できます。わかりやすいですね。
policy3.png

2.IPアドレスごとにトークン制限がかかるか確認

異なるIPアドレスからリクエストを送って制限のかかり方を確認します。

22~から始まるIPアドレスからtoken limitがかかるまでリクエストを送ります。
tokenlimit2.png

13~から始まる別のIPアドレスからリクエストを直後に送り、そちらのIPでは200OKが返ってくるのを確認できました。
tokenlimit.png

(もっといいテスト方法がありそう。。。)

おわりに

API Managementは機能が多くてまだわからない部分の方が多いですがゴリゴリ触って理解を深めていきたいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?