Bird
Raised Fist0
Azurecloud~5 mins

ARM template outputs in Azure - Commands & Configuration

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
When you deploy resources in Azure using ARM templates, you often want to see important information about what was created. Outputs let you get this information easily after deployment, like IP addresses or resource IDs.
When you want to know the public IP address of a virtual machine after deployment.
When you need to pass resource IDs from one template to another in a deployment pipeline.
When you want to confirm the names or locations of resources created by your template.
When you want to display connection strings or URLs generated during deployment.
When you want to debug or verify that your template created resources with expected properties.
Config File - azuredeploy.json
azuredeploy.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string",
      "defaultValue": "examplestorageacct",
      "metadata": {
        "description": "Name of the storage account"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]",
      "location": "eastus",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],
  "outputs": {
    "storageAccountId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
    },
    "storageAccountPrimaryLocation": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))).primaryLocation]"
    }
  }
}

This ARM template creates a storage account with a given name in the East US region.

The outputs section defines two outputs:

  • storageAccountId: The full resource ID of the storage account, useful for referencing it elsewhere.
  • storageAccountPrimaryLocation: The primary location of the storage account, retrieved from the resource's properties.

These outputs let you see key information after deployment.

Commands
This command deploys the ARM template to the resource group named 'example-rg' with the storage account name parameter set. It creates the storage account and outputs the deployment results including the outputs defined.
Terminal
az deployment group create --resource-group example-rg --template-file azuredeploy.json --parameters storageAccountName=examplestorageacct
Expected OutputExpected
{ "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Resources/deployments/deployment1", "name": "deployment1", "properties": { "outputs": { "storageAccountId": { "type": "String", "value": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Storage/storageAccounts/examplestorageacct" }, "storageAccountPrimaryLocation": { "type": "String", "value": "eastus" } }, "provisioningState": "Succeeded" } }
--resource-group - Specifies the Azure resource group to deploy the template into
--template-file - Specifies the path to the ARM template JSON file
--parameters - Sets the parameters for the template deployment
This command retrieves and shows only the outputs from the deployment named 'deployment1' in the resource group. It helps you quickly see the output values without extra details.
Terminal
az deployment group show --resource-group example-rg --name deployment1 --query properties.outputs
Expected OutputExpected
{ "storageAccountId": { "type": "String", "value": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Storage/storageAccounts/examplestorageacct" }, "storageAccountPrimaryLocation": { "type": "String", "value": "eastus" } }
--query - Filters the output to show only the outputs section
Key Concept

If you remember nothing else from this pattern, remember: ARM template outputs let you get important information about deployed resources immediately after deployment.

Common Mistakes
Not defining outputs in the ARM template and expecting to see resource details after deployment.
Without outputs, the deployment command does not return specific resource information, making it hard to get useful data.
Always define outputs in your ARM template for any resource information you want to retrieve after deployment.
Using incorrect expressions in the outputs value, like missing resourceId or reference functions.
Incorrect expressions cause deployment errors or empty output values.
Use proper ARM template functions like resourceId() and reference() to get resource properties in outputs.
Not specifying the deployment name when querying outputs with az deployment group show.
Without the deployment name, the command cannot find the correct deployment outputs.
Always provide the deployment name with --name flag to retrieve outputs.
Summary
Define outputs in your ARM template to get useful information about deployed resources.
Use az deployment group create to deploy the template and see outputs in the deployment result.
Use az deployment group show with --query to retrieve outputs separately after deployment.

Practice

(1/5)
1. What is the main purpose of outputs in an ARM template?
easy
A. To display important information after deployment
B. To define the resources to deploy
C. To specify deployment parameters
D. To set access permissions for resources

Solution

  1. Step 1: Understand the role of outputs in ARM templates

    Outputs are used to show key information after the deployment finishes, such as resource IDs or connection strings.
  2. Step 2: Differentiate outputs from other template sections

    Resources define what to deploy, parameters set inputs, and outputs show results after deployment.
  3. Final Answer:

    To display important information after deployment -> Option A
  4. Quick Check:

    Outputs = show info after deployment [OK]
Hint: Outputs always show info after deployment [OK]
Common Mistakes:
  • Confusing outputs with parameters
  • Thinking outputs define resources
  • Assuming outputs set permissions
2. Which of the following is the correct syntax to define an output named storageAccountName of type string in an ARM template?
easy
A. "outputs": { "storageAccountName": { "type": "string", "val": "[variables('storageName')]" } }
B. "outputs": { "storageAccountName": { "type": "string", "value": "[variables('storageName')]" } }
C. "outputs": { "storageAccountName": { "datatype": "string", "value": "[variables('storageName')]" } }
D. "outputs": { "storageAccountName": { "type": "string", "value": "variables('storageName')" } }

Solution

  1. Step 1: Check the required keys for output

    An output must have a "type" key specifying the data type and a "value" key with an expression or value.
  2. Step 2: Validate the syntax for referencing variables

    The value must be an expression in square brackets, e.g., "[variables('storageName')]".
  3. Final Answer:

    "outputs": { "storageAccountName": { "type": "string", "value": "[variables('storageName')]" } } -> Option B
  4. Quick Check:

    Output syntax = type + value with [expression] [OK]
Hint: Outputs need "type" and "value" keys with expressions in brackets [OK]
Common Mistakes:
  • Using 'datatype' instead of 'type'
  • Using 'val' instead of 'value'
  • Missing brackets around expressions
3. Given this output snippet in an ARM template:
"outputs": { "appEndpoint": { "type": "string", "value": "[concat('https://', reference(resourceId('Microsoft.Web/sites', variables('appName'))).defaultHostName)]" }}

What will appEndpoint output after deployment?
medium
A. The app name only
B. The resource ID of the web app
C. The full URL of the deployed web app
D. An error because of wrong syntax

Solution

  1. Step 1: Understand the expression used in the output value

    The expression uses concat to build a URL string starting with 'https://' and appends the defaultHostName property of the web app resource.
  2. Step 2: Determine what reference() returns

    reference() fetches runtime properties of the deployed resource, here the web app's hostname.
  3. Final Answer:

    The full URL of the deployed web app -> Option C
  4. Quick Check:

    Output builds URL using reference() = full URL [OK]
Hint: reference() gets deployed resource info, concat builds URL [OK]
Common Mistakes:
  • Thinking output returns resource ID instead of hostname
  • Confusing variable name with output value
  • Assuming syntax error due to complex expression
4. You have this output defined:
"outputs": { "storageKey": { "type": "string", "value": "listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageName')), '2021-04-01').keys[0].value" }}

After deployment, you get an error. What is the likely cause?
medium
A. Missing square brackets around the expression value
B. Incorrect API version in listKeys function
C. Output type should be 'securestring' instead of 'string'
D. Variables section missing the storageName variable

Solution

  1. Step 1: Check the syntax for output value expressions

    Output values must be enclosed in square brackets to indicate an expression, e.g., "[expression]".
  2. Step 2: Identify the missing brackets in the given output

    The value is missing the surrounding brackets, so ARM treats it as a literal string causing an error.
  3. Final Answer:

    Missing square brackets around the expression value -> Option A
  4. Quick Check:

    Output expressions need [ ] brackets [OK]
Hint: Always wrap output expressions in [ ] brackets [OK]
Common Mistakes:
  • Forgetting brackets around expressions
  • Assuming API version is wrong without checking
  • Confusing output type with expression syntax
5. You want to output a list of VM names created by a loop in your ARM template. Which output definition correctly returns an array of VM names?
hard
A. "outputs": { "vmNames": { "type": "array", "value": "[array(variables('vmNames'))]" } }
B. "outputs": { "vmNames": { "type": "object", "value": "variables('vmNames')" } }
C. "outputs": { "vmNames": { "type": "string", "value": "[variables('vmNames')]" } }
D. "outputs": { "vmNames": { "type": "array", "value": "[variables('vmNames')]" } }

Solution

  1. Step 1: Identify the correct output type for a list of names

    A list of VM names is an array, so the output type should be "array".
  2. Step 2: Check the syntax for output value expressions

    The value must be an expression enclosed in brackets, e.g., "[variables('vmNames')]". Wrapping with array() is unnecessary if vmNames is already an array.
  3. Final Answer:

    "outputs": { "vmNames": { "type": "array", "value": "[variables('vmNames')]" } } -> Option D
  4. Quick Check:

    Output array = type array + value in [ ] [OK]
Hint: Use type 'array' and wrap value in [ ] brackets [OK]
Common Mistakes:
  • Using type 'string' for arrays
  • Omitting brackets around expressions
  • Adding unnecessary array() function