AI Search のカスタムスキルで Azure Functions を呼び出す際、マネージド ID で認証する方法について
はじめに
Azure AI Search サービスのカスタムスキル機能を使い、Azure Function App の Web API スキルを呼び出すことができます。
スキルセット内のカスタム Web API スキル - Azure AI Search | Microsoft Learn
そこでキーではなく、システムマネージド ID に RBAC 権限を付与して認証する方法をご案内致します。
設定不備の際、発生するエラーの例
Web Api response status: 'Forbidden', Web Api response details
手順
既に Web API を利用するスキルセットが用意されている前提で、それぞれのリソースごとに設定方法をご案内致します。
Function App
関数アプリを開き、「認証」ブレードから「ID プロバイダー」のリンクを押下し、下記画像の通り ID プロバーダーのリンクをクリックします。
「API の公開」ブレードを開きますと「アプリケーション ID URI」があり、こちらを記録して頂いて
後で Azure AI Search のWebAPI スキルの「authResourceId」としてご利用ください。
AI Search
スキルセットにまだ WebAPI スキルが実装されていなければ、以下のページから抜粋して頂きます。
Bing Entity Search API を使用したカスタム スキルの例 - Azure AI Search | Microsoft Learn
スキルを以下の様に修正します。
① uri の「?code」以降を消します。
② uri の下に authResourceId を追加して、appId には上の Function App の手順で取得した ID を入れます。
"authResourceId" :"api://<appId>"
スキルセット内のカスタム Web API スキル - Azure AI Search | Microsoft Learn
③ inputs の内容などは Function App に実装して頂いたプログラムに合わせて適宜変更してください。
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"description": "Our new Bing entity search custom skill",
"uri": "https://[your-entity-search-app-name].azurewebsites.net/api/EntitySearch",
"authResourceId" :"api://<appId>"
"context": "/document",
"inputs": [
{
"name": "name",
"source": "/document/content"
}
],
"outputs": [
{
"name": "description",
"targetName": "description"
}
]
}
上述の手順で、Azure AI Search からマネージド ID を用いて Function App の Web API スキルを利用することができます。
エンタープライズアプリケーション(オプション)
以下も必要に応じてご参考になる点があれば幸いです。
まず以下の手順に従い、Azure AI Search 側の ID を表現する「エンタープライズ アプリケーション」の「アプリケーション ID」 をメモしておきます。
Azure AI Search の ID → システム割り当て済み → オブジェクト(プリンシパル) ID をコピーします。
コピーした ID をAzure ポータルの検索ボックスに入力し、「Microsoft Entra ID で検索を続行してください」をクリックします。
概要のページに以下の様にテナント ID での検索が行われますので、
「エンタープライズ アプリケーション」で Azure AI Search のリソース名で表示されたアプリをクリックします。
「アプリケーション ID」を取得します。
関数アプリを開き、「認証」ブレードから、「ID プロバイダー」の「編集」リンクを押下します。
「許可されたクライアント アプリケーション」において、鉛筆マークを押下して、上でメモしておいた、
Azure AI Search 側の アプリケーション ID をここに追加し、保存をします。
解決できなかった場合(オプション)
詳細な原因調査のトラブルシューティングは弊社サポート窓口へご連絡いただけますと幸いですが、多くの場合、
Function App で Entra ID 認証(EasyAuth)を行いつつ、かつ、対象の Function App 内の関数でも関数レベルの認証を行う形で二重の認証が用意され、
上述の手順で EasyAuth 側の認証は通っていたものの、関数レベルの認証に失敗している可能性がございます。
関連する内容は以下のページをご参照ください。
■ 関数のアクセスキー
Azure Functions のセキュリティ保護 | Microsoft Learn
■ 承認レベル
Azure Functions の HTTP トリガー | Microsoft Learn
そのため、以下のいずれかの対処策を実施頂き、事象が改善できるかご確認をお願い致します。
A 案) Function App の各関数で関数レベルの認証を無効化する
既に Function App で Entra ID 認証を実施しているため、二重での認証となる関数レベルの認証は無効化することで回避する方法となります。
(今回の投稿でご案内させて頂いたのは A 案を前提にご案内させて頂きました。)
具体的には、開発するに VS Code などで Python v1 モデル・v2 モデルを使用する場合と、Azure ポータルで開発する場合それぞれ以下の手順をご参照ください。
Function App を VS Code 等で開発されている場合は、Function App の Python プロジェクトで
Python v1 モデルの場合は各関数の function.json で authLevel を functions -> anonymous にして頂き、
Azure Functions の Python 開発者向けリファレンス | Microsoft Learn
Python v2 モデルの場合は各関数のコード上で http_auth_level を func.AuthLevel.FUNCTION から func.AuthLevel.ANONYMOUS に変更をお願いします。
Azure Functions の Python 開発者向けリファレンス | Microsoft Learn
ポータルで開発されている場合は、Function App リソースの「概要」ページにて、各関数へのリンクをクリックし、
各関数の functions.json を開き、authLevel をfunction -> anonymous に変更をお願い致します。
B 案) 関数レベルの認証も通るようにAI Search 呼び出し時のURL を更新する
Function App で Entra ID 認証を実施しているため不要ではあると思いますが、もし Function App の関数側でも認証を残されたい場合は、
Function App を呼び出す際に関数の認証キーも付与するように URL を変更いただければと思います。
具体的には、関数の認証キーも付与した (関数を呼び出すための) URL は下記のドキュメントに記載の手順で手に入れることができるため、
該当のアクセス キーを URL のクエリ文字列として付与していただく形になります。
例) 下記赤枠の uri を「https://document-search-test-customskill.azurewebsites.net/api/file2txt?code=<関数キー>」といた形式に変更いただければと存じます。(当初消して頂くように案内した部分です。)
関数キー>
関連する内容は以下のドキュメントをご参照ください。
■ 関数のアクセスキーを取得する
Azure Functions でアクセス キーを操作する | Microsoft Learn
■ アクセスキーの承認
Azure Functions の HTTP トリガー | Microsoft Learn
アクセス キーを付与した URL は Function App リソースの関数のリンクから
「関数URL の取得」を選択しても得られますので、よろしければそちらもご活用ください。
上述の対応で正常に認証が行えない場合は、より具体的な調査が必要になるため弊社サポート窓口へご連絡ください。
以上、Azure AI Search サービスのカスタムスキル機能を使い、Azure Function App の Web API スキルを呼び出す際、マネージド ID で認証する手順を紹介いたしました。
2025 年 02 月 26 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。