다음을 통해 공유


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를 사용하는 것이 좋습니다.

시작하기 전에

사전 요구 사항

AKS 클러스터에서 Microsoft Entra 워크로드 ID 사용

Microsoft Entra 워크로드 ID 및 OIDC 발급자 엔드포인트 기능은 기본적으로 AKS에서 사용하도록 설정되지 않습니다. 이 기능을 사용하려면 먼저 AKS 클러스터에서 사용하도록 설정해야 합니다.

  1. 리소스 그룹 이름 및 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)
    
  2. az aks update 명령을 사용하여 기존 AKS 클러스터에서 Microsoft Entra 워크로드 ID 및 OIDC 발급자 엔드포인트 기능을 사용하도록 설정합니다.

    az aks update \
        --resource-group $RG_NAME \
        --name $AKS_NAME \
        --enable-workload-identity \
        --enable-oidc-issuer
    
  3. 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 만들기

  1. 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
    
  2. 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)
    
  3. 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)
    
  4. 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 페더레이션 자격 증명 만들기

  1. 페더레이션 자격 증명, 네임스페이스 및 서비스 계정 변수를 설정합니다.

    # 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
    
  2. 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 만들기

  1. az aks get-credentials 명령을 사용하여 클러스터에 대한 kubeconfig를 가져옵니다.

    az aks get-credentials \
        --resource-group $RG_NAME \
        --name $AKS_NAME
    
  2. 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 사용

  1. 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)
    
  2. 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
    

애플리케이션 테스트

  1. kubectl get pods 명령을 사용하여 새 Pod가 실행 중인지 확인합니다.

    kubectl get pods --selector app=ai-service -w
    
  2. kubectl logs 명령을 사용하여 Pod 로그를 가져옵니다. Pod를 초기화하는 데 몇 분 정도 걸릴 수 있습니다.

    kubectl logs --selector app=ai-service -f
    

    다음 예제 출력은 앱이 초기화되었으며 요청을 수락할 준비가 되었음을 보여 줍니다. 첫 번째 줄은 코드에 구성 변수가 누락되었음을 나타냅니다. 그러나 Azure Identity SDK는 이 프로세스를 처리하고 AZURE_CLIENT_IDAZURE_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)
    
  3. kubectl describe pod 명령을 사용하여 Pod 환경 변수를 가져옵니다. 출력은 Azure OpenAI API 키가 Pod의 환경 변수에 더 이상 존재하지 않음을 보여 줍니다.

    kubectl describe pod --selector app=ai-service
    
  4. 새 터미널을 열고 다음 echo 명령을 사용하여 스토어 관리 서비스의 IP를 가져옵니다.

    echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    
  5. 웹 브라우저를 열고 이전 단계의 IP 주소로 이동합니다.

  6. 제품을 선택합니다. Azure OpenAI를 사용하여 새 제품을 추가하고 해당 제품에 대한 설명을 가져올 수 있어야 합니다.

다음 단계

이 문서에서는 Microsoft Entra 워크로드 ID를 사용하여 AKS(Azure Kubernetes Service)에서 Azure OpenAI에 안전하게 액세스하는 방법을 알아보았습니다.

Microsoft Entra 워크로드 ID에 대한 자세한 내용은 Microsoft Entra 워크로드 ID를 참조하세요.