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 アカウントが必要です。 お持ちでない場合は、無料のアカウントを作成してください。
- この記事は、「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 サービス アカウントを作成します。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 を有効にする
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
コマンドを使用して、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
アプリケーションをテストする
kubectl get pods
コマンドを使用して、新しいポッドが実行中であることを確認します。kubectl get pods --selector app=ai-service -w
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)
kubectl describe pod
コマンドを使用してポッド環境変数を取得します。 出力は、ポッドの環境変数に Azure OpenAI API キーが存在しなくなったことを示しています。kubectl describe pod --selector app=ai-service
新しいターミナルを開き、次の
echo
のコマンドを使用してストア管理サービスの IP を取得します。echo "http://$(kubectl get svc/store-admin -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
Web ブラウザーを開き、前の手順の IP アドレスに移動します。
[製品] を選択します。 Azure OpenAI を使用して、新しい製品を追加し、その説明を取得できます。
次のステップ
この記事では、Microsoft Entra ワークロード ID を使って、Azure Kubernetes Service (AKS) から Azure OpenAI へのアクセスをセキュリティで保護する方法について学習しました。
Microsoft Entra ワークロード ID の詳細については、Microsoft Entra ワークロード ID に関する記事を参照してください。
Azure Kubernetes Service