チュートリアル: Azure CLI を使用して Dapr アプリケーションを Azure Container Apps にデプロイする

Dapr (分散型アプリケーション ランタイム) は、開発者が回復性がある信頼性の高いマイクロサービスを構築するのに役立ちます。 このチュートリアルでは、サンプルの Dapr アプリケーションを Azure Container Apps にデプロイします。

学習内容は次のとおりです。

  • コンテナー アプリのための Container Apps 環境を作成する
  • コンテナー アプリのための Azure Blob Storage 状態ストアを作成する
  • メッセージを生成して使用し、状態ストアでそれらを永続化する 2 つのアプリをデプロイする
  • 2 つのマイクロサービス間の相互作用を確認する。

Azure Container Apps では、マイクロサービスを構築するときに、Dapr API のフル マネージド バージョンが提供されます。 Azure Container Apps で Dapr を使用する場合は、マイクロサービスの横で豊富な機能を提供する、サイドカーを有効にすることができます。 使用可能な Dapr API には、サービス間の呼び出しPub/Subイベント バインド状態ストアアクターが含まれます。

このチュートリアルでは、Dapr Hello World クイックスタートから同じアプリケーションをデプロイします。

アプリケーションは以下で構成されます:

  • メッセージを生成するクライアント (Python) コンテナー アプリ。
  • これらのメッセージを状態ストアで使用し保持するサービス (ノード) コンテナー アプリ

次のアーキテクチャ図は、このチュートリアルを構成するコンポーネントを示しています。

Azure Container Apps での Dapr Hello World マイクロサービスのアーキテクチャ図

セットアップ

まず、Azure にサインインします。 次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。

az login

次に、CLI 用の Azure Container Apps 拡張機能をインストールします。

az extension add --name containerapp --upgrade

最新の拡張機能またはモジュールがインストールされたので、Microsoft.App 名前空間を登録します。

注意

Azure Container Apps リソースは、Microsoft.Web 名前空間から Microsoft.App 名前空間に移行されました。 詳細については、「2022 年 3 月に Microsoft.Web から Microsoft.App に名前空間を移行する」を参照してください。

az provider register --namespace Microsoft.App

Azure Monitor Log Analytics ワークスペースの Microsoft.OperationalInsights プロバイダーを登録します (以前に使用したことがない場合)。

az provider register --namespace Microsoft.OperationalInsights

次に、次の環境変数を設定します。

RESOURCE_GROUP="my-container-apps"
LOCATION="canadacentral"
CONTAINERAPPS_ENVIRONMENT="my-environment"

これらの変数を定義すると、新しいコンテナー アプリに関連するサービスを整理するためのリソース グループを作成できます。

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

CLI がアップグレードされ、新しいリソース グループが使用可能になったら、Container Apps 環境を作成し、コンテナー アプリをデプロイできます。

環境の作成

Azure Container Apps 環境では、コンテナー アプリのグループを囲むセキュリティ保護された境界が作成されます。 同じ環境にデプロイされた Container Apps は、同じ仮想ネットワークにデプロイされ、同じ Log Analytics ワークスペースにログを書き込みます。


個々のコンテナー アプリが、Azure Container Apps 環境にデプロイされます。 環境を作成するために、次のコマンドを実行します。

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

状態ストアを設定する

Azure Blob Storage アカウントを作成する

環境をデプロイしたら、次の手順として、マイクロサービスの 1 つがデータを格納するために使う Azure Blob Storage アカウントをデプロイします。 サービスをデプロイする前に、ストレージ アカウントの名前を選択する必要があります。 ストレージ アカウント名は、"Azure 内で一意" であり、長さは 3 ~ 24 文字で、数字と小文字のみを含める必要があります。

STORAGE_ACCOUNT_NAME="<storage account name>"

次のコマンドを使用して、Azure Storage アカウントを作成します。

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

ノード アプリのユーザー割り当て ID を構成する

Container Apps ではユーザー割り当てマネージド ID とシステム割り当てマネージド ID の両方がサポートされていますが、ユーザー割り当て ID を使うと、Dapr 対応ノード アプリに Blob ストレージ アカウントにアクセスするためのアクセス許可が提供されます。

  1. ユーザー割り当て ID を作成します。
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

principalId プロパティと id プロパティを取得し、変数に格納します。

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. ユーザー割り当て ID に Storage Blob Data Contributor ロールを割り当てます

現在のサブスクリプションのサブスクリプション ID を取得します。

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

状態ストア コンポーネントを構成する

Dapr を使用して外部リソースに対する認証を行う方法は複数あります。 この例では、実行時に Dapr シークレット API を使用せず、Azure ベースの状態ストアを使用します。 そのため、シークレット ストア コンポーネントを作成せず、代わりにマネージド ID を使ってノード アプリから BLOB ストアに直接アクセスすることができます。 Azure 以外の状態ストアや実行時に Dapr シークレット API を使用したい場合は、シークレット ストア コンポーネントを作成できます。 実行時に参照できるように、このコンポーネントはランタイム シークレットを読み込みます。

テキスト エディターを開き、前の手順でソースとして指定したプロパティを使用して、statestore.yaml という名前の構成ファイルを作成します。 このファイルにより、Dapr アプリが状態ストアにアクセスできるようになります。 次の例は、Azure Blob Storage アカウント用に構成された場合に、statestore.yaml ファイルがどのようになるかを示しています。

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

このファイルを使うには、プレースホルダーを更新します。

  • <STORAGE_ACCOUNT_NAME> を、定義した STORAGE_ACCOUNT_NAME 変数の値に置き換えます。 その値を取得するには、次のコマンドを実行します。
echo $STORAGE_ACCOUNT_NAME
  • <MANAGED_IDENTITY_CLIENT_ID> を、定義した CLIENT_ID 変数の値に置き換えます。 その値を取得するには、次のコマンドを実行します。
echo $CLIENT_ID

コンポーネントの yaml ファイルを保存したディレクトリに移動し、次のコマンドを実行して、Container Apps 環境で Dapr コンポーネントを構成します。 Dapr コンポーネントの構成の詳細については、Dapr コンポーネントの構成に関するページ参照してください。

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

サービス アプリケーションをデプロイする (HTTP Web サーバー)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --target-port 3000 \
  --ingress 'internal' \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

既定では、イメージは Docker Hub からプルされます。

クライアント アプリケーション (ヘッドレス クライアント) をデプロイする

次のコマンドを実行して、クライアント コンテナー アプリをデプロイします。

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

結果を確認する

状態が正常に永続化されたことを確認する

Azure Storage アカウントのデータを表示すると、サービスが正常に動作していることを確認できます。

  1. ブラウザーで Azure portal を開き、お使いのストレージ アカウントに移動します。

  2. 左側のメニューで [コンテナー] を選択します。

  3. [mycontainer] を選びます。

  4. コンテナーに order という名前のファイルが表示されていることを確認します。

  5. ファイルを選択します。

  6. [編集] タブを選択します。

  7. [更新] ボタンを選択して、データがどのように自動的に更新されるかを確認します。

ログの表示

コンテナー アプリからのログは、Log Analytics ワークスペースの ContainerAppConsoleLogs_CL カスタム テーブルに格納されます。 Azure portal または CLI を使用してログを表示できます。 テーブルがワークスペースに表示されるまでに、最初は少し遅延が発生することがあります。

次の CLI コマンドを使用して、コマンド ラインを使ってログを表示します。

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table |

次の出力は、CLI コマンドから返される応答の種類を示しています。

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

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

お疲れさまでした。 このチュートリアルは完了しました。 このチュートリアルの一環として作成したリソースを削除したい場合は、次のコマンドを実行します。

注意事項

次のコマンドを実行すると、指定したリソース グループとそれに含まれるすべてのリソースが削除されます。 指定したリソース グループにこのチュートリアルの範囲外のリソースが含まれている場合、それらも削除されます。

az group delete --resource-group $RESOURCE_GROUP

注意

pythonapp は、構成された状態ストアに永続化されるメッセージを使用して nodeapp を継続的に呼び出します。そのため、継続的な課金対象の操作を回避するために、これらのクリーンアップ手順を完了することが重要です。

ヒント

問題がある場合は、 GitHub の Azure Container Apps リポジトリでイシューを開いて、お知らせください。

次のステップ