Search code examples
azureazure-rm-template

Azure ARM Template user defined function


I need to create 8 database and couple of collections though ARM template.I was going through the user defined function here https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/template-user-defined-functions to make the template simpler, Is that something I can achieve instead of copy paste the same scripts? right now, its throwing an error

Template validation failed: Unexpected initial token 'String' when populating object.

My current Function:

"functions": [
    {
      "namespace": "contoso",
      "members": {
        "uniqueName": {
          "parameters": [
            {
              "name": "databaseName",
              "type": "string"
            }
          ],
          "output": {
            "type": "object",
            "value": {
              "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
              "name": "['test', '/', parameters('databaseName'))]",
              "apiVersion": "2020-04-01",
              "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
              "properties": {
                "resource": {
                  "id": "[parameters('databaseName')]"
                }
              }
            }
          }
        }
      }
    }
  ],

Is that something we can achieve?

Update: Here is the simplified version

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "accountName": {
            "type": "string",
            "defaultValue": "test",
            "metadata": {
                "description": "Cosmos DB account name"
            }
        },
        "databaseName": {
            "type": "string",
            "metadata": {
                "description": "Cosmos DB database name"
            }
        }
    },
    "functions": [
        {
            "namespace": "contoso",
            "members": {
                "uniqueName": {
                    "parameters": [
                        {
                            "name": "databaseName",
                            "type": "string"
                        }
                    ],
                    "output": {
                        "type": "object",
                        "value": {
                            "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
                            "name": "[concat('/test', '/', parameters('databaseName'))]",
                            "apiVersion": "2020-04-01",
                            "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
                            "properties": {
                                "resource": {
                                    "id": "[parameters('databaseName')]"
                                }
                            }
                        }
                    }
                }
            }
        }
    ],
    "resources": [
        {
            "type": "Microsoft.DocumentDB/databaseAccounts",
            "name": "[parameters('accountName')]",
            "apiVersion": "2020-04-01",
            "location": "central us",
            "kind": "MongoDB",
            "properties": {
                "isVirtualNetworkFilterEnabled": false,
                "databaseAccountOfferType": "Standard",
                "apiProperties": {
                    "serverVersion": "3.6"
                }
            }
        },
        "[contoso.uniqueName(parameters('databaseName'))]"
    ]
}

Solution

  • Looks like you're trying to create several mongodbDatabases within the databaseAccounts resource.

    I recommend looking at the ARM copy element. https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/copy-resources#resource-iteration

    It would look roughly like:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "accountName": {
          "type": "string",
          "defaultValue": "test",
          "metadata": {
            "description": "Cosmos DB account name"
          }
        },
        "databaseNames": {
          "type": "array",
          "defaultValue": [
            "contoso",
            "fabrikam",
            "coho"
          ],
          "metadata": {
            "description": "Cosmos DB database names array"
          }
        }
      },
      "resources": [
        {
          "type": "Microsoft.DocumentDB/databaseAccounts",
          "name": "[parameters('accountName')]",
          "apiVersion": "2020-04-01",
          "location": "central us",
          "kind": "MongoDB",
          "properties": {
            "isVirtualNetworkFilterEnabled": false,
            "databaseAccountOfferType": "Standard",
            "apiProperties": {
              "serverVersion": "3.6"
            }
          }
        },
        {
          "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
          "name": "[concat('/test', '/', parameters('databaseNames')[copyIndex()])]",
          "apiVersion": "2020-04-01",
          "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
          "properties": {
            "resource": {
              "id": "[parameters('databaseNames')[copyIndex()]]"
            }
          },
          "copy": {
            "name": "databaseCopy",
            "count": "[length(parameters('databaseNames'))]"
          }
        }
      ]
    }