Azure Resource Manager templates are great to deploy one or more resources to a resource group.
A mandatory part of an ARM template is the resources section that defines the resource types that are deployed or updated. Here is an example:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Storage/storageAccounts", "name": "myuniquestorageaccountname", "apiVersion": "2016-01-01", "location": "West Europe", "sku": { "name": "Standard_LRS" }, "kind": "Storage", "properties": {} } ] }
The name of a resource type has the following format: {resource-provider}/{resource-type}
. In this example Microsoft.Storage/storageAccounts
. The apiVersion
specifies the version of the API that is used to deploy/manage the resource.
A resource provider offers a set of operations to deploy and manage resources using a REST API. If a resource provider adds new features, it releases a new version of the API. Therefore, if you have to utilize new features you may have to use the latest API Version. To determine the latest version of a resource type you can use the following Get-AzureRmResourceProviderLatestApiVersion
cmdlet:
function Get-AzureRmResourceProviderLatestApiVersion { [CmdletBinding()] [Alias()] [OutputType([string])] Param ( [Parameter(ParameterSetName = 'Full', Mandatory = $true, Position = 0)] [string]$Type, [Parameter(ParameterSetName = 'ProviderAndType', Mandatory = $true, Position = 0)] [string]$ResourceProvider, [Parameter(ParameterSetName = 'ProviderAndType', Mandatory = $true, Position = 1)] [string]$ResourceType, [switch]$IncludePreview ) # retrieving the resource providers is time consuming therefore we store # them in a script variable to accelerate subsequent requests. if (-not $script:resourceProvider) { $script:resourceProvider = Get-AzureRmResourceProvider } if ($PSCmdlet.ParameterSetName -eq 'Full') { $ResourceProvider = ($Type -replace "\/.*") $ResourceType = ($Type -replace ".*?\/(.+)", '$1') } $provider = $script:resourceProvider | Where-Object { $_.ProviderNamespace -eq $ResourceProvider -and $_.ResourceTypes.ResourceTypeName -eq $ResourceType } if ($IncludePreview) { $provider.ResourceTypes.ApiVersions[0] } else { $provider.ResourceTypes.ApiVersions | Where-Object { $_ -notmatch '-preview' } | Select-Object -First 1 } }
You can now determine the latest API Version using either the full type:
Get-AzureRmResourceProviderLatestApiVersion -Type Microsoft.Storage/storageAccounts
Or bypassing the Resource Provider and Resource Type:
Get-AzureRmResourceProviderLatestApiVersion -ResourceProvider Microsoft.Storage -ResourceType storageAccounts
Finally, to include preview versions you can append the -IncludePreview
switch:
Get-AzureRmResourceProviderLatestApiVersion -Type Microsoft.Storage/storageAccounts -IncludePreview
You can download the script from my GitHub repository.
Additional information: Resource providers and types