キーなしで Azure OpenAI を使用する
[アーティクル] 11/14/2024
2 人の共同作成者
フィードバック
この記事の内容
ほとんどの Azure サービスに対するアプリケーション要求は、キーまたはパスワードレス接続 で認証する必要があります。 開発者は、安全でない場所にアクセス・キーを公開しないよう注意する必要があります。 このキーへのアクセス権を取得したユーザーは誰でもサービスの認証を受けることができます。 キーレス認証の場合、キー (または接続文字列) を保存する必要がないため、アカウント キーよりも管理とセキュリティの面で利点があります。
キーレス接続を有効にするには、次の手順を実行します。
認証を構成します。
必要に応じて、環境変数を設定します。
Azure Identity ライブラリの資格情報の種類を使用して、Azure OpenAI クライアント オブジェクトを作成します。
認証
Azure クライアント ライブラリを使用するには、Microsoft Entra ID での認証が必要です。
認証は、アプリが実行されている環境によって異なります。
Azure OpenAI キーレス構成要素
次のリンクを使用して、Azure OpenAI キーレス Building Block AI テンプレートを確認します。 このテンプレートは、OpenAI API SDK にアクセスするためのキーレス (Microsoft Entra) 認証のユーザー アカウント RBAC ロールアクセス許可を持つ Azure OpenAI アカウントをプロビジョニングします。
Note
この記事では、記事内の例とガイダンスの土台として、1 つ以上の AI アプリ テンプレート を使用しています。 AI アプリ テンプレートは、適切にメンテナンスされ、デプロイが容易なリファレンス実装を提供します。これは、高品質な AI アプリの作成を開始するために役立ちます。
ローカル開発用の認証
Azure によってホストされる環境の認証
Azure OpenAI を使用するためのロール を見つけます。 そのロールを設定する方法に応じて、名前または ID が必要です。
ロール名
Role ID
Azure CLI または Azure PowerShell の場合、ロール名を使用できます。
Bicep の場合、ロール ID が必要です。
次の表を使用してロールと ID を選択します。
ユース ケース
ロール名
Role ID
アシスタント
Cognitive Services OpenAI Contributor
a001fd3d-188f-4b5d-821b-7da978bf7442
チャット入力候補
Cognitive Services OpenAI User
5e0bd9bd-7b93-4f28-af87-19fc36ad61bd
使用する ID の種類を選択します。
個人 ID : これは、Azure へのサインインに関連付けられている個人 ID です。
マネージド ID : これは、Azure で使用するために管理および作成される ID です。 [マネージド ID ] で、ユーザー割り当てマネージド ID を作成します。 マネージド ID を作成する場合、app ID
とも呼ばれる Client ID
が必要です。
個人 ID を見つけるには、以下のいずれかのコマンドを使用します。 次のステップでは ID <identity-id>
を使用します。
ローカル開発では、独自の ID を取得するには、以下のコマンドを使用します。 このコマンドを使用する前に、az login
を使用してサインインする必要があります。
az ad signed-in-user show \
--query id -o tsv
ローカル開発では、独自の ID を取得するには、以下のコマンドを使用します。 このコマンドを使用する前に、Connect-AzAccount
を使用してサインインする必要があります。
(Get-AzContext).Account.ExtendedProperties.HomeAccountId.Split('.')[0]
Azure Developer CLI でデプロイされた Bicep を使用する場合、デプロイを実行しているユーザーまたはサービスの ID が principalId
パラメーターに設定されます。
次の main.parameters.json
変数は、プロセスを実行している ID に設定されます。
"principalId": {
"value": "${AZURE_PRINCIPAL_ID}"
},
Azure で使用するには、Bicep デプロイ プロセスの一部としてユーザー割り当てマネージド ID を指定します。 プロセスを実行している ID とは別にユーザー割り当てマネージド ID を作成します。
resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: managedIdentityName
location: location
}
リソース グループの ID にロール ベースのアクセス制御 (RBAC) ロールを割り当てます。
RBAC を使用してリソースに ID アクセス許可を付与するには、Azure CLI コマンド az role assignment create を使用してロールを割り当てます。
az role assignment create \
--role "Cognitive Services OpenAI User" \
--assignee "<identity-id>" \
--scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>"
RBAC を使用して Azure OpenAI リソースにアプリケーションのアクセス許可を付与するには、Azure PowerShell コマンドレット New-AzRoleAssignment を使用してロールを割り当てます。
New-AzRoleAssignment -ObjectId "<identity-id>" -RoleDefinitionName "Cognitive Services OpenAI User" -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>"
次の Azure OpenAI Bicep テンプレートを使用して、リソースを作成し、identityId
の認証を設定します。 Bicep には、ロール ID が必要です。 この Bicep スニペットに示されている name
は Azure ロールではありません。これは Bicep デプロイに固有です。
// main.bicep
param environment string = 'production'
// USER ROLES
module openAiRoleUser 'core/security/role.bicep' = {
scope: openAiResourceGroup
name: 'openai-role-user'
params: {
principalId: (environment == 'development') ? principalId : userAssignedManagedIdentity
principalType: (environment == 'development') ? 'User' : 'ServicePrincipal'
roleDefinitionId: '5e0bd9bd-7b93-4f28-af87-19fc36ad61bd'
}
}
以下の汎用 Bicep は、どのロールを作成する場合も main.bicep
から呼び出されます。
// core/security/role.bicep
metadata description = 'Creates a role assignment for an identity.'
param principalId string // passed in from main.bicep identityId
@allowed([
'Device'
'ForeignGroup'
'Group'
'ServicePrincipal'
'User'
])
param principalType string = 'ServicePrincipal'
param roleDefinitionId string
resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
properties: {
principalId: principalId
principalType: principalType
roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
}
}
該当する場合、<identity-id>
、<subscription-id>
、<resource-group-name>
を実際の値に置き換えます。
Azure OpenAI に接続するには、コードがリソース エンドポイントを認識している必要があり、 他の環境変数が必要です。
Azure OpenAI エンドポイントの環境変数を作成します。
AZURE_OPENAI_ENDPOINT
: この URL は、Azure OpenAI リソースのアクセス ポイントです。
アプリが実行されている場所に基づいて環境変数を作成します。
Location
ID
説明
ローカル
個人用
個人 ID を持つローカル ランタイムの場合、サインイン して、ツールを使用して資格情報を作成します。
Azure クラウド
ユーザー割り当てマネージド ID
認証対象のユーザー割り当てマネージド ID のクライアント ID を含む AZURE_CLIENT_ID
環境変数を作成します。
Azure ID クライアント ライブラリのインストール
Azure Identity クライアント ライブラリをインストールするには、次のリンクを使用します。
次の POM ファイルを使用して、Java Azure ID クライアント ライブラリ をインストールします。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.10.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
DefaultAzureCredential の使用
Azure Identity ライブラリの DefaultAzureCredential
を使用すると、お客様はローカル開発環境と Azure Cloud で同じコードを実行できます。
.NET 用の DefaultAzureCredential
について詳しくは、「.NET 用 Azure ID クライアント ライブラリ 」をご覧ください。
using Azure;
using Azure.AI.OpenAI;
using Azure.Identity;
using System;
using static System.Environment;
string endpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
OpenAIClient client = new(new Uri(endpoint), new DefaultAzureCredential());
Go 用の DefaultAzureCredential
について詳しくは、「Go 用 Azure ID クライアント ライブラリ 」をご覧ください。
import (
"log"
"github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
)
func main() {
dac, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("ERROR: %s", err)
}
client, err := azopenai.NewClient(os.Getenv("AZURE_OPENAI_ENDPOINT"), dac, nil)
if err != nil {
log.Fatalf("ERROR: %s", err)
}
_ = client
}
Java 用の DefaultAzureCredential
について詳しくは、「Java 用 Azure ID クライアント ライブラリ 」をご覧ください。
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.ai.openai.OpenAIClient;
import com.azure.ai.openai.OpenAIClientBuilder;
String endpoint = System.getenv("AZURE_OPENAI_ENDPOINT");
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
OpenAIClient client = new OpenAIClientBuilder()
.credential(credential)
.endpoint(endpoint)
.buildClient();
JavaScript 用の DefaultAzureCredential
について詳しくは、「JavaScript 用 Azure ID クライアント ライブラリ 」をご覧ください。
import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
import { AzureOpenAI } from "openai";
const credential = new DefaultAzureCredential();
const scope = "https://cognitiveservices.azure.com/.default";
const azureADTokenProvider = getBearerTokenProvider(credential, scope);
const endpoint = process.env["AZURE_OPENAI_ENDPOINT"] || "<endpoint>";
const deployment = "<your Azure OpenAI deployment name>";
const apiVersion = "2024-05-01-preview";
const options = { azureADTokenProvider, deployment, apiVersion, endpoint }
const client = new AzureOpenAI(options);
Python 用の DefaultAzureCredential
について詳しくは、「Python 用 Azure ID クライアント ライブラリ 」をご覧ください。
import openai
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default")
openai_client = openai.AzureOpenAI(
api_version=os.getenv("AZURE_OPENAI_VERSION"),
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_ad_token_provider=token_provider
)
リソース