Azure AI Search から Azure OpenAI Service へ可能な限りセキュアに接続したい
質問
Azure AI Search でベクトル検索を利用するために、インデクサー実行時に Azure OpenAI Embedding スキルでコンテンツをベクトル化したいです。
しかし、Azure OpenAI Service のネットワーク設定でパブリックアクセスを無効とすると、Azure OpenAI Embedding スキルが失敗します。
可能な限り Azure AI Search から Azure OpenAI Service への接続をセキュアにする方法はありますでしょうか。
インデクサーを実行すると以下のようなエラーが発生します。
メッセージ
Could not execute skill because the Web Api request failed.
詳細
Web Api response status: 'Forbidden', Web Api response details: '{"error":{"code":"403","message": "Public access is disabled. Please configure private endpoint."}}'
また、Azure OpenAI Service のパブリックアクセスを無効化せず、「選択したネットワークとプライベート エンドポイント」からのアクセスに制限している場合は以下のエラーが発生します。
メッセージ
Could not execute skill because the Web Api request failed.
詳細
Web Api response status: 'Forbidden', Web Api response details: '{"error":{"code":"403","message": "Access denied due to Virtual Network/Firewall rules."}}'
回答
現在は以下の 2 点の選択肢がございます。
それぞれ長所と短所を記載いたしましたので、ご検討いただけますと幸いです。
恐れ入りますが、2 つ目のマネージド ID を利用する方法は、Azure OpenAI Service がパブリックアクセスを無効としているとご利用することがかないませんのでご注意ください。
- Azure AI Search の Azure OpenAI Service への共有プライベートリンク経由でアクセスするように設定します。
- 長所
- Azure AI Search から Azure OpenAI Service へプライベート接続ができます。
- 手順として共有プライベートリンクの作成とインデクサーの設定を変更すればよく、管理が容易です。
- 短所
- Azure AI Search サービスの作成日、リージョン、およびスキルの構成によっては、Standard 2 以上のプランが必要となり、ご利用料金が高くなる可能性があります。詳細は後述いたします。
- プライベートエンドポイントを利用することによる料金が追加で請求されます。
- 長所
- Azure AI Search から Azure OpenAI Service に対してマネージド ID 認証を利用して接続します。
- 長所
- マネージド ID は Azure AI Search の Basic プランから利用可能であるため、共有プライベートリンクを使用する場合と比較してご利用料金は低くなります。
- 短所
- Azure AI Search から Azure OpenAI Service へのアクセスは Microsoft バックボーンネットワークを経由するため、パブリックインターネットを経由することはございませんが、プライベート接続とはなりません。
- Azure OpenAI Service 側でパブリックアクセスを無効とした場合はご利用することがかないません。
- 長所
以下に 2 つの選択肢の詳細を記載いたします。
1. Azure AI Search の Azure OpenAI Service への共有プライベートリンク経由でアクセスするように設定します。
共有プライベートリンク は、Azure AI Search から別の Azure サービスへのプライベート接続が必要な場合に利用します。
共有プライベートリンクを作成し、インデクサーでプライベート接続を利用する設定を追加するだけでご利用可能になります。また、共有プライベートリンクによって作成されるプライベートエンドポイントリソースは Microsoft で管理されるため、お客様にてプライベートエンドポイントやプライベート DNS ゾーン等を管理する必要はございません。
共有プライベートリンクの利用によって以下の構成となります。
ただし、共有プライベートリンクの前提条件 に以下の記載がございます。
ワークロード | 階層の要件 | リージョンの要件 | サービス作成の要件 |
---|---|---|---|
埋め込みスキルを含むスキルセット (垂直統合) | Basic 以上 | 大容量リージョン | 2024 年 4 月 3 日より後 |
他の組み込みまたはカスタム スキルを使うスキルセット | Standard 2 (S2) 以上 | なし | 2024 年 4 月 3 日より後 |
つまり、まとめると以下になります。
- Azure OpenAI の 埋め込みスキル以外の Azure AI サービスの組み込みスキルおよびカスタムスキルを使用しない、かつ 2024 年 4 月 3 日より後に作成された Azure AI Search サービス、かつ大容量リージョンであれば、Basic 以上のレベルで共有プライベートリンクが利用可能です。
- Azure OpenAI の 埋め込みスキル以外の Azure AI サービスの組み込みスキルを使用する、またはカスタムスキルを使用する場合、Azure AI Search サービスのレベルが Standard 2 以上である必要があります。
恐れながら、サービス作成日およびリージョンの要件があるため、例えば Basic レベルで共有プライベートリンクとAzure OpenAI の 埋め込みスキルを両立させたい場合、2024 年 4 月 3 日以前の古いリソースをご利用の場合は新しいリソースを作成し、移行することをご検討いただけますと幸いです。
あくまで参考情報となりますが、以前は Azure OpenAI Service への共有プライベートリンク経由の接続はサポートされておりませんでしたが、2024 年 1 月 16 日 にドキュメントが更新され、Azure OpenAI Service への共有プライベートリンクがプレビューでご利用可能となりました。現在は一般利用可能になっております。
サポートされているリソースの種類 の項目に以下のように記載されております。
リソースの種類 | サブリソース (またはグループ ID) |
---|---|
Microsoft.CognitiveServices/accounts | openai_account |
また、同じく参考情報となりますが、以前はスキルセットが必要な場合は Standard 2 以上のレベルの Azure AI Search サービスが必要でした。2024 年 11 月以降、上記の条件を満たせば、Basic レベルでも Azure OpenAI の埋め込みスキルをプライベート環境で実行することが可能となりました。
設定手順
以下に設定手順について参考となるドキュメントと、手順実施の際の参考情報を記載いたします。
1. 共有プライベート リンクを作成する を参考に設定します。
Azure OpenAI Service へ接続するため、以下の画像のように「リソースの種類」 は Microsoft.CognitiveServices/accounts
、「対象サブリソース」は openai_account
とします。
2. プライベート エンドポイント接続を承認する を参考に設定します。
3. 共有プライベート リンクの状態を確認する を参考に設定します。
4. プライベート環境で実行されるようにインデクサーを構成する を参考に設定します。
既にインデクサーが存在する場合は、Azure Portal より以下のように "executionEnvironment": "private"
を追記して保存いただけますと幸いです。
2. Azure AI Search から Azure OpenAI Service に対してマネージドID認証を利用して接続します。
一方で、プライベート接続はできないものの、Azure OpenAI Service のアクセス制限を構成しつつ、Azure AI Search からアクセスする方法として、マネージド ID 認証を利用する方法がございます。プライベート エンドポイントの料金がないため、共有プライベートリンクを利用する場合と比較して安くなります。
Azure OpenAI Service のドキュメントに以下の記載がございますので、参考になれば幸いです。
他のアプリのネットワーク規則を維持しながら、信頼された Azure サービスのサブセットに Azure OpenAI へのアクセス権を付与することができます。 その後、これらの信頼されたこれらのサービスでは、マネージド ID を使用して、Azure OpenAI サービスの認証が行われます。
次の表は、これらのサービスのマネージド ID に適切なロールが割り当てられている場合に Azure OpenAI にアクセスできるサービスを示しています。
(中略)
Azure AI Search
Azure OpenAI の信頼された Azure サービスへのアクセス権を付与する
以下のような構成になります。
もちろん、プライベート接続はできないものの、マイクロソフトのグローバル ネットワーク のドキュメントに記載がある通り、Microsoft のサービス間の通信はパブリックインターネットを経由することはございませんので、その点はご安心ください。
また、質問に記載の 2 番目のエラーメッセージ Access denied due to Virtual Network/Firewall rules.
を解消する方法にもなっています。
設定手順
以下に設定手順を記載いたします。
1. Azure OpenAI Service 側でネットワーク規則の例外を許可します。
Azure OpenAI の信頼された Azure サービスへのアクセス権を付与する - Azure Portal の使用 のドキュメントにしたがい、対象の Azure OpenAI Service に対してネットワーク規則の例外を作成します。
具体的には、Azure OpenAI の「ネットワーク」ブレードから、「選択したネットワークとプライベートエンドポイント」を選択し、
「Allow Azure services on the trusted services list to access this cognitive services account.」をチェックします。
以下のスクリーンショットが参考になれば幸いです。
また、Azure CLI の使用 の「Azure portal から信頼できるサービスが有効になっているかどうかを確認する」の手順にしたがい、bypass: AzureServices
となっており、ネットワーク規則の例外が設定されているか念のため確認しておきましょう。
- Azure OpenAI リソースの概要ページから [JSON ビュー] を使用します。
- [API バージョン] で最新の API バージョンを選択します。
2. Azure AI Search 側で システム マネージド ID を作成する を参考に、システム割り当てマネージドIDを有効化します。
3. Azure OpenAI Service リソースのスコープで、手順 2 で作成したシステム割り当てマネージド ID に対して「Cognitive Services OpenAI ユーザー」ロールを割り当てます。ロールの割り当て の手順をご確認ください。
必要なロールについては以下のドキュメントに記載がございます。
Azure OpenAI にテキストを送信するには、マネージド ID に Cognitive Services OpenAI ユーザー アクセス許可が必要です。
4. スキルセットで apiKey
と authIdentity
を null
にします。もし既存の定義に記載がない場合はそのままで問題ございません。
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "#1",
"description": null,
"context": "/document/pages/*",
"resourceUri": https://airesource.openai.azure.com,
"apiKey": null,
"deploymentId": "****",
以下のドキュメントにマネージド ID を利用する方法について記載がございますので、参考になれば幸いです。
Azure OpenAI に接続するために検索サービスによって使用されるユーザー マネージド ID。 システムまたはユーザーのマネージド ID を使用できます。 システム マネージド ID を使用するには、apiKey と authIdentity を空白のままにします。 システム マネージド ID が自動的に使用されます。
5. インデックスの設定で Azure OpenAI Service への接続でマネージド ID を利用するようにします。
ベクトル検索をする場合、検索文字列に対しても Azure OpenAI Service の API を利用してベクトル化する必要があります。
マネージド ID を利用する設定がインデックスにないと、検索時に以下のようなエラーが発生します。
Could not complete vectorization action. Could not reach the vectorization endpoint.
インデクサーの設定と同様に、インデックス定義の以下の部分で apiKey
と authIdentity
を null
にして保存します。
"vectorizers": [
{
"name": "vector-1706146801319-vectorizer",
"kind": "azureOpenAI",
"azureOpenAIParameters": {
"resourceUri": "https://********.openai.azure.com",
"deploymentId": "tsample",
"apiKey": null,
"authIdentity": null
},
"customWebApiParameters": null
}
]
Azure Portal では以下のように変更し、保存します。
6. インデクサーを実行しエラーなく処理が完了することと、インデックスの検索でエラーが発生しないことを確認します。
2025 年 1 月 20 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。