🎼

AKS で Service Connector を試してみた

2024/10/10に公開

Azure には Service Connector という仕組みがあり、App Service や AKS などのコンピューティングサービスから、Blob Storage や Key Vault などのバックエンドサービスに対するアクセスの構成を簡単に行うことができます。

先日、AKS における Service Connector の利用がプレビュー提供されまして。気になったので触ってみました!

こちらの AKS チームのブログでも紹介されているように、以前は下記のプロセスを実行する必要がありましたが、このうちの 2. から 5. を自動で行ってくれるそうです。

  1. Managed ID の作成
  2. OIDC Issuer URL の取得
  3. Kubernetes サービスアカウントの作成
  4. フェデレーション ID 資格情報の作成
  5. Azure サービスへアクセスするための権限付与
  6. アプリケーションのデプロイ

AKS クラスターの作成

まず、新しい AKS クラスターを作成します。aks-preview 拡張機能をアップデートし、Workload Identity と OIDC Issuer を有効にしてあります。

PowerShell
az extension update --name aks-preview
$CLNAME = "<クラスター名>"
$RGNAME = "<リソースグループ名>"
az group create --name $RGNAME --location japaneast
az aks create `
  --resource-group $RGNAME `
  --name $CLNAME `
  --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys

ストレージアカウントの作成

接続先のストレージアカウントを作成しておきます。

PowerShell
az storage account create --name <ストレージアカウント名> `
  --resource-group $RGNAME --location japaneast `
  --sku Standard_LRS --encryption-services blob

Service Connector の構成

下記の手順に沿って、AKS からストレージアカウントへの Service Connector を作成します。今回は認証方式に "Workload Identity" を使用しました。

クイック スタート - Azure portal から Azure Kubernetes Service (AKS) でサービス接続を作成する | Microsoft Learn

作成されたコンポーネントの確認

AKS クラスター上の構成を確認してみます。

まずは Secret の確認。

> kubectl get secret -A
NAMESPACE     NAME                                                   TYPE                            DATA   AGE
default       sc-storageblob89b9a-secret                             Opaque                          2      4m27s
...
kube-system   protected-ext-parameters-sc-extension                  Opaque                          4      4m46s
...
sc-system     serviceconnector-secret                                Opaque                          5      4m39s
sc-system     sh.helm.release.v1.sc-extension.v1                     helm.sh/release.v1              1      4m39s

一番上のシークレット以外にも、sc-system という名前空間が新しく作成され、いくつかのシークレットが作成されていました。

そして Service Account の確認。

> kubectl get serviceaccount -A
NAMESPACE         NAME                                              SECRETS   AGE
...
default           sc-account-d689a10b-9c8e-4259-9c05-a3f1d203aaa2   0         5m7s
...
sc-system         default                                           0         5m26s
sc-system         serviceconnector-serviceaccount                   0         5m19s

こちらも、一番上のシークレット以外に sc-system という名前空間にサービスアカウントが作成されました。

Azure Portal 上での状態検証

Azure Portal の「サービスコネクタ」にて、作成した Service Connector を確認することができます。対象の Service Connector を選択し、「検証」をクリックすると、状態検証を行うことができます。

上図のように、いくつかの観点で検証が行われていることが分かります。

サンプルアプリケーションの準備

幸い、こちらもサンプルが提供されています。下記の手順を参考に、ACR へのアップロードおよびデプロイを実行します。

アプリの実装について

こちらの GitHub リポジトリにアプリケーションのコードも含まれています。

import os
from azure.storage.blob import BlobServiceClient
from azure.identity import DefaultAzureCredential


def connect_to_storage_with_identity():
    try:
        # the envs are from the secret reference defined in pod.yaml. And the secret is created by Service Connector
        # when creating the connection between the AKS cluster and the Azure OpenAI service
        client_identity = BlobServiceClient(
            account_url=os.environ.get("AZURE_STORAGEBLOB_RESOURCEENDPOINT"), 
            credential=DefaultAzureCredential()
        )
        containers = client_identity.list_containers()
        print("Connect to Azure Storage succeeded. Find {} containers".format(len(list(containers))))
    except Exception as e:
        print("Connect to Azure Storage failed: {}".format(e))


if __name__ == "__main__":
    connect_to_storage_with_identity()

Pod 側で Workload Identity の構成が行われていれば、Python 的には azure.identity.DefaultAzureCredential() で連携されるクレデンシャルで十分ということですね。便利。

アクセスのテスト

下記のコマンドでアクセスできたかどうか、確認できます。

> kubectl get pod/sc-demo-storage-identity
NAME                       READY   STATUS      RESTARTS   AGE
sc-demo-storage-identity   0/1     Completed   0          99s

> kubectl logs pod/sc-demo-storage-identity
Connect to Azure Storage succeeded. Find 0 containers

Pod が Completed になっていることと、ログにも "succeeded" と出ていますね!

"Find 0 containers" が少し寂しかったので、新しく Blob コンテナを作ってから再度試してみます。

> kubectl delete -f pod.yaml
pod "sc-demo-storage-identity" deleted

> kubectl apply -f pod.yaml
pod/sc-demo-storage-identity created

> kubectl logs pod/sc-demo-storage-identity
Connect to Azure Storage succeeded. Find 1 containers

ちゃんと更新されていますね!

注意

公式ドキュメントに下記の記載がありました。

サービス接続を削除しても、関連付けられている Kubernetes リソースは削除されません。 必要に応じて、kubectl delete コマンドなどを使用して、リソースを手動で削除してください。

削除の際は Azure Portal から削除しただけではダメで、Kubernetes 的に手動で削除する必要があるとのこと。ここは注意事項ですね。

おわりに

上述の通り、Service Connector を利用することで Workload Identity 等の設定を簡単に行うことができるようになっています。とても嬉しい機能でした🤗

Discussion