0
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?

エージェントをFoundry IQに接続しようとしたら 403 Forbiddenになって沼った

0
Posted at

はじめに

前回の記事ではFoundryのAIエージェントからKnowledge Baseを参照させようとしたとき沼ってしまったが、解決したのでメモ。

前回の記事

TL;DR

  • Microsoft Foundry のエージェントから Foundry IQ(Azure AI Search)のKnowledge Baseに MCP 接続しようとしたら 403 Forbidden が発生
  • RBAC ロールを色々付与したがエラー解消せず
  • 原因は 「ロールを付与していたマネージドIDが間違っていた」 こと
  • Foundryには ワークスペースプロジェクト で異なるマネージドIDが存在し、ワークスペースのマネージドIDにロールを付与していたが、接続時は Project レベルの方を使っていた
  • プロジェクトのマネージドIDにロールを付与したら解決

発生したエラー

Foundry のエージェントから知識ベースの MCP エンドポイントに接続しようとすると、以下のエラーが出た。
(MCPサーバのURLはマスキング、実際はAI SearchのURL)

Access denied when connecting to the MCP server at https://xxxxxx while enumerating tools (HTTP 403 Forbidden).

調査①:とりあえずロールを確認

「マネージドIDにロールが足りないのでは」と考え、az role assignment list で確認。

az role assignment list \
  --assignee <principalId> \
  --scope /subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Search/searchServices/<AI Searchサービス 名> \
  -o table

Search Index Data Readerはついていた。Search Index Data Contributorをつけてみたりしたけどそれでも403なのは変わらず。

(参考) AI Searchの利用に必要なロール

調査②:自分のアカウントで直接疎通確認

一応MCPエンドポイントを直接叩く

curl -X POST \
  "https://xxx.search.windows.net/knowledgebases/zzz/mcp?api-version=2025-05-01-preview" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {"name": "test-client", "version": "1.0"}
    }
  }'

200 OK で正常にハンドシェイクが成功。続けて tools/list を叩いても、ちゃんと knowledge_base_retrieve ツールが返ってきた。

エンドポイント自体・自分のアカウントの権限には問題ないので、問題は Foundry 側が使っているマネージドIDの方にありそう。

調査③:認証に使っているIDを確認する

Foundryはワークスペースとそれに連なるプロジェクトで異なるマネージドIDを持っているのだが、FoundryとAI Searchの接続の詳細を JSON で見ると以下のプロパティがあった。

{
  "authType": "ProjectManagedIdentity",
  "useWorkspaceManagedIdentity": false,
  ...
}

useWorkspaceManagedIdentity: false なので「ワークスペース側のIDではなく、プロジェクト側のIDを使う」という設定。

自分はワークスペースのIDにロールを付与し続けていたが、接続時に使っていたのはプロジェクトのIDだったので、いくら権限付与しても意味が無かった……

解決

Project レベルの Principal ID を取得。

PROJECT_PRINCIPAL_ID=$(az resource show \
  --ids /subscriptions/xxx/.../Microsoft.CognitiveServices/accounts/<account名>/projects/<project名> \
  --query identity.principalId -o tsv)

これに対して、改めて Search サービスのロール(Search Index Data Reader)を付与。

SCOPE=/subscriptions/xxx/.../searchServices/xxx

az role assignment create --assignee $PROJECT_PRINCIPAL_ID --role "Search Index Data Reader" --scope $SCOPE

数分待ってから Foundry上のエージェントにナレッジベースを検索させるプロンプトを投げたところ、エラーにならず回答が返ってきた。

おわりに

403返ってくるとつけるロールが違っているんじゃないかと思っちゃうけど、いくら強い権限漬けても解消しない場合、認証に使うIDが想定と違っているパターンを疑ったほうがよい。

MS Learnの Connect Agents to Foundry IQ Knowledge Bases には、接続を REST API で明示的に作成する手順(audience を明示指定するなど)が載っている。

ポータルのGUIで自動生成すると裏でよしなに作られるリソースもあるので、引っかかったときはGUIで格闘するよりCLIやREST APIでパラメータを明示的に指定して作り直したほうが早そう。

0
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
0
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?