Microsoft Entra ID でキーレス認証を構成する
重要
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
Azure AI サービスの Azure AI モデル推論にデプロイされたモデルは、Microsoft Entra ID を使用したキーレス認証をサポートしています。 キーレス認証により、セキュリティが強化され、ユーザー エクスペリエンスが簡素化され、運用の複雑さが軽減され、最新の開発に対する堅牢なコンプライアンス サポートが提供されます。 これは、セキュリティで保護されたスケーラブルな ID 管理ソリューションを導入する組織にとって強力な選択肢となります。
この記事では、Azure AI モデル推論で、Microsoft Entra ID を推論のために構成する方法について説明します。
Azure 内のリソースのコンテキストにおけるロールを理解する
Microsoft Entra ID は、認証にロールベースのアクセス制御 (RBAC) の考え方を使用しています。 ロールは、クラウド リソースへのアクセスを管理するうえで中心的な役割を果たします。 ロールは基本的に、特定の Azure リソースに対して実行できる操作を定義するアクセス許可のコレクションです。 ユーザー、グループ、サービス プリンシパル、またはマネージド ID (総称してセキュリティ プリンシパル) にロールを割り当てることで、Azure 環境内での特定のリソースへのアクセスを制御します。
ロールを割り当てるときは、セキュリティ プリンシパル、ロールの定義、スコープを指定します。 この組み合わせはロールの割り当てと呼ばれます。 Azure AI モデルの推論は、Azure AI サービス リソースの機能であるため、その特定のリソースに割り当てられたロールによって推論のためのアクセスが制御されます。
リソースへのアクセスには次の 2 種類があります。
管理アクセス: リソースの管理に関連する操作。 通常、リソースの状態と構成を変更します。 Azure では、それらの操作はコントロール プレーン操作であり、Azure portal、Azure CLI、またはコードとしてのインフラストラクチャを使用して実行できます。 例としては、新しいモデル デプロイの作成、コンテンツ フィルタリングの構成の変更、提供されるモデルのバージョンの変更、デプロイの SKU の変更などがあります。
開発者アクセス: リソースの消費に関連する操作。 たとえば、Chat Completions API の呼び出しが挙げられます。 ただし、ユーザーはリソースの状態や構成を変更できません。
Azure では、管理操作は常に Microsoft Entra ID を使用して実行されます。 Cognitive Services 共同作成者などのロールを使用すれば、これらの操作を実行できます。 一方、開発者の操作は、アクセス キーまたは Microsoft Entra ID のどちらか、あるいはその両方を使用して実行できます。 Cognitive Services ユーザーなどのロールを使用すれば、それらの操作を実行できます。
重要
リソースへの管理者アクセス権があっても、必ずしも開発者アクセス権が付与されるわけではありません。 依然としてロールの付与による明示的なアクセス権が必要です。 これは、データベース サーバーの動作に似ています。 データベース サーバーへの管理者アクセス権があるからといって、データベース内のデータを読み取ることができるわけではありません。
Azure AI サービス リソースで Azure AI モデル推論への開発者アクセス権を構成するには、次の手順に従います。
前提条件
この記事を完了するには、以下が必要です。
Azure サブスクリプション。 GitHub モデルを使用している場合は、エクスペリエンスをアップグレードし、プロセスで Azure サブスクリプションを作成できます。 このような場合は、「GitHub モデルから Azure AI サービスの Azure AI モデル推論にアップグレードする」をお読みください。
Azure AI サービス リソース。 詳細については、「Azure AI サービス リソースを作成する」を参照してください。
管理者ロールベースのアクセス制御など、
Microsoft.Authorization/roleAssignments/write
アクセス許可およびMicrosoft.Authorization/roleAssignments/delete
アクセス許可を持つアカウント。ロールを割り当てるには、次の 3 つの要素を指定する必要があります。
- セキュリティ プリンシパル: ユーザー アカウントなど。
- ロールの定義: Cognitive Services ユーザー ロール。
- スコープ: Azure AI サービス リソース。
推論のために Microsoft Entra ID を構成する
推論のために Microsoft Entra ID を構成するには、次の手順に従います。
Azure portal に移動し、使用している Azure AI サービス リソースを見つけます。 プロジェクトまたはハブで Azure AI Foundry を使用している場合は、次の方法でそこに移動できます。
Azure AI Foundry ポータルに移動します。
ランディング ページで、[管理センターを開く] を選択します。
[接続されたリソース] セクションに移動し、構成する Azure AI サービス リソースへの接続を選択します。 一覧にない場合は、[すべて表示] を選択して完全な一覧を表示します。
[接続の詳細] セクションの [リソース] で、Azure リソースの名前を選択します。 新しいページが開きます。
これで、Azure portal に移動し、リソース自体のあらゆる側面を管理できるようになりました。
左側のナビゲーション バーで、[アクセス制御 (IAM)] を選択します。
ヒント
[自分のアクセスの表示] オプションを使用して、どのロールが既に自分に割り当てられているかを確認します。
[ロールの割り当て] を選択し、[追加]>[ロールの割り当てを追加] を選択します。
[職務権限ロール]で、「Cognitive Services ユーザー」と入力します。 ロールの一覧が絞り込まれます。
ロールを選択し、[次へ] を選択します。
[メンバー]で、アクセス権を付与するユーザーまたはグループを選択します。 セキュリティ グループの方が管理と保守が容易なので、可能な限りセキュリティ グループを使用することをお勧めします。
[次へ] を選択して、ウィザードを終了します。
選択したユーザーは、推論のために Microsoft Entra ID を使用できるようになりました。
ヒント
Azure ロールの割り当ての反映には最大で 5 分かかる場合があることに留意してください。 セキュリティ グループを使用する場合、セキュリティ グループへのユーザーの追加または削除はすぐに反映されます。
既にキーを使用できるユーザーの場合は、引き続きキーベースのアクセスが可能であることに注意してください。 キーを無効にする場合は、Azure portal の左側のナビゲーションで、[リソース管理]>[キーとエンドポイント]>[Key1 の再生成] と [Key2 の再生成] を選択します。
コードで Microsoft Entra ID を使用する
リソースで Microsoft Entra ID を構成したら、推論エンドポイントを使用するときにそれを利用できるように、コードを更新する必要があります。 次の例は、チャット入力候補モデルを使用する方法を示しています。
pip のように、パッケージ マネージャーを使用してパッケージ azure-ai-inference
をインストールします。
pip install azure-ai-inference
その後、パッケージを使用してモデルを使用できます。 次の例は、Entra ID でチャット入力候補を使用するクライアントを作成する方法を示しています。
import os
from azure.ai.inference import ChatCompletionsClient
from azure.identity import DefaultAzureCredential
client = ChatCompletionsClient(
endpoint="https://<resource>.services.ai.azure.com/models",
credential=DefaultAzureCredential(),
credential_scopes=["https://cognitiveservices.azure.com/.default"],
)
Microsoft Entra ID を使用する場合の資格情報のオプション
DefaultAzureCredential
は、Microsoft Entra ID への認証を行うための、独自の順序付けられたメカニズムのシーケンスです。 各認証メカニズムは、TokenCredential
クラスから派生したクラスであり、資格情報と呼ばれます。 実行時に、DefaultAzureCredential
は最初の資格情報を使用して認証を試みます。 その資格情報がアクセス トークンの取得に失敗した場合は、シーケンス内の次の資格情報が試みられ、正常にアクセス トークンが取得されるまでそれを続けます。 これにより、アプリは環境固有のコードを記述せずに、さまざまな環境でさまざまな資格情報を使用できます。
上記のコードをローカルの開発ワークステーション上で実行すると、環境変数内でアプリケーション サービス プリンシパルが検索されるか、ローカルにインストールされた開発者ツール (Visual Studio など) で開発者の資格情報のセットが検索されます。 どちらのアプローチも、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。
Azure にデプロイすると、この同じコードでアプリを他の Azure リソースに対して認証することもできます。
DefaultAzureCredential
では、環境設定とマネージド ID 構成を取得し、他のサービスに対して自動的に認証することができます。
ベスト プラクティス
運用環境で確定的な資格情報を使用する: 運用環境では、
DefaultAzureCredential
から次のいずれかの確定的なソリューションに移行することを強くお勧めします。-
ManagedIdentityCredential
など、特定のTokenCredential
実装。 オプションについては、派生リストを参照してください。 - アプリを実行する Azure 環境向けに最適化されている、簡素化された
ChainedTokenCredential
実装。ChainedTokenCredential
は基本的に、運用用のManagedIdentity
や開発用のVisualStudioCredential
など、使用可能な資格情報オプションの特定の許可リストを作成します。
-
可能であれば、コードが実行されている Azure リソースに対して、システム割り当てまたはユーザー割り当てのマネージド ID を構成します。 それらの特定の ID への Microsoft Entra ID アクセスを構成します。
トラブルシューティング
次の表に、Microsoft Entra ID のトラブルシューティングに役立つ複数のシナリオを示します。
エラー/シナリオ | 根本原因 | 解決策 |
---|---|---|
SDK を使用している。 | 既知の問題。 | さらにトラブルシューティングを行う前に、サービスに接続するために使用しているソフトウェアの最新バージョンをインストールすることをお勧めします。 使用しているソフトウェアの新しいバージョンでは、認証のバグが修正されている可能性があります。 |
401 Principal does not have access to API/Operation |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | 次のことを行っておきます。 1. Azure AI サービス リソースへのプリンシパルに Cognitive Services ユーザー ロールを割り当てます。 2. 少なくとも 5 分待ってから最初の呼び出しを行います。 |
401 HTTP/1.1 401 PermissionDenied |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | Azure AI サービス リソースのプリンシパルに Cognitive Services ユーザー ロールを割り当てています。 管理者や共同作成者などのロールは、推論アクセスを付与しません。 少なくとも 5 分待ってから最初の呼び出しを行います。 |
REST API 呼び出しを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 |
Authentication ヘッダーに、スコープを https://cognitiveservices.azure.com/.default に設定した有効なトークンが含まれていることを確認します。 |
AzureOpenAI クラスを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.openai.azure.com に接続されている OpenAI モデルを使用していることを確認します。
OpenAI クラス、またはサービスとしてのモデルを使用することはできません。 ご使用のモデルが OpenAI 製ではない場合、Azure AI 推論 SDK を使用します。 |
Azure AI 推論 SDK を使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.services.ai.azure.com/model に接続していること、および Entra ID の正しいスコープ (https://cognitiveservices.azure.com/.default ) を指定していることを確認します。 |
404 Not found |
使用している SDK に基づくエンドポイント URL が正しくないか、モデル デプロイが存在しません。 | 適切なエンドポイントに接続されている適切な SDK を使用していることを確認します。 1. Azure AI 推論 SDK を使用している場合は、エンドポイントが https://<resource>.services.ai.azure.com/model であり、ペイロードに model="<model-deployment-name>" が含まれているか、またはエンドポイントが https://<resource>.openai.azure.com/deployments/<model-deployment-name> であることを確認します。 AzureOpenAI クラスを使用している場合は、エンドポイントが https://<resource>.openai.azure.com であることを確認します。 |
プロジェクトで Microsoft Entra ID を使用する
リソースに Microsoft Entra ID が構成されている場合でも、プロジェクトではリソースの予測を利用するために、引き続きキーを使用している可能性があります。 Azure AI Foundry プレイグラウンドを使用する場合は、プロジェクトの接続に関連付けられた資格情報が使用されます。
この動作を変更するには、Microsoft Entra ID を使用するようにプロジェクトからの接続を更新する必要があります。 次のステップを実行します。
Azure AI Foundry ポータルに移動します。
接続を介して、Azure AI サービス リソースを使用しているプロジェクトまたはハブに移動します。
[管理センター] を選択します。
[接続されたリソース] セクションに移動し、構成する Azure AI サービス リソースへの接続を選択します。 一覧にない場合は、[すべて表示] を選択して完全な一覧を表示します。
[接続の詳細] セクションの [アクセスの詳細] の横にある編集アイコンを選択します。
[認証] で、値を Microsoft Entra ID に変更します。
[更新] を選択します。
接続が Microsoft Entra ID で動作するように構成されました。
リソースでキーベースの認証を無効にする
Microsoft Entra ID を実装し、サービスを使用するすべてのアプリケーションで互換性やフォールバックの問題に完全に対処している場合は、キーベースの認証を無効にすることをお勧めします。
重要
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
Azure AI サービスの Azure AI モデル推論にデプロイされたモデルは、Microsoft Entra ID を使用したキーレス認証をサポートしています。 キーレス認証により、セキュリティが強化され、ユーザー エクスペリエンスが簡素化され、運用の複雑さが軽減され、最新の開発に対する堅牢なコンプライアンス サポートが提供されます。 これは、セキュリティで保護されたスケーラブルな ID 管理ソリューションを導入する組織にとって強力な選択肢となります。
この記事では、Azure AI モデル推論で、Microsoft Entra ID を推論のために構成する方法について説明します。
Azure 内のリソースのコンテキストにおけるロールを理解する
Microsoft Entra ID は、認証にロールベースのアクセス制御 (RBAC) の考え方を使用しています。 ロールは、クラウド リソースへのアクセスを管理するうえで中心的な役割を果たします。 ロールは基本的に、特定の Azure リソースに対して実行できる操作を定義するアクセス許可のコレクションです。 ユーザー、グループ、サービス プリンシパル、またはマネージド ID (総称してセキュリティ プリンシパル) にロールを割り当てることで、Azure 環境内での特定のリソースへのアクセスを制御します。
ロールを割り当てるときは、セキュリティ プリンシパル、ロールの定義、スコープを指定します。 この組み合わせはロールの割り当てと呼ばれます。 Azure AI モデルの推論は、Azure AI サービス リソースの機能であるため、その特定のリソースに割り当てられたロールによって推論のためのアクセスが制御されます。
リソースへのアクセスには次の 2 種類があります。
管理アクセス: リソースの管理に関連する操作。 通常、リソースの状態と構成を変更します。 Azure では、それらの操作はコントロール プレーン操作であり、Azure portal、Azure CLI、またはコードとしてのインフラストラクチャを使用して実行できます。 例としては、新しいモデル デプロイの作成、コンテンツ フィルタリングの構成の変更、提供されるモデルのバージョンの変更、デプロイの SKU の変更などがあります。
開発者アクセス: リソースの消費に関連する操作。 たとえば、Chat Completions API の呼び出しが挙げられます。 ただし、ユーザーはリソースの状態や構成を変更できません。
Azure では、管理操作は常に Microsoft Entra ID を使用して実行されます。 Cognitive Services 共同作成者などのロールを使用すれば、これらの操作を実行できます。 一方、開発者の操作は、アクセス キーまたは Microsoft Entra ID のどちらか、あるいはその両方を使用して実行できます。 Cognitive Services ユーザーなどのロールを使用すれば、それらの操作を実行できます。
重要
リソースへの管理者アクセス権があっても、必ずしも開発者アクセス権が付与されるわけではありません。 依然としてロールの付与による明示的なアクセス権が必要です。 これは、データベース サーバーの動作に似ています。 データベース サーバーへの管理者アクセス権があるからといって、データベース内のデータを読み取ることができるわけではありません。
Azure AI サービス リソースで Azure AI モデル推論への開発者アクセス権を構成するには、次の手順に従います。
前提条件
この記事を完了するには、以下が必要です。
Azure サブスクリプション。 GitHub モデルを使用している場合は、エクスペリエンスをアップグレードし、プロセスで Azure サブスクリプションを作成できます。 このような場合は、「GitHub モデルから Azure AI サービスの Azure AI モデル推論にアップグレードする」をお読みください。
Azure AI サービス リソース。 詳細については、「Azure AI サービス リソースを作成する」を参照してください。
管理者ロールベースのアクセス制御など、
Microsoft.Authorization/roleAssignments/write
アクセス許可およびMicrosoft.Authorization/roleAssignments/delete
アクセス許可を持つアカウント。ロールを割り当てるには、次の 3 つの要素を指定する必要があります。
- セキュリティ プリンシパル: ユーザー アカウントなど。
- ロールの定義: Cognitive Services ユーザー ロール。
- スコープ: Azure AI サービス リソース。
Azure CLI をインストールします。
次の情報を特定します。
Azure のサブスクリプション ID。
Azure AI サービス リソース名。
Azure AI サービス リソースがデプロイされているリソース グループ。
推論のために Microsoft Entra ID を構成する
推論のために Microsoft Entra ID を Azure AI サービス リソースで構成するには、次の手順に従います。
Azure サブスクリプションにログインします。
az login
複数のサブスクリプションがある場合は、リソースが配置されているサブスクリプションを選択します。
az account set --subscription "<subscription-id>"
使用する予定の Azure AI サービス リソースとリソース グループの名前を使用して、次の環境変数を設定します。
ACCOUNT_NAME="<ai-services-resource-name>" RESOURCE_GROUP="<resource-group>"
リソースのフル ネームを取得します。
RESOURCE_ID=$(az resource show -g $RESOURCE_GROUP -n $ACCOUNT_NAME --resource-type "Microsoft.CognitiveServices/accounts")
アクセス許可を割り当てるセキュリティ プリンシパルのオブジェクト ID を取得します。 次の例は、以下の項目に関連付けられているオブジェクト ID を取得する方法を示しています:
ログインしている自分のアカウント:
OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
セキュリティ グループ:
OBJECT_ID=$(az ad group show --group "<group-name>" --query id --output tsv)
サービス プリンシパル:
OBJECT_ID=$(az ad sp show --id "<service-principal-guid>" --query id --output tsv)
Cognitive Services ユーザー ロールをサービス プリンシパル (リソースにスコープ指定) に割り当てます。 ロールを割り当てて、このリソースにサービス プリンシパル アクセス権を付与します。
az role assignment create --assignee-object-id $OBJECT_ID --role "Cognitive Services User" --scope $RESOURCE_ID
選択したユーザーは、推論のために Microsoft Entra ID を使用できるようになりました。
ヒント
Azure ロールの割り当ての反映には最大で 5 分かかる場合があることに留意してください。 セキュリティ グループへのユーザーの追加または削除は、すぐに反映されます。
コードで Microsoft Entra ID を使用する
リソースで Microsoft Entra ID を構成したら、推論エンドポイントを使用するときにそれを利用できるように、コードを更新する必要があります。 次の例は、チャット入力候補モデルを使用する方法を示しています。
pip のように、パッケージ マネージャーを使用してパッケージ azure-ai-inference
をインストールします。
pip install azure-ai-inference
その後、パッケージを使用してモデルを使用できます。 次の例は、Entra ID でチャット入力候補を使用するクライアントを作成する方法を示しています。
import os
from azure.ai.inference import ChatCompletionsClient
from azure.identity import DefaultAzureCredential
client = ChatCompletionsClient(
endpoint="https://<resource>.services.ai.azure.com/models",
credential=DefaultAzureCredential(),
credential_scopes=["https://cognitiveservices.azure.com/.default"],
)
Microsoft Entra ID を使用する場合の資格情報のオプション
DefaultAzureCredential
は、Microsoft Entra ID への認証を行うための、独自の順序付けられたメカニズムのシーケンスです。 各認証メカニズムは、TokenCredential
クラスから派生したクラスであり、資格情報と呼ばれます。 実行時に、DefaultAzureCredential
は最初の資格情報を使用して認証を試みます。 その資格情報がアクセス トークンの取得に失敗した場合は、シーケンス内の次の資格情報が試みられ、正常にアクセス トークンが取得されるまでそれを続けます。 これにより、アプリは環境固有のコードを記述せずに、さまざまな環境でさまざまな資格情報を使用できます。
上記のコードをローカルの開発ワークステーション上で実行すると、環境変数内でアプリケーション サービス プリンシパルが検索されるか、ローカルにインストールされた開発者ツール (Visual Studio など) で開発者の資格情報のセットが検索されます。 どちらのアプローチも、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。
Azure にデプロイすると、この同じコードでアプリを他の Azure リソースに対して認証することもできます。
DefaultAzureCredential
では、環境設定とマネージド ID 構成を取得し、他のサービスに対して自動的に認証することができます。
ベスト プラクティス
運用環境で確定的な資格情報を使用する: 運用環境では、
DefaultAzureCredential
から次のいずれかの確定的なソリューションに移行することを強くお勧めします。-
ManagedIdentityCredential
など、特定のTokenCredential
実装。 オプションについては、派生リストを参照してください。 - アプリを実行する Azure 環境向けに最適化されている、簡素化された
ChainedTokenCredential
実装。ChainedTokenCredential
は基本的に、運用用のManagedIdentity
や開発用のVisualStudioCredential
など、使用可能な資格情報オプションの特定の許可リストを作成します。
-
可能であれば、コードが実行されている Azure リソースに対して、システム割り当てまたはユーザー割り当てのマネージド ID を構成します。 それらの特定の ID への Microsoft Entra ID アクセスを構成します。
トラブルシューティング
次の表に、Microsoft Entra ID のトラブルシューティングに役立つ複数のシナリオを示します。
エラー/シナリオ | 根本原因 | 解決策 |
---|---|---|
SDK を使用している。 | 既知の問題。 | さらにトラブルシューティングを行う前に、サービスに接続するために使用しているソフトウェアの最新バージョンをインストールすることをお勧めします。 使用しているソフトウェアの新しいバージョンでは、認証のバグが修正されている可能性があります。 |
401 Principal does not have access to API/Operation |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | 次のことを行っておきます。 1. Azure AI サービス リソースへのプリンシパルに Cognitive Services ユーザー ロールを割り当てます。 2. 少なくとも 5 分待ってから最初の呼び出しを行います。 |
401 HTTP/1.1 401 PermissionDenied |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | Azure AI サービス リソースのプリンシパルに Cognitive Services ユーザー ロールを割り当てています。 管理者や共同作成者などのロールは、推論アクセスを付与しません。 少なくとも 5 分待ってから最初の呼び出しを行います。 |
REST API 呼び出しを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 |
Authentication ヘッダーに、スコープを https://cognitiveservices.azure.com/.default に設定した有効なトークンが含まれていることを確認します。 |
AzureOpenAI クラスを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.openai.azure.com に接続されている OpenAI モデルを使用していることを確認します。
OpenAI クラス、またはサービスとしてのモデルを使用することはできません。 ご使用のモデルが OpenAI 製ではない場合、Azure AI 推論 SDK を使用します。 |
Azure AI 推論 SDK を使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.services.ai.azure.com/model に接続していること、および Entra ID の正しいスコープ (https://cognitiveservices.azure.com/.default ) を指定していることを確認します。 |
404 Not found |
使用している SDK に基づくエンドポイント URL が正しくないか、モデル デプロイが存在しません。 | 適切なエンドポイントに接続されている適切な SDK を使用していることを確認します。 1. Azure AI 推論 SDK を使用している場合は、エンドポイントが https://<resource>.services.ai.azure.com/model であり、ペイロードに model="<model-deployment-name>" が含まれているか、またはエンドポイントが https://<resource>.openai.azure.com/deployments/<model-deployment-name> であることを確認します。 AzureOpenAI クラスを使用している場合は、エンドポイントが https://<resource>.openai.azure.com であることを確認します。 |
重要
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
Azure AI サービスの Azure AI モデル推論にデプロイされたモデルは、Microsoft Entra ID を使用したキーレス認証をサポートしています。 キーレス認証により、セキュリティが強化され、ユーザー エクスペリエンスが簡素化され、運用の複雑さが軽減され、最新の開発に対する堅牢なコンプライアンス サポートが提供されます。 これは、セキュリティで保護されたスケーラブルな ID 管理ソリューションを導入する組織にとって強力な選択肢となります。
この記事では、Azure AI モデル推論で、Microsoft Entra ID を推論のために構成する方法について説明します。
Azure 内のリソースのコンテキストにおけるロールを理解する
Microsoft Entra ID は、認証にロールベースのアクセス制御 (RBAC) の考え方を使用しています。 ロールは、クラウド リソースへのアクセスを管理するうえで中心的な役割を果たします。 ロールは基本的に、特定の Azure リソースに対して実行できる操作を定義するアクセス許可のコレクションです。 ユーザー、グループ、サービス プリンシパル、またはマネージド ID (総称してセキュリティ プリンシパル) にロールを割り当てることで、Azure 環境内での特定のリソースへのアクセスを制御します。
ロールを割り当てるときは、セキュリティ プリンシパル、ロールの定義、スコープを指定します。 この組み合わせはロールの割り当てと呼ばれます。 Azure AI モデルの推論は、Azure AI サービス リソースの機能であるため、その特定のリソースに割り当てられたロールによって推論のためのアクセスが制御されます。
リソースへのアクセスには次の 2 種類があります。
管理アクセス: リソースの管理に関連する操作。 通常、リソースの状態と構成を変更します。 Azure では、それらの操作はコントロール プレーン操作であり、Azure portal、Azure CLI、またはコードとしてのインフラストラクチャを使用して実行できます。 例としては、新しいモデル デプロイの作成、コンテンツ フィルタリングの構成の変更、提供されるモデルのバージョンの変更、デプロイの SKU の変更などがあります。
開発者アクセス: リソースの消費に関連する操作。 たとえば、Chat Completions API の呼び出しが挙げられます。 ただし、ユーザーはリソースの状態や構成を変更できません。
Azure では、管理操作は常に Microsoft Entra ID を使用して実行されます。 Cognitive Services 共同作成者などのロールを使用すれば、これらの操作を実行できます。 一方、開発者の操作は、アクセス キーまたは Microsoft Entra ID のどちらか、あるいはその両方を使用して実行できます。 Cognitive Services ユーザーなどのロールを使用すれば、それらの操作を実行できます。
重要
リソースへの管理者アクセス権があっても、必ずしも開発者アクセス権が付与されるわけではありません。 依然としてロールの付与による明示的なアクセス権が必要です。 これは、データベース サーバーの動作に似ています。 データベース サーバーへの管理者アクセス権があるからといって、データベース内のデータを読み取ることができるわけではありません。
Azure AI サービス リソースで Azure AI モデル推論への開発者アクセス権を構成するには、次の手順に従います。
前提条件
この記事を完了するには、以下が必要です。
Azure サブスクリプション。 GitHub モデルを使用している場合は、エクスペリエンスをアップグレードし、プロセスで Azure サブスクリプションを作成できます。 このような場合は、「GitHub モデルから Azure AI サービスの Azure AI モデル推論にアップグレードする」をお読みください。
Azure AI サービス リソース。 詳細については、「Azure AI サービス リソースを作成する」を参照してください。
管理者ロールベースのアクセス制御など、
Microsoft.Authorization/roleAssignments/write
アクセス許可およびMicrosoft.Authorization/roleAssignments/delete
アクセス許可を持つアカウント。ロールを割り当てるには、次の 3 つの要素を指定する必要があります。
- セキュリティ プリンシパル: ユーザー アカウントなど。
- ロールの定義: Cognitive Services ユーザー ロール。
- スコープ: Azure AI サービス リソース。
Azure CLI をインストールします。
次の情報を特定します。
- Azure のサブスクリプション ID。
このチュートリアルについて
この記事の中の例は、Azure-Samples/azureai-model-inference-bicep リポジトリに含まれるサンプル コードに基づいています。 ファイル内容のコピーや貼り付けをする必要なく、ローカル環境でコマンドを実行するには、次のコマンドを使用してリポジトリをクローンし、そのコーディング言語のフォルダーに移動します。
git clone https://github.com/Azure-Samples/azureai-model-inference-bicep
この例のファイルは、次の場所にあります。
cd azureai-model-inference-bicep/infra
リソースを理解する
このチュートリアルは、次の作成に役立ちます。
- キー アクセスが無効になっている Azure AI サービス リソース。 わかりやすくするために、このテンプレートではモデルをデプロイしません。
- Cognitive Services ユーザー ロールを持つ特定のセキュリティ プリンシパルのロール割り当て。
これらのリソースを作成するには、次の資産を使用します。
テンプレート
modules/ai-services-template.bicep
を使用して、Azure AI サービス リソースについて説明します。modules/ai-services-template.bicep
@description('Location of the resource.') param location string = resourceGroup().location @description('Name of the Azure AI Services account.') param accountName string @description('The resource model definition representing SKU') param sku string = 'S0' @description('Whether or not to allow keys for this account.') param allowKeys bool = true @allowed([ 'Enabled' 'Disabled' ]) @description('Whether or not public endpoint access is allowed for this account.') param publicNetworkAccess string = 'Enabled' @allowed([ 'Allow' 'Deny' ]) @description('The default action for network ACLs.') param networkAclsDefaultAction string = 'Allow' resource account 'Microsoft.CognitiveServices/accounts@2023-05-01' = { name: accountName location: location identity: { type: 'SystemAssigned' } sku: { name: sku } kind: 'AIServices' properties: { customSubDomainName: accountName publicNetworkAccess: publicNetworkAccess networkAcls: { defaultAction: networkAclsDefaultAction } disableLocalAuth: allowKeys } } output endpointUri string = 'https://${account.outputs.name}.services.ai.azure.com/models' output id string = account.id
ヒント
このテンプレートはパラメータ
allowKeys
を取ることができ、これがfalse
の場合、リソースでのキーの使用が無効になることに注意してください。 この構成は省略可能です。テンプレート
modules/role-assignment-template.bicep
を使用して、Azure でのロールの割り当てを記述します。modules/role-assignment-template.bicep
@description('Specifies the role definition ID used in the role assignment.') param roleDefinitionID string @description('Specifies the principal ID assigned to the role.') param principalId string @description('Specifies the resource ID of the resource to assign the role to.') param scopeResourceId string = resourceGroup().id var roleAssignmentName= guid(principalId, roleDefinitionID, scopeResourceId) resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: roleAssignmentName properties: { roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID) principalId: principalId } } output name string = roleAssignment.name output resourceId string = roleAssignment.id
リソースの作成
コンソール内で、次の手順に従います。
主なデプロイを定義します。
deploy-entra-id.bicep
@description('Location to create the resources in') param location string = resourceGroup().location @description('Name of the resource group to create the resources in') param resourceGroupName string = resourceGroup().name @description('Name of the AI Services account to create') param accountName string = 'azurei-models-dev' @description('ID of the developers to assign the user role to') param securityPrincipalId string module aiServicesAccount 'modules/ai-services-template.bicep' = { name: 'aiServicesAccount' scope: resourceGroup(resourceGroupName) params: { accountName: accountName location: location allowKeys: false } } module roleAssignmentDeveloperAccount 'modules/role-assignment-template.bicep' = { name: 'roleAssignmentDeveloperAccount' scope: resourceGroup(resourceGroupName) params: { roleDefinitionID: 'a97b65f3-24c7-4388-baec-2e87135dc908' // Azure Cognitive Services User principalId: securityPrincipalId } } output endpoint string = aiServicesAccount.outputs.endpointUri
Azure にログインします。
az login
適切なサブスクリプションを使用していることを確認します。
az account set --subscription "<subscription-id>"
デプロイを実行します。
RESOURCE_GROUP="<resource-group-name>" SECURITY_PRINCIPAL_ID="<your-security-principal-id>" az deployment group create \ --resource-group $RESOURCE_GROUP \ --securityPrincipalId $SECURITY_PRINCIPAL_ID --template-file deploy-entra-id.bicep
このテンプレートは、作成した任意のモデル デプロイを使用するために利用できる Azure AI モデル推論エンドポイントを出力します。
コードで Microsoft Entra ID を使用する
リソースで Microsoft Entra ID を構成したら、推論エンドポイントを使用するときにそれを利用できるように、コードを更新する必要があります。 次の例は、チャット入力候補モデルを使用する方法を示しています。
pip のように、パッケージ マネージャーを使用してパッケージ azure-ai-inference
をインストールします。
pip install azure-ai-inference
その後、パッケージを使用してモデルを使用できます。 次の例は、Entra ID でチャット入力候補を使用するクライアントを作成する方法を示しています。
import os
from azure.ai.inference import ChatCompletionsClient
from azure.identity import DefaultAzureCredential
client = ChatCompletionsClient(
endpoint="https://<resource>.services.ai.azure.com/models",
credential=DefaultAzureCredential(),
credential_scopes=["https://cognitiveservices.azure.com/.default"],
)
Microsoft Entra ID を使用する場合の資格情報のオプション
DefaultAzureCredential
は、Microsoft Entra ID への認証を行うための、独自の順序付けられたメカニズムのシーケンスです。 各認証メカニズムは、TokenCredential
クラスから派生したクラスであり、資格情報と呼ばれます。 実行時に、DefaultAzureCredential
は最初の資格情報を使用して認証を試みます。 その資格情報がアクセス トークンの取得に失敗した場合は、シーケンス内の次の資格情報が試みられ、正常にアクセス トークンが取得されるまでそれを続けます。 これにより、アプリは環境固有のコードを記述せずに、さまざまな環境でさまざまな資格情報を使用できます。
上記のコードをローカルの開発ワークステーション上で実行すると、環境変数内でアプリケーション サービス プリンシパルが検索されるか、ローカルにインストールされた開発者ツール (Visual Studio など) で開発者の資格情報のセットが検索されます。 どちらのアプローチも、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。
Azure にデプロイすると、この同じコードでアプリを他の Azure リソースに対して認証することもできます。
DefaultAzureCredential
では、環境設定とマネージド ID 構成を取得し、他のサービスに対して自動的に認証することができます。
ベスト プラクティス
運用環境で確定的な資格情報を使用する: 運用環境では、
DefaultAzureCredential
から次のいずれかの確定的なソリューションに移行することを強くお勧めします。-
ManagedIdentityCredential
など、特定のTokenCredential
実装。 オプションについては、派生リストを参照してください。 - アプリを実行する Azure 環境向けに最適化されている、簡素化された
ChainedTokenCredential
実装。ChainedTokenCredential
は基本的に、運用用のManagedIdentity
や開発用のVisualStudioCredential
など、使用可能な資格情報オプションの特定の許可リストを作成します。
-
可能であれば、コードが実行されている Azure リソースに対して、システム割り当てまたはユーザー割り当てのマネージド ID を構成します。 それらの特定の ID への Microsoft Entra ID アクセスを構成します。
トラブルシューティング
次の表に、Microsoft Entra ID のトラブルシューティングに役立つ複数のシナリオを示します。
エラー/シナリオ | 根本原因 | 解決策 |
---|---|---|
SDK を使用している。 | 既知の問題。 | さらにトラブルシューティングを行う前に、サービスに接続するために使用しているソフトウェアの最新バージョンをインストールすることをお勧めします。 使用しているソフトウェアの新しいバージョンでは、認証のバグが修正されている可能性があります。 |
401 Principal does not have access to API/Operation |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | 次のことを行っておきます。 1. Azure AI サービス リソースへのプリンシパルに Cognitive Services ユーザー ロールを割り当てます。 2. 少なくとも 5 分待ってから最初の呼び出しを行います。 |
401 HTTP/1.1 401 PermissionDenied |
要求は正しい方法で認証を示していますが、ユーザー プリンシパルには推論エンドポイントを使用するために必要なアクセス許可がありません。 | Azure AI サービス リソースのプリンシパルに Cognitive Services ユーザー ロールを割り当てています。 管理者や共同作成者などのロールは、推論アクセスを付与しません。 少なくとも 5 分待ってから最初の呼び出しを行います。 |
REST API 呼び出しを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 |
Authentication ヘッダーに、スコープを https://cognitiveservices.azure.com/.default に設定した有効なトークンが含まれていることを確認します。 |
AzureOpenAI クラスを使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.openai.azure.com に接続されている OpenAI モデルを使用していることを確認します。
OpenAI クラス、またはサービスとしてのモデルを使用することはできません。 ご使用のモデルが OpenAI 製ではない場合、Azure AI 推論 SDK を使用します。 |
Azure AI 推論 SDK を使用していて、401 Unauthorized. Access token is missing, invalid, audience is incorrect, or have expired. が表示される |
要求が、Entra ID による認証の実行に失敗しています。 | エンドポイント https://<resource>.services.ai.azure.com/model に接続していること、および Entra ID の正しいスコープ (https://cognitiveservices.azure.com/.default ) を指定していることを確認します。 |
404 Not found |
使用している SDK に基づくエンドポイント URL が正しくないか、モデル デプロイが存在しません。 | 適切なエンドポイントに接続されている適切な SDK を使用していることを確認します。 1. Azure AI 推論 SDK を使用している場合は、エンドポイントが https://<resource>.services.ai.azure.com/model であり、ペイロードに model="<model-deployment-name>" が含まれているか、またはエンドポイントが https://<resource>.openai.azure.com/deployments/<model-deployment-name> であることを確認します。 AzureOpenAI クラスを使用している場合は、エンドポイントが https://<resource>.openai.azure.com であることを確認します。 |
リソースでキーベースの認証を無効にする
Microsoft Entra ID を実装し、サービスを使用するすべてのアプリケーションで互換性やフォールバックの問題に完全に対処している場合は、キーベースの認証を無効にすることをお勧めします。 プロパティ disableLocalAuth
を変更することで、これを実現できます。
modules/ai-services-template.bicep
@description('Location of the resource.')
param location string = resourceGroup().location
@description('Name of the Azure AI Services account.')
param accountName string
@description('The resource model definition representing SKU')
param sku string = 'S0'
@description('Whether or not to allow keys for this account.')
param allowKeys bool = true
@allowed([
'Enabled'
'Disabled'
])
@description('Whether or not public endpoint access is allowed for this account.')
param publicNetworkAccess string = 'Enabled'
@allowed([
'Allow'
'Deny'
])
@description('The default action for network ACLs.')
param networkAclsDefaultAction string = 'Allow'
resource account 'Microsoft.CognitiveServices/accounts@2023-05-01' = {
name: accountName
location: location
identity: {
type: 'SystemAssigned'
}
sku: {
name: sku
}
kind: 'AIServices'
properties: {
customSubDomainName: accountName
publicNetworkAccess: publicNetworkAccess
networkAcls: {
defaultAction: networkAclsDefaultAction
}
disableLocalAuth: allowKeys
}
}
output endpointUri string = 'https://${account.outputs.name}.services.ai.azure.com/models'
output id string = account.id