エラーを潰しながら、FastAPI（Azure Web App）からAzure AI Agent Serviceへアクセスする

# 問題点
以下のようにリソースを構築し、Azure Web AppにデプロイしたFastAPIのアプリから、Azure AI Agent Serviceへアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/561f0478-53c5-4644-9f57-31711927d12e.png)

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にデプロイするのも成功しましたが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/25eb6e17-2c31-418e-b5ae-08fd97e4f9bc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/468371ad-85cb-4dcc-9aca-4dba3c418ef2.png)


デプロイしたWebアプリにリクエストを投げてみたところ、ずっとエラーになります。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/20bd1a73-470e-4507-9efa-1e3e7fdf2b4f.png)

# エラー①：認証エラー
```
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 の実行ができないようです。。。。

# 解消方法①：アプリ登録ｗし、アクセス情報をWebアプリの環境変数に設定

Webアプリ内にはazure-cliのインストールやaz loginを実施することができないため、別途「アプリ登録」を実施し、アプリとしての認証情報をFastAPIのWebアプリに教えてあげます。

Azureポータルで「Microsoft Entra ID」を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a7c6feac-ec0a-4bbd-b618-1a91f171370c.png)

左ナビゲーションバーの「アプリの登録」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/62a90fc8-4431-489e-8852-67247b0ff53a.png)

「新規登録」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/0d0c5aba-1487-4135-9d0d-62b9bf568dec.png)

デフォルトの設定で登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/50b6899a-dbcb-4b99-ae94-0fca0d246283.png)

登録完了後、この画面に遷移されます。「アプリケーション (クライアント) ID
」と「ディレクトリ (テナント) ID」が認証情報なので、メモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a90ad373-2263-4117-a563-0bbcfdd1ef47.png)

もう一つ「クライアントシークレット」という認証情報が必要なので、管理＞証明書とシークレットをクリックし、「新しいクライアントシークレット」をクリックします。作られたシークレットをメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/fad371be-4a98-4b0c-830c-157277a38d9b.png)

FastAPIのWebアプリの環境変数に、さきほどの認証情報を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/97202e5a-b511-4cc3-aa02-b60c3b43f588.png)

一つ注意点として、「クライアントシークレット」は作成直後でしか見れません。時間が経つと、「クライアントシークレット」の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）」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/b3780dfa-42d1-4256-bbce-1074eec6308a.png)

「ロールの割り当ての追加」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/3d8faa17-f3e1-4744-a991-56b31363b0e2.png)

「Azure AI Administrator」を選択して「次へ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/e1e619b7-a1e2-462d-b5f5-2fb53b4c3a71.png)


「メンバーを選択する」をクリックします。次に、解消方法②で登録したアプリ名を検索し、選択します。「次へ」をクリックし、「レビューと割り当て」をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/929f4e6e-4913-4465-aafa-cf5922ab035a.png)


すると、すべてのエラーが解消され、無事回答が「AI Agent Service → FastAPI → フロント」で返されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/f20985f1-3aca-4a5c-b7e4-af06a530544f.png)

# 終わりに

初めてAzureでAI系のアプリを構築するのでいろいろ苦戦しました。。。

Webアプリの環境変数や登録アプリのロールを変更した直後に、エラーがすぐに解消されないことがあります。その場合、コンテナを再起動したり、少し時間をおいて再度試すのがおすすめです！


# 参考サイト

https://zenn.dev/headwaters/articles/62ce9887a37b68

https://qiita.com/akiraokusawa/items/014b3a96aa949d5504dd#%E5%AE%9F%E8%A3%85%E6%89%8B%E9%A0%86%E3%81%AE%E6%A6%82%E8%A6%81