チュートリアル: 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 リソースがデプロイされます。
- リソースを整理するためのリソース グループ
- 認証用のマネージド ID
- コンテナー イメージを格納するための コンテナー レジストリ
- AKS クラスター
- AKS を構成するための仮想ネットワーク
- Azure Cosmos DB for NoSQL アカウントとデータベース、コンテナー、SQL ロール
- セキュリティ保護キーを格納するためのキー コンテナー
- (オプション) Log Analytics ワークスペース
このチュートリアルでは、Azure Cosmos DB のセキュリティに関する次のベスト プラクティスを使用します。
- ロールベースのアクセス制御 (RBAC) とマネージド ID を使用してアクセス制御を実装します。 これらの機能により、開発者は、サービス間の通信をセキュリティ保護するために使われるシークレット、資格情報、証明書、キーを管理する必要がなくなります。
- 仮想ネットワーク サービス エンドポイントを構成することで、AKS サブネットに Azure Cosmos DB アクセスを制限します。
- 唯一の認証方法として RBAC を適用するように
databaseAccount
リソースでdisableLocalAuth = true
を設定します。
ヒント
このチュートリアルの手順では、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 sign in を使って、既定の 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"
}
リソース グループでデプロイの状態を確認することもできます。
Note
AKS クラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。
Azure Container Registry と AKS をリンクする
次のコマンドを使用して、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 にプッシュする
Visual Studio Code の [エクスプローラー] タブからコンテナー イメージを作成するには、Dockerfile を右クリックして、[イメージのビルド] を選択します。
イメージへのタグ付けに使用する名前とバージョンを求めるプロンプトで、todo:latest という名前を入力します。
[Docker] ペインを使用して、ビルドされたイメージを Azure Container Registry にプッシュします。 [イメージ] ノードの下にビルドされたイメージが表示されます。 todo ノードを開き、[最新] を右クリックして、[プッシュ] を選択します。
プロンプトで、Azure サブスクリプション、Azure Container Registry リソース、イメージ タグを選択します。 イメージ タグの形式は
{acrname}.azurecr.io/todo:latest
にする必要があります。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 delete と az deployment sub delete を使用して、リソース グループとサブスクリプションのデプロイをそれぞれ削除します。
az group delete \
--resource-group $rgName
--yes
az deployment sub delete \
--name $deploymentName