azureazure-rm-templateazure-automation

Check whether a resource exists in ARM template condition


I have an ARM template that I am trying to check whether a given database exist in a condition, if doesn't exist those principals will not be added, my template was validated but my deployment failed because this check didn't happen. How can I achieve this for each resource?

Condition I am using: "condition": "[not(empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseIDPrincipals')[copyIndex()].databaseName)))]"

Also, how can I create a dependency on Data Factory if that resource doesn't exist? I tried with condition as well, but didn't work.

ARM Template:

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "0.0.0.0",
  "parameters": {
    "clusterName": {
      "type": "string"
    },
    "databaseIDPrincipals": {
      "type": "array"
    },
    "databaseADFPrincipals": {
      "type": "array"
    },
    "databaseSYNPrincipals": {
      "type": "array"
    },
    "description": {
      "type": "string",
      "defaultValue": ""
    }
  },
  "resources": [
    {
      "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
      "apiVersion": "2019-11-09",
      "name": "[concat(parameters('clusterName'), '/', parameters('databaseIDPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseIDPrincipals')[copyIndex()].principalId, parameters('databaseIDPrincipals')[copyIndex()].role))]",
      "copy": {
        "name": "databaseIDPrincipalsCopy",
        "count": "[length(parameters('databaseIDPrincipals'))]"
      },
      "condition": "[not(empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseIDPrincipals')[copyIndex()].databaseName)))]",
      "properties": {
        "principalId": "[parameters('databaseIDPrincipals')[copyIndex()].principalId]",
        "role": "[parameters('databaseIDPrincipals')[copyIndex()].role]",
        "tenantId": "[parameters('databaseIDPrincipals')[copyIndex()].tenantId]",
        "principalType": "[parameters('databaseIDPrincipals')[copyIndex()].principalType]"
      },
      "tags": {
        "Version": "0.0.0.0",
        "Description": "[parameters('description')]"
      }
    },
    {
      "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
      "apiVersion": "2019-11-09",
      "name": "[concat(parameters('clusterName'), '/', parameters('databaseADFPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseADFPrincipals')[copyIndex()].principalId, parameters('databaseADFPrincipals')[copyIndex()].role))]",
      "copy": {
        "name": "databaseADFPrincipalsCopy",
        "count": "[length(parameters('databaseADFPrincipals'))]"
      },
      "condition": "[not(empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseADFPrincipals')[copyIndex()].databaseName)))]",
      "properties": {
        "principalId": "[reference(resourceId(parameters('databaseADFPrincipals')[copyIndex()].subscriptionId, parameters('databaseADFPrincipals')[copyIndex()].resourceGroup, 'Microsoft.DataFactory/factories', parameters('databaseADFPrincipals')[copyIndex()].principalId), '2018-06-01','Full').identity.principalId]",
        "role": "[parameters('databaseADFPrincipals')[copyIndex()].role]",
        "tenantId": "[parameters('databaseADFPrincipals')[copyIndex()].tenantId]",
        "principalType": "[parameters('databaseADFPrincipals')[copyIndex()].principalType]"
      },
      "tags": {
        "Version": "0.0.0.0",
        "Description": "[parameters('description')]"
      }
    },
    {
      "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
      "apiVersion": "2019-11-09",
      "name": "[concat(parameters('clusterName'), '/', parameters('databaseSYNPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseSYNPrincipals')[copyIndex()].principalId, parameters('databaseSYNPrincipals')[copyIndex()].role))]",
      "copy": {
        "name": "databaseSYNPrincipalsCopy",
        "count": "[length(parameters('databaseSYNPrincipals'))]"
      },
      "condition": "[not(empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseSYNPrincipals')[copyIndex()].databaseName)))]",
      "properties": {
        "principalId": "[reference(resourceId(parameters('databaseSYNPrincipals')[copyIndex()].subscriptionId, parameters('databaseSYNPrincipals')[copyIndex()].resourceGroup, 'Microsoft.Synapse/workspaces', parameters('databaseSYNPrincipals')[copyIndex()].principalId), '2021-06-01','Full').identity.principalId]",
        "role": "[parameters('databaseSYNPrincipals')[copyIndex()].role]",
        "tenantId": "[parameters('databaseSYNPrincipals')[copyIndex()].tenantId]",
        "principalType": "[parameters('databaseSYNPrincipals')[copyIndex()].principalType]"
      },
      "tags": {
        "Version": "0.0.0.0",
        "Description": "[parameters('description')]"
      }
    }
  ]
}

My current deployment:

enter image description here

But I would like to be something like this (since no database exists yet):

enter image description here


Solution

  • I was able to find the solution by removing the not from condition. Somehow the documentation says otherwise I believe, but anyway.

    Although I still have failure in regarding ADF, which I opened a new thread.

    Here is my final template:

    {
      "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "0.0.0.0",
      "parameters": {
        "clusterName": {
          "type": "string"
        },
        "databaseIDPrincipals": {
          "type": "array"
        },
        "databaseADFPrincipals": {
          "type": "array"
        },
        "databaseSYNPrincipals": {
          "type": "array"
        },
        "description": {
          "type": "string",
          "defaultValue": ""
        }
      },
      "resources": [
        {
          "condition": "[empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseIDPrincipals')[copyIndex()].databaseName))]",
          "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
          "apiVersion": "2019-11-09",
          "name": "[concat(parameters('clusterName'), '/', parameters('databaseIDPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseIDPrincipals')[copyIndex()].principalId, parameters('databaseIDPrincipals')[copyIndex()].role))]",
          "copy": {
            "name": "databaseIDPrincipalsCopy",
            "count": "[length(parameters('databaseIDPrincipals'))]"
          },
          "properties": {
            "principalId": "[parameters('databaseIDPrincipals')[copyIndex()].principalId]",
            "role": "[parameters('databaseIDPrincipals')[copyIndex()].role]",
            "tenantId": "[parameters('databaseIDPrincipals')[copyIndex()].tenantId]",
            "principalType": "[parameters('databaseIDPrincipals')[copyIndex()].principalType]"
          },
          "tags": {
            "Version": "0.0.0.0",
            "Description": "[parameters('description')]"
          }
        },
        {
          "condition": "[empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseADFPrincipals')[copyIndex()].databaseName))]",
          "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
          "apiVersion": "2019-11-09",
          "name": "[concat(parameters('clusterName'), '/', parameters('databaseADFPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseADFPrincipals')[copyIndex()].principalId, parameters('databaseADFPrincipals')[copyIndex()].role))]",
          "copy": {
            "name": "databaseADFPrincipalsCopy",
            "count": "[length(parameters('databaseADFPrincipals'))]"
          },
          "properties": {
            "principalId": "[reference(resourceId(parameters('databaseADFPrincipals')[copyIndex()].subscriptionId, parameters('databaseADFPrincipals')[copyIndex()].resourceGroup, 'Microsoft.DataFactory/factories', parameters('databaseADFPrincipals')[copyIndex()].principalId), '2018-06-01','Full').identity.principalId]",
            "role": "[parameters('databaseADFPrincipals')[copyIndex()].role]",
            "tenantId": "[parameters('databaseADFPrincipals')[copyIndex()].tenantId]",
            "principalType": "[parameters('databaseADFPrincipals')[copyIndex()].principalType]"
          },
          "tags": {
            "Version": "0.0.0.0",
            "Description": "[parameters('description')]"
          }
        },
        {
          "condition": "[empty(resourceId('Microsoft.Kusto/clusters/databases', parameters('clusterName'), parameters('databaseSYNPrincipals')[copyIndex()].databaseName))]",
          "type": "Microsoft.Kusto/clusters/databases/principalAssignments",
          "apiVersion": "2019-11-09",
          "name": "[concat(parameters('clusterName'), '/', parameters('databaseSYNPrincipals')[copyIndex()].databaseName, '/', concat(parameters('databaseSYNPrincipals')[copyIndex()].principalId, parameters('databaseSYNPrincipals')[copyIndex()].role))]",
          "copy": {
            "name": "databaseSYNPrincipalsCopy",
            "count": "[length(parameters('databaseSYNPrincipals'))]"
          },
          "properties": {
            "principalId": "[reference(resourceId(parameters('databaseSYNPrincipals')[copyIndex()].subscriptionId, parameters('databaseSYNPrincipals')[copyIndex()].resourceGroup, 'Microsoft.Synapse/workspaces', parameters('databaseSYNPrincipals')[copyIndex()].principalId), '2021-06-01','Full').identity.principalId]",
            "role": "[parameters('databaseSYNPrincipals')[copyIndex()].role]",
            "tenantId": "[parameters('databaseSYNPrincipals')[copyIndex()].tenantId]",
            "principalType": "[parameters('databaseSYNPrincipals')[copyIndex()].principalType]"
          },
          "tags": {
            "Version": "0.0.0.0",
            "Description": "[parameters('description')]"
          }
        }
      ]
    }