키 없이 Azure OpenAI 사용
이 문서의 내용
대부분의 Azure 서비스에 대한 애플리케이션 요청은 키 또는 암호 없는 연결로 인증되어야 합니다 . 개발자는 키를 안전하지 않은 위치에 노출하지 않도록 끊임없이 노력해야 합니다. 키에 대한 액세스 권한을 얻은 사용자는 누구나 서비스에 인증할 수 있습니다. 키 없는 인증은 저장할 키(또는 연결 문자열)가 없기 때문에 계정 키에 비해 개선된 관리 및 보안 이점을 제공합니다.
키 없는 연결은 다음 단계를 통해 사용하도록 설정됩니다.
인증을 구성합니다.
필요에 따라 환경 변수를 설정합니다.
Azure ID 라이브러리 자격 증명 형식을 사용하여 Azure OpenAI 클라이언트 개체를 만듭니다.
인증
Azure 클라이언트 라이브러리를 사용하려면 Microsoft Entra ID에 대한 인증이 필요합니다.
인증은 앱이 실행되는 환경에 따라 다릅니다.
Azure OpenAI Keyless 문서 블록
다음 링크를 사용하여 Azure OpenAI Keyless 문서 블록 AI 템플릿을 탐색합니다. 이 템플릿은 OpenAI API SDK에 액세스하기 위해 키 없는(Microsoft Entra) 인증에 대한 사용자 계정 RBAC 역할 권한으로 Azure OpenAI 계정을 프로비전합니다.
참고 항목
이 문서에서는 문서의 예제 및 지침에 대한 기준으로 하나 이상의 AI 앱 템플릿 을 사용합니다. AI 앱 템플릿은 AI 앱의 고품질 시작 지점을 보장하는 데 도움이 되는 잘 유지 관리되고 배포하기 쉬운 참조 구현을 제공합니다.
로컬 개발을 위해 인증
Azure 호스팅 환경에 대한 인증
Azure OpenAI 사용에 대한 역할을 찾습니다. 해당 역할을 설정하는 방법에 따라 이름 또는 ID가 필요합니다.
역할 이름
역할 ID
Azure CLI 또는 Azure PowerShell의 경우 역할 이름을 사용할 수 있습니다.
Bicep의 경우 역할 ID가 필요합니다.
다음 표를 사용하여 역할 및 ID를 선택합니다.
사용 사례
역할 이름
역할 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를 만들 때는 .(을 Client ID
)라고도 하는 이 ID가 app ID
필요합니다.
개인 ID를 찾으려면 다음 명령 중 하나를 사용합니다. 다음 단계에서 ID를 <identity-id>
사용합니다.
로컬 개발의 경우 사용자 고유의 ID ID를 가져오려면 다음 명령을 사용합니다. 이 명령을 사용하기 전에 로그인 az login
해야 합니다.
az ad signed-in-user show \
--query id -o tsv
로컬 개발의 경우 사용자 고유의 ID 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 cmdlet 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 리소스에 대한 액세스 지점입니다.
앱이 실행되는 위치에 따라 환경 변수를 만듭니다.
위치
ID
설명
로컬
개인적
개인 ID를 사용하는 로컬 런타임의 경우 로그인 하여 도구를 사용하여 자격 증명을 만듭니다.
Azure 클라우드
사용자 할당 관리 ID
인증할 AZURE_CLIENT_ID
사용자 할당 관리 ID의 클라이언트 ID를 포함하는 환경 변수를 만듭니다.
Azure ID 클라이언트 라이브러리 설치
다음 링크를 사용하여 Azure ID 클라이언트 라이브러리를 설치합니다.
다음 POM 파일을 사용하여 Java Azure Identity 클라이언트 라이브러리 를 설치합니다.
<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 ID 라이브러리를 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
)
리소스