Azure Kubernetes Service (AKS) クラスターでは、他の Azure リソースを動的に作成および管理するために 、Microsoft Entra サービス プリンシパル または マネージド ID が必要です。 この記事では、Microsoft Entra サービス プリンシパルを作成し、それを AKS クラスターで使用する方法について説明します。
注
最適なセキュリティと使いやすさを実現するために、サービス プリンシパルではなくマネージド ID を使用して、AKS クラスターから Azure 内の他のリソースへのアクセスを承認することをお勧めします。 マネージド ID は、資格情報を管理およびセキュリティで保護することなく、Microsoft Entra 資格情報を取得するために使用できる特別な種類のサービス プリンシパルです。 詳細については、「 AKS でのマネージド ID の使用」を参照してください。
前提条件
- Azure CLI バージョン 2.0.59 以降が必要です。
az --versionコマンドを使用してバージョンを検索します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
- Azure PowerShell を使用する場合は、Azure PowerShell バージョン 5.0.0 以降が必要です。
Get-InstalledModule -Name Azコマンドレットを使用してバージョンを検索します。 インストールまたはアップグレードする必要がある場合は、「Azure Az PowerShell モジュールをインストールする」を参照してください。
- アプリケーションを Microsoft Entra テナントに登録し、サブスクリプションのロールにアプリケーションを割り当てるためのアクセス許可が必要です。 必要なアクセス許可がない場合は、必要なアクセス許可を割り当てるか、サービス プリンシパルを作成するように Microsoft Entra ID またはサブスクリプション管理者に依頼する必要があります。
サービス プリンシパルを使用する場合の考慮事項
AKS で Microsoft Entra サービス プリンシパルを使用する場合は、次の考慮事項に注意してください。
- Kubernetes のサービス プリンシパルはクラスター構成の一部ですが、この ID を使用してクラスターをデプロイしないでください。 代わりに、最初 にサービス プリンシパルを作成 してから、そのサービス プリンシパルを使用して AKS クラスターを作成します。
- すべてのサービス プリンシパルは、Microsoft Entra アプリケーションに関連付けられています。 Kubernetes クラスターのサービス プリンシパルは、有効な任意の Microsoft Entra アプリケーション名 (たとえば
https://www.contoso.org/example) に関連付けることができます。 アプリケーションの URL は、実際のエンドポイントである必要はありません。 - サービス プリンシパル クライアント ID を指定する場合は、アプリケーション ID の値を使用します (Azure CLI の場合は
appId、Azure PowerShell の場合はApplicationId)。 - AKS クラスター内のエージェント ノード仮想マシン (VM) では、サービス プリンシパルの資格情報が
/etc/kubernetes/azure.jsonファイルに格納されます。 -
az aks createコマンドまたはNew-AzAksClusterコマンドレットを使用して作成した AKS クラスターを削除しても、作成されたサービス プリンシパルは自動的には削除されません。 サービス プリンシパルを削除する手順を参照してください。 - 別の Microsoft Entra テナントのサービス プリンシパルを使用している場合は、クラスターのデプロイ時に使用できるアクセス許可について他の考慮事項があります。 ディレクトリ情報を読み書きするための適切なアクセス許可がない可能性があります。 詳細については、「Microsoft Entra ID の既定のユーザー アクセス許可とは」を参照してください。
サービス プリンシパルの作成
az ad sp create-for-rbacコマンドを使用してサービス プリンシパルを作成します。# Set environment variable SERVICE_PRINCIPAL_NAME=<your-service-principal-name> # Create the service principal az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME出力は次の出力例のようになります:
{ "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "displayName": "myAKSClusterServicePrincipal", "name": "http://myAKSClusterServicePrincipal", "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }AKS クラスターの作成時に使用する
appIdとpasswordの値を出力からコピーします。
New-AzADServicePrincipalコマンドを使用してサービス プリンシパルを作成します。# Set environment variable $SpName = <your-service-principal-name> # Create the service principal New-AzADServicePrincipal -DisplayName $SpName -OutVariable sp出力は次の出力例のようになります:
Secret : System.Security.SecureString ServicePrincipalNames : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, http://myAKSClusterServicePrincipal} ApplicationId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ObjectType : ServicePrincipal DisplayName : myAKSClusterServicePrincipal Id : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Type :値は、AKS クラスターの作成時に使用する変数に格納されます。
次のコマンドを実行して、Secret のセキュリティで保護された文字列に格納されている値の暗号化を解除します。
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret) [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
既存のサービス プリンシパルを使用して AKS クラスターを作成する
az aks createパラメーターと--service-principalパラメーターを設定して、--client-secretとappIdの値を指定するpasswordコマンドを使用して、既存のサービス プリンシパルを持つ AKS クラスターを作成します。# Set environment variables RESOURCE_GROUP=<your-resource-group-name> CLUSTER_NAME=<your-aks-cluster-name> APP_ID=<app-id> CLIENT_SECRET=<password-value> # Create the AKS cluster az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --service-principal $APP_ID \ --client-secret $CLIENT_SECRET \ --generate-ssh-keys
次のコマンドを使用して、サービス プリンシパル
ApplicationIdとSecretを PSCredential オブジェクトに変換します。$Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)New-AzAksClusterコマンドレットを使用して、既存のサービス プリンシパルを持つ AKS クラスターを作成し、ServicePrincipalIdAndSecretオブジェクトを値として パラメーターを指定します。# Set environment variables $ResourceGroupName = <your-resource-group-name> $ClusterName = <your-aks-cluster-name> # Create the AKS cluster New-AzAksCluster -ResourceGroupName $ResourceGroupName -Name $ClusterName -ServicePrincipalIdAndSecret $Cred
注
カスタマイズされたシークレットがある既存のサービス プリンシパルを使用する場合は、そのシークレットの長さが 190 バイトを超えていないことを確認します。
他の Azure リソースへのアクセスを委任する
AKS クラスターのサービス プリンシパルを使用すると、その他のリソースにアクセスできます。 たとえば、AKS クラスターを既存の Azure 仮想ネットワーク (VNet) サブネットにデプロイする場合、ACR に接続する場合、またはクラスターからキー コンテナー内のキーまたはシークレットにアクセスする場合は、それらのリソースへのアクセスをサービス プリンシパルに委任する必要があります。 アクセスを委任するには、Azure ロールベースのアクセス制御 (Azure RBAC) ロールをサービス プリンシパルに割り当てます。
ロールを割り当てるときは、リソース グループや VNet リソースなど、ロールの割り当てのスコープを指定します。 ロールの割り当てにより、サービス プリンシパルがリソースに対して持つアクセス許可とスコープが決まります。
重要
クラスターに関連付けられているサービス プリンシパルに付与されるアクセス許可は、反映されるまでに最大 60 分かかる場合があります。
ロールの割り当てを作成する
注
リソースのスコープは、 /subscriptions/\<guid\>/resourceGroups/myResourceGroup や /subscriptions/\<guid\>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnetなどの完全なリソース ID である必要があります。
az role assignment createコマンドを使用してロールの割り当てを作成します。--assigneeパラメーターのサービス プリンシパル アプリ ID の値と、--scopeパラメーターのロール割り当てのスコープを指定します。 次の例では、Key Vault 内のシークレットにアクセスするためのサービス プリンシパルのアクセス許可を割り当てます。az role assignment create \ --assignee <app-id> \ --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" \ --role "Key Vault Secrets User"
New-AzRoleAssignmentコマンドレットを使用してロールの割り当てを作成します。-ApplicationIdパラメーターのサービス プリンシパル アプリ ID の値と、-Scopeパラメーターのロール割り当てのスコープを指定します。 次の例では、キー コンテナー内のシークレットにアクセスするための権限をサービス プリンシパルに割り当てます。New-AzRoleAssignment -ApplicationId <app-id> ` -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" ` -RoleDefinitionName "Key Vault Secrets User"
Azure Container Registry へのアクセスを許可する
Azure Container Registry (ACR) をコンテナーのイメージ ストアとして使用する場合、AKS クラスターがイメージを読み取ってプルするためのアクセス許可を、サービス プリンシパルに与える必要があります。 レジストリと統合し、サービス プリンシパルに適切なロールを割り当てるには、「 Azure Kubernetes Service から Azure Container Registry で認証 する」の手順に従うことをお勧めします。
ネットワーク リソースへのアクセスを許可する
VNet とサブネット、またはパブリック IP アドレスが異なるリソース グループで高度なネットワークを使用している場合は、VNet 内のサブネットに ネットワーク共同作成者 組み込みロールを割り当てることができます。 または、そのリソース グループ内のネットワーク リソースにアクセスするためのアクセス許可を持つカスタム ロールを作成することもできます。 詳細については、「AKS サービスの権限」を参照してください。
ストレージ ディスクへのアクセスを許可する
別のリソース グループ内の既存のディスク リソースにアクセスする必要がある場合は、次のいずれかのロール アクセス許可のセットを割り当てます。
- カスタム ロールを作成し、Microsoft.Compute/disks/read および Microsoft.Compute/disks/write ロールのアクセス許可を定義します。
- リソース グループに対する仮想マシン共同作成者の組み込みロールを割り当てます。
Azure Container Instances へのアクセスを許可する
仮想 kubelet を使用して AKS と統合し、AKS クラスターとは別のリソース グループで Azure Container Instances (ACI) を実行する場合は、ACI リソース グループの AKS クラスター サービス プリンシパルに 共同作成者 アクセス許可を割り当てる必要があります。
サービス プリンシパルの削除
servicePrincipalProfile.clientIdパラメーターを指定して、サービス プリンシパル クライアント ID (az ad sp delete) を照会し、--idコマンドを使用してサービス プリンシパルを削除します。 [az aks show][az-aks-show] コマンドは、指定した AKS クラスターのクライアント ID を取得します。# Set environment variables RESOURCE_GROUP=<your-resource-group-name> CLUSTER_NAME=<your-aks-cluster-name> # Delete the service principal az ad sp delete --id $(az aks show \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --query servicePrincipalProfile.clientId \ --output tsv)
サービス プリンシパル クライアント ID (
ServicePrincipalProfile.ClientId) を照会し、Remove-AzADServicePrincipalパラメーターを指定して-ApplicationIdコマンドレットを使用してサービス プリンシパルを削除します。 [Get-AzAksCluster][get-azakscluster] コマンドレットは、指定された AKS クラスターのクライアント ID を取得します。# Set environment variables $ResourceGroupName = <your-resource-group-name> $ClusterName = <your-aks-cluster-name> $ClientId = (Get-AzAksCluster -ResourceGroupName myResourceGroup -Name myAKSCluster ).ServicePrincipalProfile.ClientId # Delete the service principal Remove-AzADServicePrincipal -ApplicationId $ClientId
サービス プリンシパルの資格情報の問題を解決する
Azure CLI は、AKS クラスターのサービス プリンシパル資格情報をキャッシュします。
Azure PowerShell は、AKS クラスターのサービス プリンシパル資格情報をキャッシュします。
これらの資格情報の有効期限が切れると、AKS クラスターのデプロイ中にエラーが発生する可能性があります。 キャッシュされた資格情報に問題がある場合は、次のエラー メッセージのようなエラー メッセージが表示されることがあります。
Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
Details: adal: Refresh request failed. Status Code = '401'.
"[].endDateTime" クエリで az ad app credential list コマンドを使用して、サービス プリンシパルの資格情報の有効期限を確認します。 出力には、資格情報の endDateTime が表示されます。
az ad app credential list \
--id <app-id> \
--query "[].endDateTime" \
--output tsv
-
Get-AzADAppCredentialコマンドレットを使用して、サービス プリンシパル資格情報の有効期限を確認します。 出力には、資格情報のEndDateが表示されます。
Get-AzADAppCredential -ApplicationId <app-id>
サービス プリンシパル資格情報の既定の有効期限は 1 年です。 資格情報が 1 年以上前のものである場合は、既存の資格情報をリセットするか、新しいサービス プリンシパルを作成できます。