次の方法で共有


チュートリアル: 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 マイクロサービスのアーキテクチャ図

セットアップ

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

az login

最新バージョンの CLI を実行していることを確認するには、upgrade コマンドを実行します。

az upgrade

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

Azure CLI で az containerapp コマンドを実行したとき、または Azure PowerShell で Az.App モジュールからコマンドレットを実行したときに、パラメーターの不足に関するエラーが表示される場合は、最新バージョンの Azure Container Apps 拡張機能がインストールされていることを確認してください。

az extension add --name containerapp --upgrade

Note

2024 年 5 月以降、Azure CLI 拡張機能では、既定でプレビュー機能が有効になりません。 Container Apps のプレビュー機能にアクセスするには、--allow-preview true を使用して Container Apps 拡張機能をインストールします。

az extension add --name containerapp --upgrade --allow-preview true

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

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

環境変数を設定する

以下の環境変数を設定します。 ''<プレースホルダー>'' は実際の値に置き換えてください。

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

Azure リソース グループの作成

コンテナー アプリのデプロイに関連するサービスを整理するためのリソース グループを作成します。

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

環境の作成

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

環境を作成するために、次のコマンドを実行します。

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 \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

Azure Container Registry を使用している場合は、コマンドに --registry-server <REGISTRY_NAME>.azurecr.io フラグを含めます。

既定では、イメージは 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 Container Registry を使用している場合は、コマンドに --registry-server <REGISTRY_NAME>.azurecr.io フラグを含めます。

結果を確認する

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

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

Note

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

ヒント

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

次のステップ