チュートリアル: Azure Kubernetes Service (AKS) 上のアプリケーションでワークロード ID を使用する
Azure Kubernetes Service (AKS) は、クラスターをすばやくデプロイおよび管理することができる、マネージド Kubernetes サービスです。 このチュートリアルでは、次の作業を行いました。
- OpenID Connect (OIDC) 発行者とマネージド ID を使用して Azure CLI を使用して AKS クラスターをデプロイします。
- Azure Key Vaultとシークレットを作成する。
- Microsoft Entra ワークロード ID と Kubernetes サービス アカウントを作成します。
- トークンのフェデレーション用にマネージド ID を構成する。
- ワークロードをデプロイし、ワークロード ID を使用して認証を確認します。
開始する前に
- このチュートリアルでは、Kubernetes の概念の基本的な理解を前提としています。 詳細については、「Azure Kubernetes Services (AKS) における Kubernetes の中心概念」を参照してください。
- Microsoft Entra ワークロード ID に慣れていない場合は、 Microsoft Entra ワークロード ID の概要を参照してください。
- AKS クラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。
前提条件
- Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
- この記事では、Azure CLI のバージョン 2.47.0 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
- クラスターの作成に使用する ID に、適切な最小限のアクセス許可が与えられている必要があります。 AKS のアクセスと ID の情報については、「Azure Kubernetes Service (AKS) でのアクセスと ID オプション」を参照してください。
- 複数の Azure サブスクリプションをお持ちの場合は、az account set コマンドを使用して、リソースが課金の対象となる適切なサブスクリプション ID を選択してください。
リソース グループを作成する
Azure リソース グループは、Azure リソースが展開され管理される論理グループです。 リソース グループを作成する際は、場所の指定を求めるプロンプトが表示されます。 この場所は、リソース グループのメタデータが格納される場所です。また、リソースの作成時に別のリージョンを指定しない場合は、Azure でリソースが実行される場所でもあります。
次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。
az group create コマンドを使用して、リソース グループを作成します。
az group create --name myResourceGroup --location eastus
リソース グループが正常に作成された場合の出力の例は、次のようになります。
{ "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", "location": "eastus", "managedBy": null, "name": "myResourceGroup", "properties": { "provisioningState": "Succeeded" }, "tags": null }
環境変数をエクスポートする
必要な ID を構成するステップを簡略化するために、下のステップでは、クラスターで参照する環境変数を定義します。
次のコマンドを実行してこれらの変数を作成します。
RESOURCE_GROUP
、LOCATION
、SERVICE_ACCOUNT_NAME
、SUBSCRIPTION
、USER_ASSIGNED_IDENTITY_NAME
、FEDERATED_IDENTITY_CREDENTIAL_NAME
の既定値を置き換えます。export RESOURCE_GROUP="myResourceGroup" export LOCATION="westcentralus" export SERVICE_ACCOUNT_NAMESPACE="default" export SERVICE_ACCOUNT_NAME="workload-identity-sa" export SUBSCRIPTION="$(az account show --query id --output tsv)" export USER_ASSIGNED_IDENTITY_NAME="myIdentity" export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity" export KEYVAULT_NAME="azwi-kv-tutorial" export KEYVAULT_SECRET_NAME="my-secret"
AKS クラスターを作成する
OIDC 発行者 を使うには、az aks create コマンドと
--enable-oidc-issuer
パラメーターを使って、AKS クラスターを作成します。az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
次のコマンドを使用して、OIDC 発行者 URL を取得し、環境変数に保存します。 引数
-n
の既定値 (クラスターの名前) を置き換えます。export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -otsv)"
変数には、次の例のような発行者 URL が含まれている必要があります。
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000/
既定では、発行者はベース URL の
https://{region}.oic.prod-aks.azure.com
を使用するように設定されています。ここで{region}
の値は、AKS クラスターがデプロイされている場所と一致します。
Azure Key Vaultとシークレットを作成する
az keyvault create コマンドを使用して、このチュートリアルで作成したリソース グループに Azure Key Vault を作成します。
az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --name "${KEYVAULT_NAME}" --enable-rbac-authorization false
このコマンドの出力では、新しく作成したキー コンテナーのプロパティが表示されます。 次の 2 つのプロパティをメモしておきます。
Name
:--name
パラメーターに指定したコンテナー名。vaultUri
: この例では、https://<your-unique-keyvault-name>.vault.azure.net/
。 その REST API から資格情報コンテナーを使用するアプリケーションは、この URI を使用する必要があります。
この時点で、自分の Azure アカウントが唯一、この新しいコンテナーで任意の操作を実行することを許可されています。
az keyvault secret set コマンドを使用して、シークレットをキー コンテナーに追加します。 パスワードは環境変数
KEYVAULT_SECRET_NAME
に指定した値であり、 そこにHello! の値が保存されます。az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
az keyvault show コマンドを使用して、Key Vault URL を環境変数
KEYVAULT_URL
に追加します。export KEYVAULT_URL="$(az keyvault show -g "${RESOURCE_GROUP}" -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
マネージド ID を作成し、シークレットにアクセスするためのアクセス許可を付与する
az account set コマンドを使用して、特定のサブスクリプションを現在アクティブなサブスクリプションとして設定します。
az account set --subscription "${SUBSCRIPTION}"
az identity create コマンドを使用してマネージド ID を作成します。
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
次のコマンドを使用して、マネージド ID が Key Vault シークレットにアクセスするためのアクセス ポリシーを設定します。
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
Kubernetes サービス アカウントを作成する
az aks get-credentials コマンドを使用して、Kubernetes サービス アカウントを作成し、前の手順で作成したマネージド ID のクライアント ID の注釈を付けます。 クラスター名とリソース グループ名の既定値を置き換えてください。
az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
ターミナルに次の複数行入力をコピーし、コマンドを実行してサービス アカウントを作成します。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: ${USER_ASSIGNED_CLIENT_ID} name: ${SERVICE_ACCOUNT_NAME} namespace: ${SERVICE_ACCOUNT_NAMESPACE} EOF
IDが正常に作成された場合の出力の例は、次のようになります:
Serviceaccount/workload-identity-sa created
フェデレーション ID 資格情報を確立する
az identity federated-credential create コマンドを使用して、マネージド ID、サービス アカウント発行者、サブジェクトの間にフェデレーション ID 資格情報を作成します。
az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name ${USER_ASSIGNED_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --issuer ${AKS_OIDC_ISSUER} --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
Note
フェデレーション ID 資格情報が最初に追加された後に反映されるまでに数秒かかります。 フェデレーション ID 資格情報を追加した後、トークン要求がすぐに使用可能な場合、古いデータがあるディレクトリにキャッシュが設定されるため、数分間は失敗する可能性があります。 このイシューを回避するには、フェデレーション ID 資格情報を追加した後に若干の遅延を追加できます。
ワークロードをデプロイします
次のコマンドを使用して、前の手順で作成したサービス アカウントを参照するポッドをデプロイします。
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: quick-start namespace: ${SERVICE_ACCOUNT_NAMESPACE} labels: azure.workload.identity/use: "true" spec: serviceAccountName: ${SERVICE_ACCOUNT_NAME} containers: - image: ghcr.io/azure/azure-workload-identity/msal-go name: oidc env: - name: KEYVAULT_URL value: ${KEYVAULT_URL} - name: SECRET_NAME value: ${KEYVAULT_SECRET_NAME} nodeSelector: kubernetes.io/os: linux EOF
ポッドが正常に作成された場合の出力の例は、次のようになります:
pod/quick-start created
kubectl describe コマンドを使用して、すべてのプロパティが Webhook によって正しく挿入されているかどうかを確認します。
kubectl describe pod quick-start
kubectl logs コマンドを使用して、ポッドでトークンを取得して Key Vault からシークレットにアクセスできることを確認します。
kubectl logs quick-start
次の出力は、トークンの正常なアクセスに似ています:
I1013 22:49:29.872708 1 main.go:30] "successfully got secret" secret="Hello!"
リソースをクリーンアップする
これらのリソースをそのまま残しておくことをお勧めします。 これらのリソースが不要になった場合は、次のコマンドを使用して削除します。
kubectl delete pod
コマンドを使用してポッドを削除します。kubectl delete pod quick-start
kubectl delete sa
コマンドを使用してサービス アカウントを削除します。kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
az group delete コマンドを使用して、Azure リソース グループとそのすべてのリソースを削除します。
az group delete --name "${RESOURCE_GROUP}"
次のステップ
このチュートリアルでは、Kubernetes クラスターをデプロイした後、Microsoft Entra ワークロード ID の操作をテストするための単純なコンテナー アプリケーションをデプロイしました。
このチュートリアルは、紹介を目的としています。 実稼動用に AKS を使用した完全なソリューションを作成するうえでのガイダンスについては、AKS ソリューション ガイダンスに関する記事を参照してください。