Search code examples
azureazure-cloud-services

How to properly use `outputs` in Azure Blueprints?


I have a misunderstanding how blueprint outputs works and how to properly import values from one artifact to another.

Let me describe my attempts to get variable from artifact:

I have created two artifacts inside resource groups:

enter image description here

I have tried to transfer variables like vnet_name, vnet_addresses from VNET artifact to SUBNET_AKS artifact using the following syntax:

VNET:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
........
  "outputs": {
    "vnet_name_output": {
      "type": "string",
      "value": "[variables('vnet_name')]"
    },
    "vnet_ip_range_output": {
      "type": "string",
      "value": "[parameters('vnet_ip_range')]"
    },
    "vnet_path_output": {
      "type": "string",
      "value": "[resourceId('Microsoft.Network/virtualNetworks', variables('vnet_name'))]"
    }
  }
}

Next step was to add output variable to SUBNET_AKS artifacts:

 "resources": [
    {
      "apiVersion": "2018-04-01",
      "type": "Microsoft.Network/virtualNetworks/subnets",
      "name": "[concat(artifacts('VNET').outputs.vnet_name_output, '/', concat(parameters('deployment_prefix'),'-aks-subnet'))]",

But the following error appears:

Deployment template validation failed: 'The template resource '[concat(artifacts('VNET').outputs.vnet_name_output, '/', concat(parameters('deployment_prefix'),'-aks-subnet'))]' at line '27' and column '9' is not valid: The template function 'artifacts' is not valid. Please see https://aka.ms/arm-template-expressions for usage details.. Please see https://aka.ms/arm-template-expressions for usage details.'.

How can I understand how outputs parameters should properly work in Azure Blueprint definition?


Solution

  • Azure Blueprint is just an orchestration layer responsible for the ordering and deployment of artifact(s). ARM templates are one of three valid types - policyAssignment and roleAssignment are the other two.

    This means you have two "template" artifacts: VNET and SUBNET_AKS. Each one should be treated like an actor / black-box, meaning you can only use functions available to ARM templates. If you need a parameter from the Blueprint it must come in as a parameter.

    That is why you are getting that particular syntax error. The artifacts() function is only available to Blueprints.

    Instead, you need to update your ARM template so that it specifies a named output value. In your Azure Blueprint, you can reference the output of a prior artifact as an input parameter to a subsequent Blueprint artifact.

    Hopefully these code snippets and docs can point you in the right direction.