次の方法で共有


クイックスタート: Azure CLI を使用して Dapr アプリケーションを Azure Container Apps にデプロイする

Dapr (分散型アプリケーション ランタイム) は、開発者が回復性がある信頼性の高いマイクロサービスを構築するのに役立ちます。 このクイックスタートでは、Dapr サイドカーをマイクロサービス コンテナー アプリと並行して実行できるようにする方法について説明します。 次のことを行います。

  • 自分のコンテナー アプリ用の Container Apps 環境と Azure Blog Storage 状態ストアを作成します。
  • メッセージを発行する Python コンテナー アプリをデプロイします。
  • メッセージをサブスクライブし、それらを状態ストアに保持する Node.js コンテナー アプリをデプロイします。
  • Azure portal を使用して、2 つのマイクロサービス間の相互作用を確認します。

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

このクイックスタートでは、オープンソースの 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

環境変数を設定する

以下の環境変数を設定します。 <PLACEHOLDERS> は、実際の値に置き換えます:

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 アカウントを作成する

環境がデプロイされたら、Node.js コンテナー アプリがデータを格納するために使用する Azure Blob Storage アカウントをデプロイします。 サービスをデプロイする前に、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 対応の Node.js アプリに Blob Storage アカウントにアクセスするためのアクセス許可が提供されます。

  1. ユーザー割り当て ID を作成します。

    az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity"     --output json
    
  2. 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 \")
    
  3. 現在のサブスクリプションのサブスクリプション ID を取得します。

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    
  4. ユーザー割り当て ID に、Storage Blob Data Contributor ロールを割り当てます。

    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 を介して外部リソースに対して認証するためには、複数のオプションがあります。 この例では、Azure ベースの状態ストアを使用するため、マネージド ID を使用して、Node.js アプリから Blob ストアに直接アクセスできます。

  1. テキスト エディターで、前の手順でソースとして指定したプロパティを使用して、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
    

    このファイルにより、Dapr アプリが状態ストアにアクセスできるようになります。

  2. yaml ファイルを保存したディレクトリに移動し、次のコマンドを実行して、Container Apps 環境で Dapr コンポーネントを構成します。

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

Node.js アプリケーションをデプロイする

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 からプルされます。

Python アプリケーションをデプロイする

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. コンテナー アプリを選択します。

  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

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

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

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

注意事項

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

az group delete --resource-group $RESOURCE_GROUP

ヒント

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

次のステップ