問題点
以下のようにリソースを構築し、Azure Web AppにデプロイしたFastAPIのアプリから、Azure AI Agent Serviceへアクセスします。
FastAPIは以下なります。
import os
from dotenv import load_dotenv
import json
import base64
import uvicorn
from fastapi import FastAPI, Request, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import timeout_decorator
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
fast_app = FastAPI()
fast_app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
# allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
load_dotenv()
PROJECT_CONNECTION_STRING = os.environ["PROJECT_CONNECTION_STRING"]
AGENT_ID = os.environ["AGENT_ID"]
# プロジェクトクライアントの作成
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=PROJECT_CONNECTION_STRING,
)
@fast_app.post("/ai")
async def route_ai_analysis(request: Request):
# 省略:Azure AI Agent Serviceのほうで質問の回答を生成し返答する処理
if __name__ == "__main__":
uvicorn.run(fast_app, host="0.0.0.0", port=8000)
ローカルでFastAPIを実行したときは問題なくて、Azureにデプロイするのも成功しましたが、
デプロイしたWebアプリにリクエストを投げてみたところ、ずっとエラーになります。。。
エラー①:認証エラー
AzureDeveloperCliCredential: Azure Developer CLI could not be found. Please visit https://aka.ms/azure-dev for installation instructions and then,once installed, authenticate to your Azure account using 'azd auth login'
「FastAPIのWebアプリ → AI Agent Service」(PythonソースコードのDefaultAzureCredential()のところ)で質問を渡すときは、azureの認証が必要となります。
ローカルでFastAPIやるときは、azure-cliのインストールやaz loginを事前に実施ずみなので、特に認証エラーがでていません。
FastAPIをAzureのWebアプリにデプロイした後、同じAzure環境内のリソースだからといって、認証が不要だと勘違いされがちですが、実は認証が必要です!!!
しかし、どうやら、Webアプリ内では azure-cli のインストールや az login の実行ができないようです。。。。
解消方法①:アプリ登録wし、アクセス情報をWebアプリの環境変数に設定
Webアプリ内にはazure-cliのインストールやaz loginを実施することができないため、別途「アプリ登録」を実施し、アプリとしての認証情報をFastAPIのWebアプリに教えてあげます。
Azureポータルで「Microsoft Entra ID」を検索
左ナビゲーションバーの「アプリの登録」をクリック
登録完了後、この画面に遷移されます。「アプリケーション (クライアント) ID
」と「ディレクトリ (テナント) ID」が認証情報なので、メモしておきます。
もう一つ「クライアントシークレット」という認証情報が必要なので、管理>証明書とシークレットをクリックし、「新しいクライアントシークレット」をクリックします。作られたシークレットをメモしておきます。
FastAPIのWebアプリの環境変数に、さきほどの認証情報を設定します。
一つ注意点として、「クライアントシークレット」は作成直後でしか見れません。時間が経つと、「クライアントシークレット」のIDである「シークレットID」しか見れなくなります。
間違えて、「シークレットID」を環境変数に設定すると、以下のエラーができしまいます。。。
Ensure the secret being sent in the request is the client secret value, not the client secret ID, for a secret added to app
エラー②:アプリの権限が足りないエラー
認証情報を設定したあと、認証エラーを突破できましたが、以下の新しいエラーが発生しました。。。
Identity does not have permissions for Microsoft.MachineLearningServices/workspaces/agents/action actions. Please refer to https://aka.ms/azureml-auth-troubleshooting to fix the permissions issue.
解消方法②で登録したアプリとして、AI Agent Serviceを操作しようとすると、捜査権限がないと怒られています!!!
解消方法②:IAMの設定
アクセス対象の「Azure AI project」を開き、左ナビゲーションバーの「アクセス制御(IAM)」をクリックします。
「Azure AI Administrator」を選択して「次へ」
「メンバーを選択する」をクリックします。次に、解消方法②で登録したアプリ名を検索し、選択します。「次へ」をクリックし、「レビューと割り当て」をクリックします。
すると、すべてのエラーが解消され、無事回答が「AI Agent Service → FastAPI → フロント」で返されました!
終わりに
初めてAzureでAI系のアプリを構築するのでいろいろ苦戦しました。。。
Webアプリの環境変数や登録アプリのロールを変更した直後に、エラーがすぐに解消されないことがあります。その場合、コンテナを再起動したり、少し時間をおいて再度試すのがおすすめです!
参考サイト