AKS(Azure Kubernetes Service)에서 Azure OpenAI에 대한 보안 액세스
이 문서에서는 Microsoft Entra 워크로드 ID를 사용하여 AKS(Azure Kubernetes Service)에서 Azure OpenAI에 안전하게 액세스하는 방법을 알아봅니다. 다음 방법에 대해 설명합니다.
- AKS 클러스터에서 워크로드 ID를 사용하도록 설정합니다.
- Azure 사용자 할당 관리 ID를 만듭니다.
- Microsoft Entra ID 페더레이션 자격 증명을 만듭니다.
- Kubernetes Pod에서 워크로드 ID를 사용하도록 설정합니다.
참고 항목
Azure 리소스에 액세스하기 위한 안전한 암호 없는 인증 프로세스를 사용할 수 있으므로 Azure OpenAI 액세스를 위해 AKS에서 Microsoft Entra 워크로드 ID 및 관리 ID를 사용하는 것이 좋습니다.
시작하기 전에
- 활성 구독이 있는 Azure 계정이 필요합니다. 계정이 없으면 무료 계정을 만듭니다.
- 이 문서는 AKS에서 OpenAI를 사용하는 애플리케이션 배포를 기준으로 합니다. 이 문서를 시작하기 전에 해당 문서를 완료해야 합니다.
- Microsoft Entra 권한 부여에 사용하려면 Azure OpenAI 계정에서 사용자 지정 도메인 이름을 사용하도록 설정해야 합니다. 자세한 내용은 Azure AI 서비스의 사용자 지정 하위 도메인 이름을 참조하세요.
사전 요구 사항
Azure Cloud Shell에서 Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell의 Bash에 대한 빠른 시작을 참조하세요.
CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
AKS 클러스터에서 Microsoft Entra 워크로드 ID 사용
Microsoft Entra 워크로드 ID 및 OIDC 발급자 엔드포인트 기능은 기본적으로 AKS에서 사용하도록 설정되지 않습니다. 이 기능을 사용하려면 먼저 AKS 클러스터에서 사용하도록 설정해야 합니다.
리소스 그룹 이름 및 AKS 클러스터 리소스 그룹 이름 변수를 설정합니다.
# Set the resource group variable RG_NAME=myResourceGroup # Set the AKS cluster resource group variable AKS_NAME=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.ContainerService/managedClusters --query "[0].name" -o tsv)
az aks update
명령을 사용하여 기존 AKS 클러스터에서 Microsoft Entra 워크로드 ID 및 OIDC 발급자 엔드포인트 기능을 사용하도록 설정합니다.az aks update \ --resource-group $RG_NAME \ --name $AKS_NAME \ --enable-workload-identity \ --enable-oidc-issuer
az aks show
명령을 사용하여 AKS OIDC 발급자 엔드포인트 URL을 가져옵니다.AKS_OIDC_ISSUER=$(az aks show --resource-group $RG_NAME --name $AKS_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)
Azure 사용자 할당 관리 ID 만들기
az identity create
명령을 사용하여 Azure 사용자 할당 관리 ID를 만듭니다.# Set the managed identity name variable MANAGED_IDENTITY_NAME=myIdentity # Create the managed identity az identity create \ --resource-group $RG_NAME \ --name $MANAGED_IDENTITY_NAME
az identity show
명령을 사용하여 관리 ID 클라이언트 ID 및 개체 ID를 가져옵니다.# Get the managed identity client ID MANAGED_IDENTITY_CLIENT_ID=$(az identity show --resource-group $RG_NAME --name $MANAGED_IDENTITY_NAME --query clientId -o tsv) # Get the managed identity object ID MANAGED_IDENTITY_OBJECT_ID=$(az identity show --resource-group $RG_NAME --name $MANAGED_IDENTITY_NAME --query principalId -o tsv)
az resource list
명령을 사용하여 Azure OpenAI 리소스 ID를 가져옵니다.AOAI_RESOURCE_ID=$(az resource list --resource-group $RG_NAME --resource-type Microsoft.CognitiveServices/accounts --query "[0].id" -o tsv)
az role assignment create
명령을 사용하여 관리 ID에 Azure OpenAI 리소스에 대한 액세스 권한을 부여합니다.az role assignment create \ --role "Cognitive Services OpenAI User" \ --assignee-object-id $MANAGED_IDENTITY_OBJECT_ID \ --assignee-principal-type ServicePrincipal \ --scope $AOAI_RESOURCE_ID
Microsoft Entra ID 페더레이션 자격 증명 만들기
페더레이션 자격 증명, 네임스페이스 및 서비스 계정 변수를 설정합니다.
# Set the federated credential name variable FEDERATED_CREDENTIAL_NAME=myFederatedCredential # Set the namespace variable SERVICE_ACCOUNT_NAMESPACE=default # Set the service account variable SERVICE_ACCOUNT_NAME=ai-service-account
az identity federated-credential create
명령을 사용하여 페더레이션 자격 증명을 만듭니다.az identity federated-credential create \ --name ${FEDERATED_CREDENTIAL_NAME} \ --resource-group ${RG_NAME} \ --identity-name ${MANAGED_IDENTITY_NAME} \ --issuer ${AKS_OIDC_ISSUER} \ --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
AKS에서 Microsoft Entra 워크로드 ID 사용
AKS에서 Microsoft Entra 워크로드 ID를 사용하려면 ai-service
배포 매니페스트를 약간 변경해야 합니다.
ServiceAccount 만들기
az aks get-credentials
명령을 사용하여 클러스터에 대한 kubeconfig를 가져옵니다.az aks get-credentials \ --resource-group $RG_NAME \ --name $AKS_NAME
kubectl apply
명령을 사용하여 Kubernetes ServiceAccount를 만듭니다.kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: ${MANAGED_IDENTITY_CLIENT_ID} name: ${SERVICE_ACCOUNT_NAME} namespace: ${SERVICE_ACCOUNT_NAMESPACE} EOF
Pod에서 Microsoft Entra 워크로드 ID 사용
Azure OpenAI 리소스 이름, 엔드포인트 및 배포 이름 변수를 설정합니다.
# Get the Azure OpenAI resource name AOAI_NAME=$(az resource list \ --resource-group $RG_NAME \ --resource-type Microsoft.CognitiveServices/accounts \ --query "[0].name" -o tsv) # Get the Azure OpenAI endpoint AOAI_ENDPOINT=$(az cognitiveservices account show \ --resource-group $RG_NAME \ --name $AOAI_NAME \ --query properties.endpoint -o tsv) # Get the Azure OpenAI deployment name AOAI_DEPLOYMENT_NAME=$(az cognitiveservices account deployment list \ --resource-group $RG_NAME \ --name $AOAI_NAME \ --query "[0].name" -o tsv)
kubectl apply
명령을 사용하여 ServiceAccount를 지정하고azure.workload.identity/use
주석을true
로 설정하여ai-service
를 다시 배포합니다.kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: ai-service spec: replicas: 1 selector: matchLabels: app: ai-service template: metadata: labels: app: ai-service azure.workload.identity/use: "true" spec: serviceAccountName: $SERVICE_ACCOUNT_NAME nodeSelector: "kubernetes.io/os": linux containers: - name: ai-service image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest ports: - containerPort: 5001 env: - name: USE_AZURE_OPENAI value: "True" - name: USE_AZURE_AD value: "True" - name: AZURE_OPENAI_DEPLOYMENT_NAME value: "${AOAI_DEPLOYMENT_NAME}" - name: AZURE_OPENAI_ENDPOINT value: "${AOAI_ENDPOINT}" resources: requests: cpu: 20m memory: 50Mi limits: cpu: 50m memory: 128Mi EOF
애플리케이션 테스트
kubectl get pods
명령을 사용하여 새 Pod가 실행 중인지 확인합니다.kubectl get pods --selector app=ai-service -w
kubectl logs
명령을 사용하여 Pod 로그를 가져옵니다. Pod를 초기화하는 데 몇 분 정도 걸릴 수 있습니다.kubectl logs --selector app=ai-service -f
다음 예제 출력은 앱이 초기화되었으며 요청을 수락할 준비가 되었음을 보여 줍니다. 첫 번째 줄은 코드에 구성 변수가 누락되었음을 나타냅니다. 그러나 Azure Identity SDK는 이 프로세스를 처리하고
AZURE_CLIENT_ID
및AZURE_TENANT_ID
변수를 설정합니다.Incomplete environment configuration. These variables are set: AZURE_CLIENT_ID, AZURE_TENANT_ID INFO: Started server process [1] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:5001 (Press CTRL+C to quit)
kubectl describe pod
명령을 사용하여 Pod 환경 변수를 가져옵니다. 출력은 Azure OpenAI API 키가 Pod의 환경 변수에 더 이상 존재하지 않음을 보여 줍니다.kubectl describe pod --selector app=ai-service
새 터미널을 열고 다음
echo
명령을 사용하여 스토어 관리 서비스의 IP를 가져옵니다.echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
웹 브라우저를 열고 이전 단계의 IP 주소로 이동합니다.
제품을 선택합니다. Azure OpenAI를 사용하여 새 제품을 추가하고 해당 제품에 대한 설명을 가져올 수 있어야 합니다.
다음 단계
이 문서에서는 Microsoft Entra 워크로드 ID를 사용하여 AKS(Azure Kubernetes Service)에서 Azure OpenAI에 안전하게 액세스하는 방법을 알아보았습니다.
Microsoft Entra 워크로드 ID에 대한 자세한 내용은 Microsoft Entra 워크로드 ID를 참조하세요.
Azure Kubernetes Service