【Azure】Key Vaultのシークレット情報をAKSで取得する

# 1. はじめに
### 1-1 ご挨拶
初めまして、井村と申します。
プロジェクトで「Azure Kubernetes Service (AKS)」を利用することになりました。コンテナ内に認証情報等の機密情報をべた書きすることは好ましくないため、「Key Vault」に情報を格納することが決定しました。MS公式ドキュメントである「[AKS クラスターでシークレット ストア CSI ドライバーのために Azure Key Vault プロバイダーを使用する](https://docs.microsoft.com/ja-jp/azure/aks/csi-secrets-store-driver)」を参考にして構築したのですが、複数の記事を読んだり、一部コマンドが修正されていないなど苦戦した部分もありました。

本記事は自分が再度、構築する場合に一気通貫で読めること、細かいオプションを修正した状態で残しておきたいと思い記事にしました。

### 1-2 対象読者

- Azure portalからAzureサービスを使用したことがある。
- Azure Cloud Shellがなんとなくわかる
- Azureに興味がある

### 1-3 成果物
AKS および Key Vault を作成し、Key Vaultに格納したシークレット情報を取得するまで実施します。

# 2. 構築
### 2-1 リソースグループの作成
リソースグループを作成します。今後利用する変数も一緒に記述します。

```
# 変数
myAKSCluster=myAKSClustertest2022 # AKSクラスター名
myResourceGroup=rg-synapse # リソースグループ名
keyvaultname=keyvaulttest2022abcd # KeyVault名
location=japaneast # 東日本リージョン

# リソースグループの作成
az group create -n $myResourceGroup -l $location
```
### 2-2 AKSクラスターの作成
AKSクラスターを作成します。Secrets Store CSI Driver を用いることで key Vault に対してファイルシステムとしてマウントする事ができるようになります。

```
# AKSクラスター作成
az aks create -n $myAKSCluster -g $myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-managed-identity --generate-ssh-keys
```
以下の赤枠のように有効化されていることを確認します。

|![01_secret_store_CSI_Driver.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/9020a76a-74af-5043-894d-bfd27adbbdee.png)|
|:--|

### 2-3 AKSクラスター資格情報取得
Kubernetes クラスターに接続するため資格情報をダウンロードし、使用できるようKubernetes CLI を構成します。

```
# 資格情報の適用
az aks get-credentials --resource-group $myResourceGroup --name $myAKSCluster
```
 
### 2-4 Secrets Store CSI Driver および Azure Key Vault プロバイダーの確認
Secrets Store CSI Driver ポッドと Azure Key Vault プロバイダー ポッドが、クラスターのノード プール内の各ノードで実行されていることを確認します。出力結果が下記のようになることを確認します。

```
# ポッド確認
kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'

NAME                                     READY   STATUS    RESTARTS   AGE
aks-secrets-store-csi-driver-4dv95       3/3     Running   3          108s
aks-secrets-store-csi-driver-5vjwz       3/3     Running   3          109s
aks-secrets-store-csi-driver-ncrv5       3/3     Running   2          107s
aks-secrets-store-provider-azure-c88k8   1/1     Running   0          107s
aks-secrets-store-provider-azure-qk8jf   1/1     Running   0          108s
aks-secrets-store-provider-azure-rxhl4   1/1     Running   0          109s
```
 
### 2-5 Azure Key Vault の作成
Azure Key Vaultを作成し、シークレット情報も格納します。名前が"ExampleSecret"、値が"MyAKSExampleSecret"です。

```
# Key Vault作成
az keyvault create -n $keyvaultname -g $myResourceGroup -l $location

# シークレット情報の格納
az keyvault secret set --vault-name $keyvaultname -n ExampleSecret --value MyAKSExampleSecret
``` 
### 2-6 Virtual Macheine Scale Set(VMSS) のマネージドID付与
AKSクラスター作成時にAgent NodeとしてVMSSが作成されます。Key Vaultへアクセスする前段としてマネージドIDを付与します。また、ここでのリソースグループとVMSS名はAKS作成時に構築されるため、直接値を入力します。

```
# VMSSのマネージドIDを有効化
az vmss identity assign -g MC_rg-synapse_myAKSClustertest2022_japaneast -n aks-nodepool1-16400561-vmss
```
  
以下の赤枠を上記のリソースグループ、名前として記述しています。

|![02_VMSS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/1e70fd57-e710-d234-8130-8def7965f5a7.png)|
|:--|


### 2-7 VMSSのマネージドIDの確認
VMSSのマネージドIDを有効化したら、オブジェクトIDを確認します。次手順の Key Vault へのアクセス許可する際に必要となります。下記コマンド実行結果の"principalId"を控えます。

```
# VMSSのマネージドIDの確認
az vmss identity show -g MC_rg-synapse_myAKSClustertest2022_japaneast -n aks-nodepool1-16400561-vmss -o yaml

principalId: 33d17c67-fcd2-41b8-aa2f-3b9617223bdd　#★左記値を控える★
tenantId: f736cf61-9c79-487a-8c9e-38318331c527
type: SystemAssigned, UserAssigned
userAssignedIdentities:
  ? /subscriptions/4e5352f2-e8c3-4dde-962d-1b5d0d753bce/resourceGroups/MC_rg-synapse_myAKSClustertest2022_japaneast/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myAKSClustertest2022-agentpool
  : clientId: 24576d64-4947-4e34-8e8c-30212584a8ec
    principalId: d8de4104-1474-4598-a85f-5d28dc33e833
  ? /subscriptions/4e5352f2-e8c3-4dde-962d-1b5d0d753bce/resourcegroups/MC_rg-synapse_myAKSClustertest2022_japaneast/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myaksclustertest2022
  : clientId: abf75fdb-3c3b-40b2-8931-b7de017b7965
    principalId: aca37c2e-7331-464e-bc3c-16edcc72e6bb
```

### 2-8 Key Vaultに対してのアクセス許可
下記コマンドを実行し、VMSSがKey Vaultのシークレット情報を取得＆表示できるようにします。

```
# Key Vaultのシークレット情報を取得＆表示できるアクセス許可を付与
az keyvault set-policy -n $keyvaultname --secret-permissions get --object-id 33d17c67-fcd2-41b8-aa2f-3b9617223bdd
```

以下の赤枠のように権限が付与されていることを確認します。

|![03_KeyVaultManagedID.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/67e197ff-dc24-57c5-b792-570e64ba6bc0.png)|
|:--|




### 2-9 SecretProviderClass用のyamlファイルを作成およびクラスターへ適用
以下のようにSecretProviderClass用にyamlファイルを作成します。作成後、AKSクラスターへ適用します。

```secretproviderclass.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-system-msi
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"
    userAssignedIdentityID: ""
    keyvaultName: keyvaulttest2022abcd # Key Vaultの名前
    objects: |
      array:
        - |
          objectName: ExampleSecret # シークレットの名前を入力
          objectType: secret        # 今回はシークレットを選択(他にはキー、証明書がある)
    tenantId: f736cf61-9c79-487a-8c9e-38318331c527 # key vaultの概要にあるディレクトリID
```


```
# SecretProviderClassをクラスターに適用
kubectl apply -f secretproviderclass.yaml
```

### 2-10 pod 作成用のyamlファイルおよび pod の作成
以下のようにpod 作成用にyamlファイルを作成します。作成後、pod を作成します。

```pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: busybox-secrets-store-inline-system-msi
spec:
  containers:
    - name: busybox
      image: k8s.gcr.io/e2e-test-images/busybox:1.29-1
      command:
        - "/bin/sleep"
        - "10000"
      volumeMounts:
        - name: secrets-store01-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
  volumes:
    - name: secrets-store01-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "azure-kvname-system-msi"

```


```
# podの作成
kubectl apply -f pod.yaml
```

以上で構築完了です。次に動作確認を実施します。

# 3. 動作確認
以下コマンドを実行して、Key Vaultの名前確認および値を取得します。

```
# シークレットを検証する
kubectl exec busybox-secrets-store-inline-system-msi -- ls /mnt/secrets-store/

kubectl exec busybox-secrets-store-inline-system-msi -- cat /mnt/secrets-store/ExampleSecret
```

|![04_check.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989465/6ce4e290-cdfe-e0fc-2588-a082797b3610.png)|
|:--|

以上で動作確認が終わりになります。

# 4. おわりに
本記事を最後まで読んで頂きましてありがとうございます。
AKS触って２週間ほど経ちましたがまだまだ分からないことが多いです。苦笑
コンテナを用いて運用保守業務をしたことがないので、いつかは携わりたいなと思います。


# 5. 参考記事

- [AKS クラスターでシークレット ストア CSI ドライバーのために Azure Key Vault プロバイダーを使用する](https://docs.microsoft.com/ja-jp/azure/aks/csi-secrets-store-driver)
- [kubernetes-sigs/secrets-store-csi-driver](https://github.com/kubernetes-sigs/secrets-store-csi-driver)
- [クイック スタート:Azure CLI を使用して Azure Kubernetes Service クラスターをデプロイする](https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-walkthrough)
- [Azure CLI を使用して仮想マシン スケール セットで Azure リソースのマネージド ID を構成する](https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/qs-configure-cli-windows-vmss)
- [azaks(リファレンス)](https://docs.microsoft.com/ja-jp/cli/azure/aks?view=azure-cli-latest)
- [az keyvault(リファレンス)](https://docs.microsoft.com/ja-jp/cli/azure/keyvault?view=azure-cli-latest)