チュートリアル: Bicep を介して、Azure Cosmos DB for NoSQL、マネージド ID、AKS を使用する ASP.NET Web アプリケーションをデプロイする

適用対象: NoSQL

このチュートリアルでは、Azure Cosmos DB for NoSQL に接続する参照 ASP.NET Web アプリケーションを Azure Kubernetes Service (AKS) クラスターにデプロイします。

Azure Cosmos DB は、NoSQL またはリレーショナル データベースを使用した最新のアプリケーション開発のためのフル マネージド分散データベース プラットフォームです。

AKS は、クラスターをすばやくデプロイして管理できるマネージド Kubernetes サービスです。

重要

  • この記事には、Azure CLI の最新バージョンが必要です。 詳細については、「 Azure CLI のインストール」を参照してください。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
  • また、この記事では、Azure CLI 内の Bicep CLI の最新バージョンも必要です。 詳細については、「Bicep ツールのインストール」を参照してください。
  • このチュートリアルのコマンドを Azure Cloud Shell ではなくローカルで実行する場合は、必ず管理者アカウントを使用してください。

前提条件

ASP.NET Web アプリケーションをコンパイルし、そのコンテナー イメージを作成するには、次のツールが必要です。

概要

このチュートリアルでは、コードとしてのインフラストラクチャ (IaC) のアプローチを使って、リソースを Azure にデプロイします。 ここで使う Bicep は、Azure Resource Manager テンプレートと同じ機能を提供する新しい宣言型言語です。 ただし、Bicep には、より簡潔で使いやすい構文が含まれています。

Bicep モジュールでは、ターゲット サブスクリプション スコープ内に次の Azure リソースがデプロイされます。

このチュートリアルでは、Azure Cosmos DB に関する次のセキュリティ ベスト プラクティスを使います。

ヒント

このチュートリアルの手順では、Azure Cosmos DB for NoSQL を使用します。 ただし、同じ概念を Azure Cosmos DB for MongoDB に適用できます。

Bicep モジュールをダウンロードする

azure-samples/cosmos-aks-samples GitHub リポジトリの Bicep フォルダーから Bicep モジュールをダウンロードまたはクローンします。

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Bicep/

Azure サブスクリプションへの接続

az login を使って、既定の Azure サブスクリプションに接続します。

az login

また、複数のサブスクリプションがある場合は、az account set と特定のサブスクリプションの名前または ID を使って、アクティブなサブスクリプションを設定します。

az account set \
  --subscription <subscription-id>

デプロイのパラメーターを初期化する

次の例の JSON を使って、param.json ファイルを作成します。 プレースホルダー {resource group name}{Azure Cosmos DB account name}{Azure Container Registry instance name} を実際の値に置き換えます。

重要

次のコードで使用するすべてのリソース名は、Azure リソースの名前付けルールと制限に準拠している必要があります。 また、プレースホルダーの値が一貫して置き換えられ、param.json の値と一致していることを確認します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "value": "{resource group name}"
    },    
    "cosmosName" :{
      "value": "{Azure Cosmos DB account name}"
    },
    "acrName" :{
      "value": "{Azure Container Registry instance name}"
    }
  }
}

Bicep デプロイを作成する

シェル変数を設定するには、次のコマンドを使用します。 プレースホルダー {deployment name}{location} を実際の値に置き換えます。

deploymentName='{deployment name}'  # Name of the deployment
location='{location}' # Location for deploying the resources

Bicep フォルダー内で、az deployment sub create を使って現在のサブスクリプション スコープにテンプレートをデプロイします。

az deployment sub create \
  --name $deploymentName \
  --location $location \
  --template-file main.bicep \
  --parameters @param.json

デプロイ中は、デプロイがまだ実行されていることを示すメッセージがコンソールに出力されます。

 / Running ..

デプロイには 20 - 30 分かかる場合があります。 プロビジョニングが完了すると、JSON とプロビジョニング状態 Succeeded がコンソールに出力されます。

      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "0000000000000000",
    "templateLink": null,
    "timestamp": "2022-01-01T00:00:00.000000+00:00",
    "validatedResources": null
  },
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

リソース グループでデプロイの状態を確認することもできます。

Azure portal でのリソース グループのデプロイ状態のスクリーンショット。

Note

AKS クラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。

次のコマンドを使用して、Azure Container Registry インスタンスを AKS にリンクします。 プレースホルダー {Azure Container Registry instance name}{resource group name} を実際の値に置き換えます。

acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'

az aks update を実行して、既存の Azure Container Registry リソースを AKS クラスターにアタッチします。

az aks update \
  --resource-group $rgName \
  --name $aksName \
  --attach-acr $acrName

AKS クラスターに接続する

Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 kubectl をローカルにインストールするには、az aks install-cli を使用します。

az aks install-cli

Kubernetes クラスターに接続するように kubectl を構成するには、az aks get-credentials を使用します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。

az aks get-credentials \
  --resource-group $rgName \
  --name $aksName

AKS ポッドを Azure Key Vault に接続する

Microsoft Entra ポッドマネージド ID では、AKS プリミティブを使用して、Azure リソースのマネージド ID と Microsoft Entra ID の ID をポッドに関連付けます。 これらの ID を使って、シークレット ストア CSI ドライバーに Azure Key Vault プロバイダーへのアクセス権を付与します。

テナント ID (homeTenantId) の値を検索するには、次のコマンドを使用します。

az account show

次の YAML テンプレートを使って、secretproviderclass.yml ファイルを作成します。 プレースホルダー {Tenant Id}{resource group name} を実際の値に置き換えます。 また、{resource group name} の値が param.json の値と一致していることを確認します。

# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-podid
spec:
  provider: azure
  parameters:
    usePodIdentity: "true"               
    keyvaultName: "{resource group name}kv"       # Replace resource group name. Bicep generates the key vault name.
    tenantId: "{Tenant Id}"              # The tenant ID of your account. Use the 'homeTenantId' attribute value from  the 'az account show' command output.

AKS クラスターに SecretProviderClass を適用する

kubectl apply を実行し、YAML を使ってシークレット ストア CSI ドライバーをインストールします。

kubectl apply \
  --filename secretproviderclass.yml

ASP.NET Web アプリケーションをビルドする

azure-samples/cosmos-aks-samples GitHub リポジトリの Application フォルダーから、Web アプリケーションのソース コードをダウンロードまたはクローンします。

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Application/

Visual Studio Code で Application フォルダーを開きます。 F5 キーまたは [デバッグ] > [デバッグの開始] コマンドを使って、アプリケーションを実行します。

Docker コンテナー イメージを Azure Container Registry にプッシュする

  1. Visual Studio Code の [エクスプローラー] タブからコンテナー イメージを作成するには、Dockerfile を右クリックして、[イメージのビルド] を選択します。

    [Build Image] (イメージのビルド) オプションが選ばれている Visual Studio Code のコンテキスト メニューのスクリーンショット。

  2. イメージへのタグ付けに使用する名前とバージョンを求めるプロンプトで、todo:latest という名前を入力します。

  3. [Docker] ペインを使用して、ビルドされたイメージを Azure Container Registry にプッシュします。 [イメージ] ノードの下にビルドされたイメージが表示されます。 todo ノードを開き、[最新] を右クリックして、[プッシュ] を選択します。

    [プッシュ] オプションが選ばれている Visual Studio Code のコンテキスト メニューのスクリーンショット。

  4. プロンプトで、Azure サブスクリプション、Azure Container Registry リソース、イメージ タグを選択します。 イメージ タグの形式は {acrname}.azurecr.io/todo:latest にする必要があります。

  5. Visual Studio Code によってコンテナー イメージが Azure Container Registry にプッシュされるまで待ちます。

デプロイ YAML を準備する

次の YAML テンプレートを使って、akstododeploy.yml ファイルを作成します。 プレースホルダー {ACR name}{Image name}{Version}{resource group name} を実際の値に置き換えます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo
  labels:
    aadpodidbinding: "cosmostodo-apppodidentity"
    app: todo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo
  template:
    metadata:
      labels:
        app: todo
        aadpodidbinding: "cosmostodo-apppodidentity"
    spec:
      containers:
      - name: mycontainer
        image: "{ACR name}/{Image name}:{Version}"   # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
        ports:
        - containerPort: 80
        env:
        - name: KeyVaultName
          value: "{resource group name}kv"       # Replace resource group name. Key Vault name is generated by Bicep.
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-kvname-podid"       
---
    
kind: Service
apiVersion: v1
metadata:
  name: todo
spec:
  selector:
    app: todo
    aadpodidbinding: "cosmostodo-apppodidentity"    
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

デプロイ YAML を適用する

kubectl apply をもう一度使って、アプリケーションのポッドをデプロイし、ロード バランサー経由でポッドを公開します。

kubectl apply \
  --filename akstododeploy.yml \
  --namespace 'my-app'

アプリケーションをテストする

アプリケーションが実行されると、Kubernetes サービスによってアプリケーションのフロント エンドがインターネットに公開されます。 このプロセスが完了するまでに数分かかることがあります。

kubectl get を使用して、ロード バランサーによって公開される外部 IP を表示します。

kubectl get services \
  --namespace "my-app"

アプリケーションにアクセスするには、ブラウザーで出力として受け取った IP アドレスを開きます。

リソースのクリーンアップ

Azure の料金がかからないように、クラスターが必要なくなったら、不要なリソースをクリーンアップします。 az group deleteaz deployment sub delete を使用して、リソース グループとサブスクリプションのデプロイをそれぞれ削除します。

az group delete \
  --resource-group $rgName 
  --yes

az deployment sub delete \
  --name $deploymentName

次の手順