Skip to content

Latest commit

 

History

History
229 lines (159 loc) · 8.6 KB

File metadata and controls

229 lines (159 loc) · 8.6 KB
title Quickstart: Deploy a Dapr App with Azure Resource Manager or Bicep
description Learn how to deploy a Dapr application to Azure Container Apps by using an Azure Resource Manager or Bicep file.
services container-apps
author greenie-msft
ms.service azure-container-apps
ms.subservice dapr
ms.topic quickstart
ms.date 01/28/2026
ms.author nigreenf
ms.reviewer hannahhunter
ms.custom
devx-track-bicep
devx-track-arm-template
devx-track-azurepowershell
build-2025
zone_pivot_groups container-apps

Quickstart: Deploy a Dapr application to Azure Container Apps by using an Azure Resource Manager or Bicep file

Dapr (Distributed Application Runtime) helps developers build resilient, reliable microservices. In this quickstart, you enable Dapr sidecars to run alongside two container apps that produce and consume messages, stored in an Azure Blob Storage state store. Using either Azure Resource Manager or Bicep files, you'll:

[!div class="checklist"]

  • Pass Azure CLI commands to deploy a template that launches everything you need to run microservices.
  • Verify the interaction between the two microservices in the Azure portal.

:::image type="content" source="media/microservices-dapr/azure-container-apps-microservices-dapr.png" alt-text="Architecture diagram of Dapr Hello World microservices on Azure Container Apps.":::

This quickstart mirrors the applications you deploy in the open-source Dapr Hello World quickstart.

Prerequisites

[!INCLUDE container-apps-create-cli-steps.md]

[!INCLUDE container-apps-set-environment-variables.md]

[!INCLUDE container-apps-create-resource-group.md]

Prepare the GitHub repository

Go to the repository holding the ARM and Bicep files that's used to deploy the solution.

Select the Fork button at the top of the repository to fork the repo to your account.

Now you can clone your fork to work with it locally. Use the following git command to clone your forked repo into the acadapr-templates directory.

git clone https://github.com/<your-github-username>/Tutorial-Deploy-Dapr-Microservices-ACA.git acadapr-templates

Deploy

Navigate to the acadapr-templates directory and run the following command:

::: zone pivot="container-apps-arm"

az deployment group create \
  --resource-group $RESOURCE_GROUP \
  --template-file ./azuredeploy.json \
  --parameters environment_name=$CONTAINERAPPS_ENVIRONMENT
$params = @{
  environment_name = $ContainerAppsEnvironment
}

New-AzResourceGroupDeployment `
  -ResourceGroupName $ResourceGroupName `
  -TemplateParameterObject $params `
  -TemplateFile ./azuredeploy.json `
  -SkipTemplateParameterPrompt

::: zone-end

::: zone pivot="container-apps-bicep"

az deployment group create \
  --resource-group $RESOURCE_GROUP \
  --template-file ./azuredeploy.bicep \
  --parameters environment_name=$CONTAINERAPPS_ENVIRONMENT
$params = @{
  environment_name = $ContainerAppsEnvironment

}

New-AzResourceGroupDeployment `
  -ResourceGroupName $ResourceGroupName `
  -TemplateParameterObject $params `
  -TemplateFile ./azuredeploy.bicep `
  -SkipTemplateParameterPrompt

A warning (BCP081) might appear. This warning has no effect on the successful deployment of the application.

::: zone-end


This command deploys:

  • The Container Apps environment and associated Log Analytics workspace for hosting the hello world Dapr solution.
  • An Application Insights instance for Dapr distributed tracing.
  • The nodeapp app server running on targetPort: 3000 with Dapr enabled and configured using:
    • "appId": "nodeapp"
    • "appPort": 3000
    • A user-assigned identity with access to the Azure Blob storage via a Storage Data Contributor role assignment
  • A Dapr component of "type": "state.azure.blobstorage" scoped for use by the nodeapp for storing state.
  • The Dapr-enabled, headless pythonapp that invokes the nodeapp service using Dapr service invocation.
  • A Microsoft Entra ID role assignment for the Node.js app used by the Dapr component to establish a connection to Blob storage.

Verify the result

Confirm successful state persistence

You can confirm that the services are working correctly by viewing data in your Azure Storage account.

  1. Open the Azure portal in your browser.

  2. Go to the newly created storage account in your resource group.

  3. Select Data storage > Containers from the sidebar menu.

  4. Select the created container.

  5. Verify that you can see the file named order in the container.

  6. Select the file.

  7. Select the Edit tab.

  8. Select the Refresh button to observe updates.

View logs

Logs from container apps are stored in the ContainerAppConsoleLogs_CL custom table in the Log Analytics workspace. You can view logs through the Azure portal or via the CLI. There might be a small delay initially for the table to appear in the workspace.

Use the following command to view logs in Bash or PowerShell.

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 | take 5" \
  --out table
$WorkspaceId = (Get-AzContainerAppManagedEnv -ResourceGroupName $ResourceGroupName -EnvName $ContainerAppsEnvironment).LogAnalyticConfigurationCustomerId
$queryResults = Invoke-AzOperationalInsightsQuery -WorkspaceId $WorkspaceId -Query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | take 5"
$queryResults.Results

The following output demonstrates the type of response to expect from the command.

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

Clean up resources

Since pythonapp continuously makes calls to nodeapp with messages that get persisted into your configured state store, it's important to complete these cleanup steps to avoid ongoing billable operations.

If you'd like to delete the resources created as a part of this walkthrough, run the following command.

az group delete \
  --resource-group $RESOURCE_GROUP
Remove-AzResourceGroup -Name $ResourceGroupName -Force

Tip

Having issues? Let us know on GitHub by opening an issue in the Azure Container Apps repo.

Next step

[!div class="nextstepaction"] Learn about Dapr components in Azure Container Apps