Share via


Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスのセキュリティ保護

この記事では、Microsoft Entra ワークロード ID を使って、Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスをセキュリティで保護する方法について説明します。 以下の方法について説明します。

  • AKS クラスターでワークロード ID を有効にします。
  • Azure ユーザー割り当てマネージド ID を作成します。
  • Microsoft Entra ID フェデレーション資格情報を作成します。
  • Kubernetes ポッドでワークロード ID を有効にします。

Note

Azure OpenAI アクセス用の AKS で Microsoft Entra ワークロード ID とマネージド ID を使うことをお勧めします。そうすることで、Azure リソースにアクセスするための安全でパスワードなしの認証プロセスが可能になるためです。

開始する前に

前提条件

  • 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 クラスターで有効にする必要があります。

  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 サービス アカウントを作成します。

    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
    

ポッド上で 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 コマンドを使用して、azure.workload.identity/use 注釈を true に設定した ai-service ServiceAccount を再デプロイします。

    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 コマンドを使用して、新しいポッドが実行中であることを確認します。

    kubectl get pods --selector app=ai-service -w
    
  2. kubectl logs コマンドを使用してポッド ログを取得します。 ポッドが初期化されるまで数分かかる場合があります。

    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)
    
  3. kubectl describe pod コマンドを使用してポッド環境変数を取得します。 出力は、ポッドの環境変数に Azure OpenAI API キーが存在しなくなったことを示しています。

    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. Web ブラウザーを開き、前の手順の IP アドレスに移動します。

  6. [製品] を選択します。 Azure OpenAI を使用して、新しい製品を追加し、その説明を取得できます。

次のステップ

この記事では、Microsoft Entra ワークロード ID を使って、Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスをセキュリティで保護する方法について学習しました。

Microsoft Entra ワークロード ID の詳細については、Microsoft Entra ワークロード ID に関する記事を参照してください。