When using ARM templates you often end up with many lines of code. There are some gems available that help you reducing your code to a minimum (which normally is still a lot). If you need to create multiple instances of resources, there is a function available that helps you to achieve this goal with very few code. By using a simple ‘copy’ one can create multiple instances of a specific resource.In this example I want create five resource group by using the copy/count property. Of course, all instances need unique names, this is why I use the copyIndex() to generate the resource name. copyIndex represents the iteration number of the resource creation loop.
{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"location":{
"type":"string",
"defaultValue":"West Europe"
}
},
"variables":{
},
"resources":[
{
"type":"Microsoft.Resources/resourceGroups",
"apiVersion":"2018-05-01",
"location":"[parameters('location')]",
"name":"[concat('w-rgr-user',copyIndex())]",
"copy": {
"name" "resourcegroupcopy"
"count": 5
}
}
],
"outputs":{
}
}
The result looks like this:

As the name is concatenated from the prefix ‘w-rgr-user’ and the copyIndex, you can see that the first iterations obviously has the iteration number 0. This can be changed by adding a copyIndex offset.
"name":"[concat('w-rgr-user',copyIndex(11))]",
This now starts the iteration counting with 11 and so the results now looks like this:

If you want to add more meaningful names this can also be done. For that, the template needs to be modified slighthly. Let’s say we want to include a personal name in the resource group name. For that I added a new parameter that holds all five names I need in an array of default values. To create the name I now need to iterate through the five names by using the copyIndex value (0-4) to access the values in the parameters array. 0 would be Marcel, 1 would be Alexa etc.
{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion":"1.0.0.0",
"parameters":{
"location":{
"type":"string",
"defaultValue":"West Europe"
},
"resourceGroupNames": {
"type": "array",
"defaultValue": [
"Marcel",
"Alexa",
"Siri",
"Peter",
"John"
]
}
},
"variables":{
},
"resources":[
{
"type":"Microsoft.Resources/resourceGroups",
"apiVersion":"2018-05-01",
"location":"[parameters('location')]",
"name":"[concat('w-rgr-', parameters('resourceGroupNames')[copyIndex()])]",
"copy": {
"name" "resourcegroupcopy"
"count": 5
}
}
],
"outputs":{
}
}
Again, this is the results looks like.

That’s it. Have fun!
Cheers,
Marcel


