Add a custom image to an Azure scale set template
Note
This document covers Virtual Machine Scale Sets running in Uniform Orchestration mode. We recommend using Flexible Orchestration for new workloads. For more information, see Orchesration modes for Virtual Machine Scale Sets in Azure.
This article shows how to modify the basic scale set template to deploy from custom image.
Change the template definition
In a previous article we had created a basic scale set template. We will now use that earlier template and modify it to create a template that deploys a scale set from a custom image.
Creating a managed disk image
If you already have a custom managed disk image (a resource of type Microsoft.Compute/images
), then you can skip this section.
First, add a sourceImageVhdUri
parameter, which is the URI to the generalized blob in Azure Storage that contains the custom image to deploy from.
},
"adminPassword": {
"type": "securestring"
+ },
+ "sourceImageVhdUri": {
+ "type": "string",
+ "metadata": {
+ "description": "The source of the generalized blob containing the custom image"
+ }
}
},
"variables": {},
Next, add a resource of type Microsoft.Compute/images
, which is the managed disk image based on the generalized blob located at URI sourceImageVhdUri
. This image must be in the same region as the scale set that uses it. In the properties of the image, specify the OS type, the location of the blob (from the sourceImageVhdUri
parameter), and the storage account type:
"resources": [
{
+ "type": "Microsoft.Compute/images",
+ "apiVersion": "2019-03-01",
+ "name": "myCustomImage",
+ "location": "[resourceGroup().location]",
+ "properties": {
+ "storageProfile": {
+ "osDisk": {
+ "osType": "Linux",
+ "osState": "Generalized",
+ "blobUri": "[parameters('sourceImageVhdUri')]",
+ "storageAccountType": "Standard_LRS"
+ }
+ }
+ }
+ },
+ {
"type": "Microsoft.Network/virtualNetworks",
"name": "myVnet",
"location": "[resourceGroup().location]",
In the scale set resource, add a dependsOn
clause referring to the custom image to make sure the image gets created before the scale set tries to deploy from that image:
"location": "[resourceGroup().location]",
"apiVersion": "2019-03-01-preview",
"dependsOn": [
- "Microsoft.Network/virtualNetworks/myVnet"
+ "Microsoft.Network/virtualNetworks/myVnet",
+ "Microsoft.Compute/images/myCustomImage"
],
"sku": {
"name": "Standard_A1",
Changing scale set properties to use the managed disk image
In the imageReference
of the scale set storageProfile
, instead of specifying the publisher, offer, sku, and version of a platform image, specify the id
of the Microsoft.Compute/images
resource:
"virtualMachineProfile": {
"storageProfile": {
"imageReference": {
"id": "[resourceId('Microsoft.Compute/images', omImage')]"
}
},
"osProfile": {
...
}
}
In this example, use the resourceId
function to get the resource ID of the image created in the same template. If you have created the managed disk image beforehand, you should provide the ID of that image instead. This ID must be of the form: /subscriptions/<subscription-id>resourceGroups/<resource-group-name>/providers/Microsoft.Compute/images/<image-name>
.
Next Steps
You can deploy the preceding template by following the Azure Resource Manager documentation.
You can start this tutorial series from the basic scale set template article.
You can see how to modify the basic scale set template to deploy the scale set into an existing virtual network.
You can see how to modify the basic scale set template to deploy the scale set with a custom image.
You can see how to modify the basic scale set template to deploy a Linux scale set with guest-based autoscale.
For more information about scale sets, refer to the scale set overview page.