チュートリアル: 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 を使用して認証を確認します。

開始する前に

前提条件

  • 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_GROUPLOCATIONSERVICE_ACCOUNT_NAMESUBSCRIPTIONUSER_ASSIGNED_IDENTITY_NAMEFEDERATED_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 クラスターを作成する

  1. 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 形式で返されます。

  2. 次のコマンドを使用して、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とシークレットを作成する

  1. 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 アカウントが唯一、この新しいコンテナーで任意の操作を実行することを許可されています。

  2. az keyvault secret set コマンドを使用して、シークレットをキー コンテナーに追加します。 パスワードは環境変数 KEYVAULT_SECRET_NAME に指定した値であり、 そこにHello! の値が保存されます。

    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
    
  3. 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 を作成し、シークレットにアクセスするためのアクセス許可を付与する

  1. az account set コマンドを使用して、特定のサブスクリプションを現在アクティブなサブスクリプションとして設定します。

    az account set --subscription "${SUBSCRIPTION}"
    
  2. az identity create コマンドを使用してマネージド ID を作成します。

    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
    
  3. 次のコマンドを使用して、マネージド 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 サービス アカウントを作成する

  1. az aks get-credentials コマンドを使用して、Kubernetes サービス アカウントを作成し、前の手順で作成したマネージド ID のクライアント ID の注釈を付けます。 クラスター名とリソース グループ名の既定値を置き換えてください。

    az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
    
  2. ターミナルに次の複数行入力をコピーし、コマンドを実行してサービス アカウントを作成します。

    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 資格情報を追加した後に若干の遅延を追加できます。

ワークロードをデプロイします

  1. 次のコマンドを使用して、前の手順で作成したサービス アカウントを参照するポッドをデプロイします。

    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
    
  2. kubectl describe コマンドを使用して、すべてのプロパティが Webhook によって正しく挿入されているかどうかを確認します。

    kubectl describe pod quick-start
    
  3. kubectl logs コマンドを使用して、ポッドでトークンを取得して Key Vault からシークレットにアクセスできることを確認します。

    kubectl logs quick-start
    

    次の出力は、トークンの正常なアクセスに似ています:

    I1013 22:49:29.872708       1 main.go:30] "successfully got secret" secret="Hello!"
    

リソースをクリーンアップする

これらのリソースをそのまま残しておくことをお勧めします。 これらのリソースが不要になった場合は、次のコマンドを使用して削除します。

  1. kubectl delete pod コマンドを使用してポッドを削除します。

    kubectl delete pod quick-start
    
  2. kubectl delete sa コマンドを使用してサービス アカウントを削除します。

    kubectl delete sa "${SERVICE_ACCOUNT_NAME}" --namespace "${SERVICE_ACCOUNT_NAMESPACE}"
    
  3. az group delete コマンドを使用して、Azure リソース グループとそのすべてのリソースを削除します。

    az group delete --name "${RESOURCE_GROUP}"
    

次のステップ

このチュートリアルでは、Kubernetes クラスターをデプロイした後、Microsoft Entra ワークロード ID の操作をテストするための単純なコンテナー アプリケーションをデプロイしました。

このチュートリアルは、紹介を目的としています。 実稼動用に AKS を使用した完全なソリューションを作成するうえでのガイダンスについては、AKS ソリューション ガイダンスに関する記事を参照してください。