winPS createManageVMs PDF
winPS createManageVMs PDF
Azure Virtual Machines (VM ) is one of several types of on-demand, scalable computing resources that Azure
offers. Typically, you choose a VM when you need more control over the computing environment than the other
choices offer. This article gives you information about what you should consider before you create a VM, how you
create it, and how you manage it.
An Azure VM gives you the flexibility of virtualization without having to buy and maintain the physical hardware
that runs it. However, you still need to maintain the VM by performing tasks, such as configuring, patching, and
installing the software that runs on it.
Azure virtual machines can be used in various ways. Some examples are:
Development and test – Azure VMs offer a quick and easy way to create a computer with specific
configurations required to code and test an application.
Applications in the cloud – Because demand for your application can fluctuate, it might make economic
sense to run it on a VM in Azure. You pay for extra VMs when you need them and shut them down when you
don’t.
Extended datacenter – Virtual machines in an Azure virtual network can easily be connected to your
organization’s network.
The number of VMs that your application uses can scale up and out to whatever is required to meet your needs.
METHOD DESCRIPTION
Azure portal Select a location from the list when you create a VM.
Availability
Azure announced an industry leading single instance virtual machine Service Level Agreement of 99.9% provided
you deploy the VM with premium storage for all disks. In order for your deployment to qualify for the standard
99.95% VM Service Level Agreement, you still need to deploy two or more VMs running your workload inside of
an availability set. An availability set ensures that your VMs are distributed across multiple fault domains in the
Azure data centers as well as deployed onto hosts with different maintenance windows. The full Azure SLA
explains the guaranteed availability of Azure as a whole.
VM size
The size of the VM that you use is determined by the workload that you want to run. The size that you choose then
determines factors such as processing power, memory, and storage capacity. Azure offers a wide variety of sizes to
support many types of uses.
Azure charges an hourly price based on the VM’s size and operating system. For partial hours, Azure charges only
for the minutes used. Storage is priced and charged separately.
VM Limits
Your subscription has default quota limits in place that could impact the deployment of many VMs for your
project. The current limit on a per subscription basis is 20 VMs per region. Limits can be raised by filing a support
ticket requesting an increase
Operating system disks and images
Virtual machines use virtual hard disks (VHDs) to store their operating system (OS ) and data. VHDs are also used
for the images you can choose from to install an OS.
Azure provides many marketplace images to use with various versions and types of Windows Server operating
systems. Marketplace images are identified by image publisher, offer, sku, and version (typically version is specified
as latest). Only 64-bit operating systems are supported. For more information on the supported guest operating
systems, roles, and features, see Microsoft server software support for Microsoft Azure virtual machines .
This table shows some ways that you can find the information for an image.
METHOD DESCRIPTION
Azure portal The values are automatically specified for you when you select
an image to use.
You can choose to upload and use your own image and when you do, the publisher name, offer, and sku aren’t
used.
Extensions
VM extensions give your VM additional capabilities through post deployment configuration and automated tasks.
These common tasks can be accomplished using extensions:
Run custom scripts – The Custom Script Extension helps you configure workloads on the VM by running
your script when the VM is provisioned.
Deploy and manage configurations – The PowerShell Desired State Configuration (DSC ) Extension helps
you set up DSC on a VM to manage configurations and environments.
Collect diagnostics data – The Azure Diagnostics Extension helps you configure the VM to collect diagnostics
data that can be used to monitor the health of your application.
Related resources
The resources in this table are used by the VM and need to exist or be created when the VM is created.
Next steps
Create your first VM!
Portal
PowerShell
Azure CLI
Quickstart: Create a Windows virtual machine in the
Azure portal
11/6/2019 • 2 minutes to read • Edit Online
Azure virtual machines (VMs) can be created through the Azure portal. This method provides a browser-based
user interface to create VMs and their associated resources. This quickstart shows you how to use the Azure
portal to deploy a virtual machine (VM ) in Azure that runs Windows Server 2019. To see your VM in action, you
then RDP to the VM and install the IIS web server.
If you don't have an Azure subscription, create a free account before you begin.
Sign in to Azure
Sign in to the Azure portal at https://portal.azure.com.
5. Under Instance details, type myVM for the Virtual machine name and choose East US for your Region,
and then choose Windows Server 2019 Datacenter for the Image. Leave the other defaults.
6. Under Administrator account, provide a username, such as azureuser and a password. The password
must be at least 12 characters long and meet the defined complexity requirements.
7. Under Inbound port rules, choose Allow selected ports and then select RDP (3389) and HTTP (80)
from the drop-down.
8. Leave the remaining defaults and then select the Review + create button at the bottom of the page.
2. In the Connect to virtual machine page, keep the default options to connect by IP address, over port
3389, and click Download RDP file.
3. Open the downloaded RDP file and click Connect when prompted.
4. In the Windows Security window, select More choices and then Use a different account. Type the
username as localhost\username, enter password you created for the virtual machine, and then click OK.
5. You may receive a certificate warning during the sign-in process. Click Yes or Continue to create the
connection.
Clean up resources
When no longer needed, you can delete the resource group, virtual machine, and all related resources.
Select the resource group for the virtual machine, then select Delete. Confirm the name of the resource group to
finish deleting the resources.
Next steps
In this quickstart, you deployed a simple virtual machine, open a network port for web traffic, and installed a basic
web server. To learn more about Azure virtual machines, continue to the tutorial for Windows VMs.
Azure Windows virtual machine tutorials
Quickstart: Create a Windows virtual machine in
Azure with PowerShell
11/13/2019 • 2 minutes to read • Edit Online
The Azure PowerShell module is used to create and manage Azure resources from the PowerShell command line
or in scripts. This quickstart shows you how to use the Azure PowerShell module to deploy a virtual machine
(VM ) in Azure that runs Windows Server 2016. You will also RDP to the VM and install the IIS web server, to
show the VM in action.
If you don't have an Azure subscription, create a free account before you begin.
New-AzVm `
-ResourceGroupName "myResourceGroup" `
-Name "myVM" `
-Location "East US" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-OpenPorts 80,3389
Use the following command to create a remote desktop session from your local computer. Replace the IP address
with the public IP address of your VM.
mstsc /v:publicIpAddress
In the Windows Security window, select More choices, and then select Use a different account. Type the
username as localhost\username, enter password you created for the virtual machine, and then click OK.
You may receive a certificate warning during the sign-in process. Click Yes or Continue to create the connection
Next steps
In this quickstart, you deployed a simple virtual machine, open a network port for web traffic, and installed a basic
web server. To learn more about Azure virtual machines, continue to the tutorial for Windows VMs.
Azure Windows virtual machine tutorials
Quickstart: Create a Windows virtual machine with
the Azure CLI
11/13/2019 • 3 minutes to read • Edit Online
The Azure CLI is used to create and manage Azure resources from the command line or in scripts. This quickstart
shows you how to use the Azure CLI to deploy a virtual machine (VM ) in Azure that runs Windows Server 2016.
To see your VM in action, you then RDP to the VM and install the IIS web server.
If you don't have an Azure subscription, create a free account before you begin.
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image win2016datacenter \
--admin-username azureuser \
--admin-password myPassword
It takes a few minutes to create the VM and supporting resources. The following example output shows the VM
create operation was successful.
{
"fqdns": "",
"id":
"/subscriptions/<guid>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
"location": "eastus",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "52.174.34.95",
"resourceGroup": "myResourceGroup"
}
Note your own publicIpAddress in the output from your VM. This address is used to access the VM in the next
steps.
mstsc /v:publicIpAddress
Next steps
In this quickstart, you deployed a simple virtual machine, open a network port for web traffic, and installed a basic
web server. To learn more about Azure virtual machines, continue to the tutorial for Windows VMs.
Azure Windows virtual machine tutorials
Tutorial: Create and Manage Windows VMs with
Azure PowerShell
11/13/2019 • 7 minutes to read • Edit Online
Azure virtual machines provide a fully configurable and flexible computing environment. This tutorial covers basic
Azure virtual machine (VM ) deployment tasks like selecting a VM size, selecting a VM image, and deploying a
VM. You learn how to:
Create and connect to a VM
Select and use VM images
View and use specific VM sizes
Resize a VM
View and understand VM state
New-AzResourceGroup `
-ResourceGroupName "myResourceGroupVM" `
-Location "EastUS"
The resource group is specified when creating or modifying a VM, which can be seen throughout this tutorial.
Create a VM
When creating a VM, several options are available like operating system image, network configuration, and
administrative credentials. This example creates a VM named myVM, running the default version of Windows
Server 2016 Datacenter.
Set the username and password needed for the administrator account on the VM with Get-Credential:
$cred = Get-Credential
Connect to VM
After the deployment has completed, create a remote desktop connection with the VM.
Run the following commands to return the public IP address of the VM. Take note of this IP Address so you can
connect to it with your browser to test web connectivity in a future step.
Get-AzPublicIpAddress `
-ResourceGroupName "myResourceGroupVM" | Select IpAddress
Use the following command, on your local machine, to create a remote desktop session with the VM. Replace the
IP address with the publicIPAddress of your VM. When prompted, enter the credentials used when creating the
VM.
mstsc /v:<publicIpAddress>
In the Windows Security window, select More choices and then Use a different account. Type the username
and password you created for the VM and then click OK.
Use the Get-AzVMImageOffer to return a list of image offers. With this command, the returned list is filtered on
the specified publisher named MicrosoftWindowsServer :
Get-AzVMImageOffer `
-Location "EastUS" `
-PublisherName "MicrosoftWindowsServer"
The Get-AzVMImageSku command will then filter on the publisher and offer name to return a list of image
names.
Get-AzVMImageSku `
-Location "EastUS" `
-PublisherName "MicrosoftWindowsServer" `
-Offer "WindowsServer"
This information can be used to deploy a VM with a specific image. This example deploys a VM using the latest
version of a Windows Server 2016 with Containers image.
New-AzVm `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM2" `
-Location "EastUS" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress2" `
-ImageName "MicrosoftWindowsServer:WindowsServer:2016-Datacenter-with-Containers:latest" `
-Credential $cred `
-AsJob
The -AsJob parameter creates the VM as a background task, so the PowerShell prompts return to you. You can
view details of background jobs with the Get-Job cmdlet.
Understand VM sizes
The VM size determines the amount of compute resources like CPU, GPU, and memory that are made available
to the VM. Virtual machines should be created using a VM size appropriate for the workload. If a workload
increases, an existing virtual machine can also be resized.
VM Sizes
The following table categorizes sizes into use cases.
General purpose B, Dsv3, Dv3, DSv2, Dv2, Av2, DC Balanced CPU-to-memory. Ideal for dev
/ test and small to medium applications
and data solutions.
Memory optimized Esv3, Ev3, M, DSv2, Dv2 High memory-to-core. Great for
relational databases, medium to large
caches, and in-memory analytics.
Storage optimized Lsv2, Ls High disk throughput and IO. Ideal for
Big Data, SQL, and NoSQL databases.
GPU NV, NVv2, NC, NCv2, NCv3, ND Specialized VMs targeted for heavy
graphic rendering and video editing.
Resize a VM
After a VM has been deployed, it can be resized to increase or decrease resource allocation.
Before resizing a VM, check if the size you want is available on the current VM cluster. The Get-AzVMSize
command returns a list of sizes.
If the size is available, the VM can be resized from a powered-on state, however it is rebooted during the
operation.
$vm = Get-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-VMName "myVM"
$vm.HardwareProfile.VmSize = "Standard_DS3_v2"
Update-AzVM `
-VM $vm `
-ResourceGroupName "myResourceGroupVM"
If the size you want isn't available on the current cluster, the VM needs to be deallocated before the resize
operation can occur. Deallocating a VM will remove any data on the temp disk, and the public IP address will
change unless a static IP address is being used.
Stop-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" -Force
$vm = Get-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-VMName "myVM"
$vm.HardwareProfile.VmSize = "Standard_E2s_v3"
Update-AzVM -VM $vm `
-ResourceGroupName "myResourceGroupVM"
Start-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-Name $vm.name
VM power states
An Azure VM can have one of many power states.
To get the state of a particular VM, use the Get-AzVM command. Be sure to specify a valid name for a VM and
resource group.
Get-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" `
-Status | Select @{n="Status"; e={$_.Statuses[1].Code}}
Status
------
PowerState/running
Management tasks
During the lifecycle of a VM, you may want to run management tasks like starting, stopping, or deleting a VM.
Additionally, you may want to create scripts to automate repetitive or complex tasks. Using Azure PowerShell,
many common management tasks can be run from the command line or in scripts.
Stop a VM
Stop and deallocate a VM with Stop-AzVM:
Stop-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" -Force
If you want to keep the VM in a provisioned state, use the -StayProvisioned parameter.
Start a VM
Start-AzVM `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM"
Remove-AzResourceGroup `
-Name "myResourceGroupVM" `
-Force
Next steps
In this tutorial, you learned about basic VM creation and management such as how to:
Create and connect to a VM
Select and use VM images
View and use specific VM sizes
Resize a VM
View and understand VM state
Advance to the next tutorial to learn about VM disks.
Create and Manage VM disks
Tutorial - Manage Azure disks with Azure PowerShell
1/19/2020 • 5 minutes to read • Edit Online
Azure virtual machines use disks to store the VMs operating system, applications, and data. When creating a VM,
it's important to choose a disk size and configuration appropriate to the expected workload. This tutorial covers
deploying and managing VM disks. You learn about:
OS disks and temporary disks
Data disks
Standard and Premium disks
Disk performance
Attaching and preparing data disks
VM disk types
Azure provides two types of disks.
Standard disks - backed by HDDs, and delivers cost-effective storage while still being performant. Standard disks
are ideal for a cost effective dev and test workload.
Premium disks - backed by SSD -based high-performance, low -latency disk. Perfect for VMs running production
workload. Premium Storage supports DS -series, DSv2-series, GS -series, and FS -series VMs. Premium disks come
in five types (P10, P20, P30, P40, P50), the size of the disk determines the disk type. When selecting, a disk size the
value is rounded up to the next type. For example, if the size is below 128 GB the disk type is P10, or between 129
GB and 512 GB the disk is P20.
Premium disk performance
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
IOP 120 120 120 120 240 500 1,10 2,30 5,00 7,50 7,50 16,0 18,0 20,0
S 0 0 0 0 0 00 00 00
per
disk
Thr 25 25 25 25 50 100 125 150 200 250 250 500 750 900
oug MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
hpu /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
t
per
disk
Max 30 30 30 30 30 30 30 30
bur min min min min min min min min
st
dur
atio
n**
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
**Denotes a feature that is currently in preview, see Disk bursting for more information.
While the above table identifies max IOPS per disk, a higher level of performance can be achieved by striping
multiple data disks. For instance, 64 data disks can be attached to Standard_GS5 VM. If each of these disks is sized
as a P30, a maximum of 80,000 IOPS can be achieved. For detailed information on max IOPS per VM, see VM
types and sizes.
New-AzVm `
-ResourceGroupName "myResourceGroupDisk" `
-Name "myVM" `
-Location "East US" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress"
Create the initial configuration with New -AzDiskConfig. The following example configures a disk that is 128
gigabytes in size.
$diskConfig = New-AzDiskConfig `
-Location "EastUS" `
-CreateOption Empty `
-DiskSizeGB 128
$dataDisk = New-AzDisk `
-ResourceGroupName "myResourceGroupDisk" `
-DiskName "myDataDisk" `
-Disk $diskConfig
Get the virtual machine that you want to add the data disk to with the Get-AzVM command.
$vm = Get-AzVM -ResourceGroupName "myResourceGroupDisk" -Name "myVM"
Add the data disk to the virtual machine configuration with the Add-AzVMDataDisk command.
$vm = Add-AzVMDataDisk `
-VM $vm `
-Name "myDataDisk" `
-CreateOption Attach `
-ManagedDiskId $dataDisk.Id `
-Lun 1
$vm.StorageProfile.DataDisks
Name : myDataDisk
DiskSizeGB : 128
Lun : 1
Caching : None
CreateOption : Attach
SourceImage :
VirtualHardDisk :
Next steps
In this tutorial, you learned about VM disks topics such as:
OS disks and temporary disks
Data disks
Standard and Premium disks
Disk performance
Attaching and preparing data disks
Advance to the next tutorial to learn about automating VM configuration.
Automate VM configuration
Tutorial - Deploy applications to a Windows virtual
machine in Azure with the Custom Script Extension
11/13/2019 • 2 minutes to read • Edit Online
To configure virtual machines (VMs) in a quick and consistent manner, you can use the Custom Script Extension
for Windows. In this tutorial you learn how to:
Use the Custom Script Extension to install IIS
Create a VM that uses the Custom Script Extension
View a running IIS site after the extension is applied
$cred = Get-Credential
Now you can create the VM with New -AzVM. The following example creates a VM named myVM in the EastUS
location. If they do not already exist, the resource group myResourceGroupAutomate and supporting network
resources are created. To allow web traffic, the cmdlet also opens port 80.
New-AzVm `
-ResourceGroupName "myResourceGroupAutomate" `
-Name "myVM" `
-Location "East US" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-OpenPorts 80 `
-Credential $cred
Get-AzPublicIPAddress `
-ResourceGroupName "myResourceGroupAutomate" `
-Name "myPublicIPAddress" | select IpAddress
You can then enter the public IP address in to a web browser. The website is displayed, including the hostname of
the VM that the load balancer distributed traffic to as in the following example:
Next steps
In this tutorial, you automated the IIS install on a VM. You learned how to:
Use the Custom Script Extension to install IIS
Create a VM that uses the Custom Script Extension
View a running IIS site after the extension is applied
Advance to the next tutorial to learn how to create custom VM images.
Create custom VM images
Tutorial: Create a custom image of an Azure VM with
Azure PowerShell
1/19/2020 • 4 minutes to read • Edit Online
Custom images are like marketplace images, but you create them yourself. Custom images can be used to
bootstrap deployments and ensure consistency across multiple VMs. In this tutorial, you create your own custom
image of an Azure virtual machine using PowerShell. You learn how to:
Sysprep and generalize VMs
Create a custom image
Create a VM from a custom image
List all the images in your subscription
Delete an image
In public preview, we have the Azure VM Image Builder service. Simply describe your customizations in a
template, and it will handle the image creation steps in this article. Try Azure Image Builder (preview ).
Prepare VM
To create an image of a virtual machine, you need to prepare the source VM by generalizing it, deallocating, and
then marking it as generalized with Azure.
Generalize the Windows VM using Sysprep
Sysprep removes all your personal account information, among other things, and prepares the machine to be used
as an image. For details about Sysprep, see How to Use Sysprep: An Introduction.
1. Connect to the virtual machine.
2. Open the Command Prompt window as an administrator. Change the directory to
%windir%\system32\sysprep, and then run sysprep.exe .
3. In the System Preparation Tool dialog box, select Enter System Out-of-Box Experience (OOBE ), and
make sure that the Generalize check box is selected.
4. In Shutdown Options, select Shutdown and then click OK.
5. When Sysprep completes, it shuts down the virtual machine. Do not restart the VM.
Deallocate and mark the VM as generalized
To create an image, the VM needs to be deallocated and marked as generalized in Azure.
Deallocate the VM using Stop-AzVM.
Stop-AzVM `
-ResourceGroupName myResourceGroup `
-Name myVM -Force
Set-AzVM `
-ResourceGroupName myResourceGroup `
-Name myVM -Generalized
$vm = Get-AzVM `
-Name myVM `
-ResourceGroupName myResourceGroup
$image = New-AzImageConfig `
-Location EastUS `
-SourceVirtualMachineId $vm.ID
New-AzImage `
-Image $image `
-ImageName myImage `
-ResourceGroupName myResourceGroup
We recommend that you limit the number of concurrent deployments to 20 VMs from a single image. If you are
planning large-scale, concurrent deployments of over 20 VMs from the same custom image, you should use a
Shared Image Gallery with multiple image replicas.
Image management
Here are some examples of common managed image tasks and how to complete them using PowerShell.
List all images by name.
Delete an image. This example deletes the image named myImage from the myResourceGroup.
Remove-AzImage `
-ImageName myImage `
-ResourceGroupName myResourceGroup
Next steps
In this tutorial, you created a custom VM image. You learned how to:
Sysprep and generalize VMs
Create a custom image
Create a VM from a custom image
List all the images in your subscription
Delete an image
Advance to the next tutorial to learn about how to create highly available virtual machines.
Create highly available VMs
Tutorial: Create and deploy highly available virtual
machines with Azure PowerShell
11/13/2019 • 4 minutes to read • Edit Online
In this tutorial, you learn how to increase the availability and reliability of your Virtual Machines (VMs) using
Availability Sets. Availability Sets make sure the VMs you deploy on Azure are distributed across multiple, isolated
hardware nodes, in a cluster.
In this tutorial, you learn how to:
Create an availability set
Create a VM in an availability set
Check available VM sizes
Check Azure Advisor
Create a managed availability set using New -AzAvailabilitySet with the -sku aligned parameter.
New-AzAvailabilitySet `
-Location "EastUS" `
-Name "myAvailabilitySet" `
-ResourceGroupName "myResourceGroupAvailability" `
-Sku aligned `
-PlatformFaultDomainCount 2 `
-PlatformUpdateDomainCount 2
$cred = Get-Credential
Now create two VMs with New -AzVM in the availability set.
It takes a few minutes to create and configure both VMs. When finished, you have two virtual machines
distributed across the underlying hardware.
If you look at the availability set in the portal by going to Resource Groups > myResourceGroupAvailability >
myAvailabilitySet, you should see how the VMs are distributed across the two fault and update domains.
Check for available VM sizes
You can add more VMs to the availability set later, but you need to know what VM sizes are available on the
hardware. Use Get-AzVMSize to list all the available sizes on the hardware cluster for the availability set.
Get-AzVMSize `
-ResourceGroupName "myResourceGroupAvailability" `
-AvailabilitySetName "myAvailabilitySet"
Next steps
In this tutorial, you learned how to:
Create an availability set
Create a VM in an availability set
Check available VM sizes
Check Azure Advisor
Advance to the next tutorial to learn about virtual machine scale sets.
Create a VM scale set
Tutorial: Create a virtual machine scale set and
deploy a highly available app on Windows with
Azure PowerShell
12/12/2019 • 7 minutes to read • Edit Online
A virtual machine scale set allows you to deploy and manage a set of identical, autoscaling virtual machines. You
can scale the number of VMs in the scale set manually. You can also define rules to autoscale based on resource
usage such as CPU, memory demand, or network traffic. In this tutorial, you deploy a virtual machine scale set in
Azure and learn how to:
Use the Custom Script Extension to define an IIS site to scale
Create a load balancer for your scale set
Create a virtual machine scale set
Increase or decrease the number of instances in a scale set
Create autoscale rules
It takes a few minutes to create and configure all the scale set resources and VMs.
# Use Custom Script Extension to install IIS and configure basic website
Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
-Name "customScript" `
-Publisher "Microsoft.Compute" `
-Type "CustomScriptExtension" `
-TypeHandlerVersion 1.8 `
-Setting $publicSettings
# Update the scale set and apply the Custom Script Extension to the VM instances
Update-AzVmss `
-ResourceGroupName "myResourceGroupScaleSet" `
-Name "myScaleSet" `
-VirtualMachineScaleSet $vmss
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName "myResourceGroupScaleSet" `
-Name myVnet
$frontendSubnet = $vnet.Subnets[0]
$frontendSubnetConfig = Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $vnet `
-Name mySubnet `
-AddressPrefix $frontendSubnet.AddressPrefix `
-NetworkSecurityGroup $nsgFrontend
# Update the scale set and apply the Custom Script Extension to the VM instances
Update-AzVmss `
-ResourceGroupName "myResourceGroupScaleSet" `
-Name "myScaleSet" `
-VirtualMachineScaleSet $vmss
Get-AzPublicIPAddress `
-ResourceGroupName "myResourceGroupScaleSet" `
-Name "myPublicIPAddress" | select IpAddress
Enter the public IP address in to a web browser. The web app is displayed, including the hostname of the VM that
the load balancer distributed traffic to:
To see the scale set in action, you can force-refresh your web browser to see the load balancer distribute traffic
across all the VMs running your app.
Management tasks
Throughout the lifecycle of the scale set, you may need to run one or more management tasks. Additionally, you
may want to create scripts that automate various lifecycle-tasks. Azure PowerShell provides a quick way to do
those tasks. Here are a few common tasks.
View VMs in a scale set
To view a list of VM instances in a scale set, use Get-AzVmssVM as follows:
Get-AzVmssVM `
-ResourceGroupName "myResourceGroupScaleSet" `
-VMScaleSetName "myScaleSet"
The following example output shows two VM instances in the scale set:
To view additional information about a specific VM instance, add the -InstanceId parameter to Get-AzVmssVM.
The following example views information about VM instance 1:
Get-AzVmssVM `
-ResourceGroupName "myResourceGroupScaleSet" `
-VMScaleSetName "myScaleSet" `
-InstanceId "1"
You can then manually increase or decrease the number of virtual machines in the scale set with Update-AzVmss.
The following example sets the number of VMs in your scale set to 3:
# Get current scale set
$scaleset = Get-AzVmss `
-ResourceGroupName "myResourceGroupScaleSet" `
-VMScaleSetName "myScaleSet"
If takes a few minutes to update the specified number of instances in your scale set.
Configure autoscale rules
Rather than manually scaling the number of instances in your scale set, you define autoscale rules. These rules
monitor the instances in your scale set and respond accordingly based on metrics and thresholds you define. The
following example scales out the number of instances by one when the average CPU load is greater than 60% over
a 5-minute period. If the average CPU load then drops below 30% over a 5-minute period, the instances are scaled
in by one instance:
# Define your scale set information
$mySubscriptionId = (Get-AzSubscription)[0].Id
$myResourceGroup = "myResourceGroupScaleSet"
$myScaleSet = "myScaleSet"
$myLocation = "East US"
$myScaleSetId = (Get-AzVmss -ResourceGroupName $myResourceGroup -VMScaleSetName $myScaleSet).Id
# Create a scale up rule to increase the number instances after 60% average CPU usage exceeded for a 5-minute
period
$myRuleScaleUp = New-AzAutoscaleRule `
-MetricName "Percentage CPU" `
-MetricResourceId $myScaleSetId `
-Operator GreaterThan `
-MetricStatistic Average `
-Threshold 60 `
-TimeGrain 00:01:00 `
-TimeWindow 00:05:00 `
-ScaleActionCooldown 00:05:00 `
-ScaleActionDirection Increase `
-ScaleActionValue 1
# Create a scale down rule to decrease the number of instances after 30% average CPU usage over a 5-minute
period
$myRuleScaleDown = New-AzAutoscaleRule `
-MetricName "Percentage CPU" `
-MetricResourceId $myScaleSetId `
-Operator LessThan `
-MetricStatistic Average `
-Threshold 30 `
-TimeGrain 00:01:00 `
-TimeWindow 00:05:00 `
-ScaleActionCooldown 00:05:00 `
-ScaleActionDirection Decrease `
-ScaleActionValue 1
# Create a scale profile with your scale up and scale down rules
$myScaleProfile = New-AzAutoscaleProfile `
-DefaultCapacity 2 `
-MaximumCapacity 10 `
-MinimumCapacity 2 `
-Rule $myRuleScaleUp,$myRuleScaleDown `
-Name "autoprofile"
For more design information on the use of autoscale, see autoscale best practices.
Next steps
In this tutorial, you created a virtual machine scale set. You learned how to:
Use the Custom Script Extension to define an IIS site to scale
Create a load balancer for your scale set
Create a virtual machine scale set
Increase or decrease the number of instances in a scale set
Create autoscale rules
Advance to the next tutorial to learn more about load balancing concepts for virtual machines.
Load balance virtual machines
Tutorial: Load balance Windows virtual machines in
Azure to create a highly available application with
Azure PowerShell
11/13/2019 • 8 minutes to read • Edit Online
Load balancing provides a higher level of availability by spreading incoming requests across multiple virtual
machines. In this tutorial, you learn about the different components of the Azure load balancer that distribute
traffic and provide high availability. You learn how to:
Create an Azure load balancer
Create a load balancer health probe
Create load balancer traffic rules
Use the Custom Script Extension to create a basic IIS site
Create virtual machines and attach to a load balancer
View a load balancer in action
Add and remove VMs from a load balancer
$publicIP = New-AzPublicIpAddress `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Location "EastUS" `
-AllocationMethod "Static" `
-Name "myPublicIP"
$frontendIP = New-AzLoadBalancerFrontendIpConfig `
-Name "myFrontEndPool" `
-PublicIpAddress $publicIP
Create a backend address pool with New -AzLoadBalancerBackendAddressPoolConfig. The VMs attach to this
backend pool in the remaining steps. The following example creates a backend address pool named
myBackEndPool:
$backendPool = New-AzLoadBalancerBackendAddressPoolConfig `
-Name "myBackEndPool"
Now, create the load balancer with New -AzLoadBalancer. The following example creates a load balancer named
myLoadBalancer using the frontend and backend IP pools created in the preceding steps:
$lb = New-AzLoadBalancer `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Name "myLoadBalancer" `
-Location "EastUS" `
-FrontendIpConfiguration $frontendIP `
-BackendAddressPool $backendPool
To apply the health probe, update the load balancer with Set-AzLoadBalancer:
Add-AzLoadBalancerRuleConfig `
-Name "myLoadBalancerRule" `
-LoadBalancer $lb `
-FrontendIpConfiguration $lb.FrontendIpConfigurations[0] `
-BackendAddressPool $lb.BackendAddressPools[0] `
-Protocol Tcp `
-FrontendPort 80 `
-BackendPort 80 `
-Probe $probe
Virtual NICs are created with New -AzNetworkInterface. The following example creates three virtual NICs. (One
virtual NIC for each VM you create for your app in the following steps). You can create additional virtual NICs and
VMs at any time and add them to the load balancer:
$availabilitySet = New-AzAvailabilitySet `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Name "myAvailabilitySet" `
-Location "EastUS" `
-Sku aligned `
-PlatformFaultDomainCount 2 `
-PlatformUpdateDomainCount 2
Set an administrator username and password for the VMs with Get-Credential:
$cred = Get-Credential
Now you can create the VMs with New -AzVM. The following example creates three VMs and the required virtual
network components if they do not already exist:
for ($i=1; $i -le 3; $i++)
{
New-AzVm `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Name "myVM$i" `
-Location "East US" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-OpenPorts 80 `
-AvailabilitySetName "myAvailabilitySet" `
-Credential $cred `
-AsJob
}
The -AsJob parameter creates the VM as a background task, so the PowerShell prompts return to you. You can
view details of background jobs with the Job cmdlet. It takes a few minutes to create and configure all three VMs.
Install IIS with Custom Script Extension
In a previous tutorial on How to customize a Windows virtual machine, you learned how to automate VM
customization with the Custom Script Extension for Windows. You can use the same approach to install and
configure IIS on your VMs.
Use Set-AzVMExtension to install the Custom Script Extension. The extension runs
powershell Add-WindowsFeature Web-Server to install the IIS webserver and then updates the Default.htm page to
show the hostname of the VM:
Get-AzPublicIPAddress `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Name "myPublicIP" | select IpAddress
You can then enter the public IP address in to a web browser. The website is displayed, including the hostname of
the VM that the load balancer distributed traffic to as in the following example:
To see the load balancer distribute traffic across all three VMs running your app, you can force-refresh your web
browser.
$nic = Get-AzNetworkInterface `
-ResourceGroupName "myResourceGroupLoadBalancer" `
-Name "myVM2"
$nic.Ipconfigurations[0].LoadBalancerBackendAddressPools=$null
Set-AzNetworkInterface -NetworkInterface $nic
To see the load balancer distribute traffic across the remaining two VMs running your app you can force-refresh
your web browser. You can now perform maintenance on the VM, such as installing OS updates or performing a
VM reboot.
Add a VM to the load balancer
After performing VM maintenance, or if you need to expand capacity, set the LoadBalancerBackendAddressPools
property of the virtual NIC to the BackendAddressPool from Get-AzLoadBalancer:
Get the load balancer:
$lb = Get-AzLoadBalancer `
-ResourceGroupName myResourceGroupLoadBalancer `
-Name myLoadBalancer
$nic.IpConfigurations[0].LoadBalancerBackendAddressPools=$lb.BackendAddressPools[0]
Set-AzNetworkInterface -NetworkInterface $nic
Next steps
In this tutorial, you created a load balancer and attached VMs to it. You learned how to:
Create an Azure load balancer
Create a load balancer health probe
Create load balancer traffic rules
Use the Custom Script Extension to create a basic IIS site
Create virtual machines and attach to a load balancer
View a load balancer in action
Add and remove VMs from a load balancer
Advance to the next tutorial to learn how to manage VM networking.
Manage VMs and virtual networks
Tutorial: Create and manage Azure virtual networks
for Windows virtual machines with Azure PowerShell
11/13/2019 • 7 minutes to read • Edit Online
Azure virtual machines use Azure networking for internal and external network communication. This tutorial walks
through deploying two virtual machines and configuring Azure networking for these VMs. The examples in this
tutorial assume that the VMs are hosting a web application with a database back-end, however an application isn't
deployed in the tutorial. In this tutorial, you learn how to:
Create a virtual network and subnet
Create a public IP address
Create a front-end VM
Secure network traffic
Create back-end VM
VM networking overview
Azure virtual networks enable secure network connections between virtual machines, the internet, and other Azure
services such as Azure SQL database. Virtual networks are broken down into logical segments called subnets.
Subnets are used to control network flow, and as a security boundary. When deploying a VM, it generally includes
a virtual network interface, which is attached to a subnet.
While completing this tutorial, you can see these resources created:
myVNet - The virtual network that the VMs use to communicate with each other and the internet.
myFrontendSubnet - The subnet in myVNet used by the front-end resources.
myPublicIPAddress - The public IP address used to access myFrontendVM from the internet.
myFrontendNic - The network interface used by myFrontendVM to communicate with myBackendVM.
myFrontendVM - The VM used to communicate between the internet and myBackendVM.
myBackendNSG - The network security group that controls communication between the myFrontendVM and
myBackendVM.
myBackendSubnet - The subnet associated with myBackendNSG and used by the back-end resources.
myBackendNic - The network interface used by myBackendVM to communicate with myFrontendVM.
myBackendVM - The VM that uses port 1433 to communicate with myFrontendVM.
Create subnet
For this tutorial, a single virtual network is created with two subnets. A front-end subnet for hosting a web
application, and a back-end subnet for hosting a database server.
Before you can create a virtual network, create a resource group using New -AzResourceGroup. The following
example creates a resource group named myRGNetwork in the EastUS location:
$frontendSubnet = New-AzVirtualNetworkSubnetConfig `
-Name myFrontendSubnet `
-AddressPrefix 10.0.0.0/24
$backendSubnet = New-AzVirtualNetworkSubnetConfig `
-Name myBackendSubnet `
-AddressPrefix 10.0.1.0/24
$vnet = New-AzVirtualNetwork `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-Name myVNet `
-AddressPrefix 10.0.0.0/16 `
-Subnet $frontendSubnet, $backendSubnet
At this point, a network has been created and segmented into two subnets, one for front-end services, and another
for back-end services. In the next section, virtual machines are created and connected to these subnets.
$pip = New-AzPublicIpAddress `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-AllocationMethod Dynamic `
-Name myPublicIPAddress
You could change the -AllocationMethod parameter to Static to assign a static public IP address.
Create a front-end VM
For a VM to communicate in a virtual network, it needs a virtual network interface (NIC ). Create a NIC using
New -AzNetworkInterface:
$frontendNic = New-AzNetworkInterface `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-Name myFrontend `
-SubnetId $vnet.Subnets[0].Id `
-PublicIpAddressId $pip.Id
Set the username and password needed for the administrator account on the VM using Get-Credential. You use
these credentials to connect to the VM in additional steps:
$cred = Get-Credential
New-AzVM `
-Credential $cred `
-Name myFrontend `
-PublicIpAddressName myPublicIPAddress `
-ResourceGroupName myRGNetwork `
-Location "EastUS" `
-Size Standard_D1 `
-SubnetName myFrontendSubnet `
-VirtualNetworkName myVNet
$nsgFrontendRule = New-AzNetworkSecurityRuleConfig `
-Name myFrontendNSGRule `
-Protocol Tcp `
-Direction Inbound `
-Priority 200 `
-SourceAddressPrefix * `
-SourcePortRange * `
-DestinationAddressPrefix * `
-DestinationPortRange 80 `
-Access Allow
You can limit internal traffic to myBackendVM from only myFrontendVM by creating an NSG for the back-end
subnet. The following example creates an NSG rule named myBackendNSGRule:
$nsgBackendRule = New-AzNetworkSecurityRuleConfig `
-Name myBackendNSGRule `
-Protocol Tcp `
-Direction Inbound `
-Priority 100 `
-SourceAddressPrefix 10.0.0.0/24 `
-SourcePortRange * `
-DestinationAddressPrefix * `
-DestinationPortRange 1433 `
-Access Allow
$nsgFrontend = New-AzNetworkSecurityGroup `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-Name myFrontendNSG `
-SecurityRules $nsgFrontendRule
Now, add a network security group named myBackendNSG using New -AzNetworkSecurityGroup:
$nsgBackend = New-AzNetworkSecurityGroup `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-Name myBackendNSG `
-SecurityRules $nsgBackendRule
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName myRGNetwork `
-Name myVNet
$frontendSubnet = $vnet.Subnets[0]
$backendSubnet = $vnet.Subnets[1]
$frontendSubnetConfig = Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $vnet `
-Name myFrontendSubnet `
-AddressPrefix $frontendSubnet.AddressPrefix `
-NetworkSecurityGroup $nsgFrontend
$backendSubnetConfig = Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $vnet `
-Name myBackendSubnet `
-AddressPrefix $backendSubnet.AddressPrefix `
-NetworkSecurityGroup $nsgBackend
Set-AzVirtualNetwork -VirtualNetwork $vnet
Create a back-end VM
The easiest way to create the back-end VM for this tutorial is by using a SQL Server image. This tutorial only
creates the VM with the database server, but doesn't provide information about accessing the database.
Create myBackendNic:
$backendNic = New-AzNetworkInterface `
-ResourceGroupName myRGNetwork `
-Location EastUS `
-Name myBackend `
-SubnetId $vnet.Subnets[1].Id
Set the username and password needed for the administrator account on the VM with Get-Credential:
$cred = Get-Credential
Create myBackendVM.
New-AzVM `
-Credential $cred `
-Name myBackend `
-ImageName "MicrosoftSQLServer:SQL2016SP1-WS2016:Enterprise:latest" `
-ResourceGroupName myRGNetwork `
-Location "EastUS" `
-SubnetName MyBackendSubnet `
-VirtualNetworkName myVNet
The image in this example has SQL Server installed, but it isn't used in this tutorial. It's included to show you how
you can configure a VM to handle web traffic and a VM to handle database management.
Next steps
In this tutorial, you created and secured Azure networks as related to virtual machines.
Create a virtual network and subnet
Create a public IP address
Create a front-end VM
Secure network traffic
Create a back-end VM
Advance to the next tutorial to learn about monitoring securing data on virtual machines using Azure backup.
Back up Windows virtual machines in Azure
Tutorial: Back up and restore files for Windows virtual
machines in Azure
11/13/2019 • 4 minutes to read • Edit Online
You can protect your data by taking backups at regular intervals. Azure Backup creates recovery points that are
stored in geo-redundant recovery vaults. When you restore from a recovery point, you can restore the whole VM
or specific files. This article explains how to restore a single file to a VM running Windows Server and IIS. If you
don't already have a VM to use, you can create one using the Windows quickstart. In this tutorial you learn how to:
Create a backup of a VM
Schedule a daily backup
Restore a file from a backup
Backup overview
When the Azure Backup service initiates a backup job, it triggers the backup extension to take a point-in-time
snapshot. The Azure Backup service uses the VMSnapshot extension. The extension is installed during the first VM
backup if the VM is running. If the VM is not running, the Backup service takes a snapshot of the underlying
storage (since no application writes occur while the VM is stopped).
When taking a snapshot of Windows VMs, the Backup service coordinates with the Volume Shadow Copy Service
(VSS ) to get a consistent snapshot of the virtual machine's disks. Once the Azure Backup service takes the
snapshot, the data is transferred to the vault. To maximize efficiency, the service identifies and transfers only the
blocks of data that have changed since the previous backup.
When the data transfer is complete, the snapshot is removed and a recovery point is created.
Create a backup
Create a simple scheduled daily backup to a Recovery Services Vault.
1. Sign in to the Azure portal.
2. In the menu on the left, select Virtual machines.
3. From the list, select a VM to back up.
4. On the VM blade, in the Operations section, click Backup. The Enable backup blade opens.
5. In Recovery Services vault, click Create new and provide the name for the new vault. A new vault is
created in the same resource group and location as the virtual machine.
6. Under Choose backup policy, keep the default (New) DailyPolicy, and then click Enable Backup.
7. To create an initial recovery point, on the Backup blade click Backup now.
8. On the Backup Now blade, click the calendar icon, use the calendar control to choose how long the restore
point is retained, and click OK.
9. In the Backup blade for your VM, you'll see the number of restore points that are complete.
The first backup takes about 20 minutes. Proceed to the next part of this tutorial after your backup is finished.
Recover a file
If you accidentally delete or make changes to a file, you can use File Recovery to recover the file from your backup
vault. File Recovery uses a script that runs on the VM, to mount the recovery point as local drive. These drives
remain mounted for 12 hours so that you can copy files from the recovery point and restore them to the VM.
In this example, we show how to recover the image file that is used in the default web page for IIS.
1. Open a browser and connect to the IP address of the VM to show the default IIS page.
Next steps
In this tutorial, you learned how to:
Create a backup of a VM
Schedule a daily backup
Restore a file from a backup
Advance to the next tutorial to learn about monitoring virtual machines.
Govern virtual machines
Tutorial: Learn about Windows virtual machine
management with Azure PowerShell
1/14/2020 • 10 minutes to read • Edit Online
When deploying resources to Azure, you have tremendous flexibility when deciding what types of resources to
deploy, where they are located, and how to set them up. However, that flexibility may open more options than you
would like to allow in your organization. As you consider deploying resources to Azure, you might be wondering:
How do I meet legal requirements for data sovereignty in certain countries/regions?
How do I control costs?
How do I ensure that someone does not inadvertently change a critical system?
How do I track resource costs and bill it accurately?
This article addresses those questions. Specifically, you:
Assign users to roles and assign the roles to a scope so users have permission to perform expected actions but
not more actions.
Apply policies that prescribe conventions for resources in your subscription.
Lock resources that are critical to your system.
Tag resources so you can track them by values that make sense to your organization.
This article focuses on the tasks you take to implement governance. For a broader discussion of the concepts, see
Governance in Azure.
Understand scope
Before creating any items, let's review the concept of scope. Azure provides four levels of management:
management groups, subscription, resource group, and resource. Management groups are in a preview release.
The following image shows an example of these layers.
You apply management settings at any of these levels of scope. The level you select determines how widely the
setting is applied. Lower levels inherit settings from higher levels. When you apply a setting to the subscription,
that setting is applied to all resource groups and resources in your subscription. When you apply a setting on the
resource group, that setting is applied the resource group and all its resources. However, another resource group
does not have that setting.
Usually, it makes sense to apply critical settings at higher levels and project-specific requirements at lower levels.
For example, you might want to make sure all resources for your organization are deployed to certain regions. To
accomplish this requirement, apply a policy to the subscription that specifies the allowed locations. As other users
in your organization add new resource groups and resources, the allowed locations are automatically enforced.
In this tutorial, you apply all management settings to a resource group so you can easily remove those settings
when done.
Let's create that resource group.
If you receive an error stating Principal <guid> does not exist in the directory, the new group hasn't
propagated throughout Azure Active Directory. Try running the command again.
Typically, you repeat the process for Network Contributor and Storage Account Contributor to make sure users
are assigned to manage the deployed resources. In this article, you can skip those steps.
Azure Policy
Azure Policy helps you make sure all resources in subscription meet corporate standards. Your subscription already
has several policy definitions. To see the available policy definitions, use the Get-AzPolicyDefinition command:
You see the existing policy definitions. The policy type is either BuiltIn or Custom. Look through the definitions
for ones that describe a condition you want assign. In this article, you assign policies that:
Limit the locations for all resources.
Limit the SKUs for virtual machines.
Audit virtual machines that don't use managed disks.
In the following example, you retrieve three policy definitions based on the display name. You use the New -
AzPolicyAssignment command to assign those definitions to the resource group. For some policies, you provide
parameter values to specify the allowed values.
# Values to use for parameters
$locations ="eastus", "eastus2"
$skus = "Standard_DS1_v2", "Standard_E2s_v2"
# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
$locationDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Allowed
locations"}
$skuDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Allowed virtual machine
SKUs"}
$auditDefinition = Get-AzPolicyDefinition | where-object {$_.properties.displayname -eq "Audit VMs that do not
use managed disks"}
After your deployment finishes, you can apply more management settings to the solution.
Lock resources
Resource locks prevent users in your organization from accidentally deleting or modifying critical resources. Unlike
role-based access control, resource locks apply a restriction across all users and roles. You can set the lock level to
CanNotDelete or ReadOnly.
To lock the virtual machine and network security group, use the New -AzResourceLock command:
# Add CanNotDelete lock to the VM
New-AzResourceLock -LockLevel CanNotDelete `
-LockName LockVM `
-ResourceName myVM `
-ResourceType Microsoft.Compute/virtualMachines `
-ResourceGroupName myResourceGroup
You see an error stating that the delete operation can't be completed because of a lock. The resource group can
only be deleted if you specifically remove the locks. That step is shown in Clean up resources.
Tag resources
You apply tags to your Azure resources to logically organize them by categories. Each tag consists of a name and a
value. For example, you can apply the name "Environment" and the value "Production" to all the resources in
production.
To add two tags to a resource group, use the Set-AzResourceGroup command:
Let's suppose you want to add a third tag. Every time you apply tags to a resource or a resource group, you
overwrite the existing tags on that resource or resource group. To add a new tag without losing the existing tags,
you must retrieve the existing tags, add a new tag, and reapply the collection of tags:
Resources don't inherit tags from the resource group. Currently, your resource group has three tags but the
resources do not have any tags. To apply all tags from a resource group to its resources, and retain existing tags on
resources that are not duplicates, use the following script:
# Get the resource group
$group = Get-AzResourceGroup myResourceGroup
Alternatively, you can apply tags from the resource group to the resources without keeping the existing tags:
# Find all the resources in the resource group, and for each resource apply the tags from the resource group
Get-AzResource -ResourceGroupName $g.ResourceGroupName | ForEach-Object {Set-AzResource -ResourceId
$_.ResourceId -Tag $g.Tags -Force }
To add a new tag with several values without losing the existing tags, you must retrieve the existing tags, use a
JSON string for the new tag, and reapply the collection of tags:
You can use the returned values for management tasks like stopping all virtual machines with a tag value.
Clean up resources
The locked network security group can't be deleted until the lock is removed. To remove the lock, use the Remove-
AzResourceLock command:
When no longer needed, you can use the Remove-AzResourceGroup command to remove the resource group,
VM, and all related resources.
Next steps
In this tutorial, you created a custom VM image. You learned how to:
Assign users to a role
Apply policies that enforce standards
Protect critical resources with locks
Tag resources for billing and management
Advance to the next tutorial to learn about how to identify changes and manage package updates on a Linux
virtual machine.
Manage virtual machines
Tutorial: Monitor changes and update a Windows
virtual machine in Azure
11/13/2019 • 9 minutes to read • Edit Online
With Azure Change Tracking and Update Management, you can easily identify changes in your Windows virtual
machines in Azure and manage operating system updates for those VMs.
In this tutorial, you learn how to:
Manage Windows updates.
Monitor changes and inventory.
$cred = Get-Credential
Next, create the VM with New -AzVM. The following example creates a VM named myVM in the East US location.
If they don't already exist, the resource group myResourceGroupMonitor and supporting network resources are
created:
New-AzVm `
-ResourceGroupName "myResourceGroupMonitor" `
-Name "myVM" `
-Location "East US" `
-Credential $cred
OPTION DESCRIPTION
Include/exclude updates Select this option to open the Include/Exclude pane. Updates
to be included and those to be excluded are on separate tabs.
For more information on how inclusion is handled, see
Schedule an Update Deployment.
Schedule settings Choose the time to start, and select either Once or
Recurring.
Pre-scripts + Post-scripts Choose the scripts to run before and after your deployment.
Maintenance window Enter the number of minutes set for updates. Valid values
range from 30 to 360 minutes.
Reboot control Select how reboots are handled. Available selections are:
Reboot if required
Always reboot
Never reboot
Only reboot
Reboot if required is the default selection. If you select Only
reboot, updates aren't installed.
After you have finished configuring the schedule, click Create to return to the status dashboard. The Scheduled
table shows the deployment schedule you created.
You can also create update deployments programmatically. To learn how to create an update deployment with the
REST API, see Software Update Configurations - Create. There's also a sample runbook that you can use to create
a weekly update deployment. To learn more about this runbook, see Create a weekly update deployment for one or
more VMs in a resource group.
View results of an update deployment
After the scheduled deployment starts, you can see the deployment status in the Update deployments tab of the
Update management window.
If the deployment is currently running, its status shows as "In progress." After successful completion, the status
changes to "Succeeded." But if any updates in the deployment fail, the status is "Partially failed."
Select the completed update deployment to see the dashboard for that deployment.
The Update results tile shows a summary of the total number of updates and deployment results on the VM. The
table to the right shows a detailed breakdown of each update and the installation results. Each result has one of the
following values:
Not attempted: The update isn't installed. There wasn't enough time available based on the defined
maintenance-window duration.
Succeeded: The update succeeded.
Failed: The update failed.
Select All logs to see all log entries that the deployment created.
Select the Output tile to see the job stream of the runbook responsible for managing the update deployment on
the target VM.
Select Errors to see detailed information about any deployment errors.
After the solution has been enabled, it might take some time for inventory to be collected on the VM before data
appears.
Track changes
On your VM under OPERATIONS, select Change Tracking and then select Edit Settings. The Change
Tracking pane opens. Select the type of setting you want to track and then select + Add to configure the settings.
The available settings options for Windows are:
Windows Registry
Windows Files
For detailed information on Change Tracking, see Troubleshoot changes on a VM.
View inventory
On your VM select Inventory under OPERATIONS. On the Software tab, there's a table that shows the software
that had been found. The high-level details for each software record appear in the table. These details include the
software name, version, publisher, and last refreshed time.
Monitor activity logs and changes
From the Change tracking window on your VM, select Manage Activity Log Connection to open the Azure
Activity log pane. Select Connect to connect Change Tracking to the Azure activity log for your VM.
After Change Tracking is enabled, go to the Overview pane for your VM and select Stop to stop your VM. When
prompted, select Yes to stop the VM. After the VM is deallocated, select Start to restart your VM.
Stopping and restarting a VM logs an event in its activity log. Go back to the Change tracking pane and select the
Events tab at the bottom of the pane. After a while, the events appear in the chart and the table. You can select
each event to view detailed information for that event.
The previous chart shows changes that have occurred over time. After you add an Azure Activity Log connection,
the line graph at the top displays Azure Activity Log events.
Each row of bar graphs represents a different trackable change type. These types are Linux daemons, files,
Windows registry keys, software, and Windows services. The Change tab shows the change details. Changes
appear in the order of when each occurred, with the most recent change shown first.
Next steps
In this tutorial, you configured and reviewed Change Tracking and Update Management for your VM. You learned
how to:
Create a resource group and VM.
Manage Windows updates.
Monitor changes and inventory.
Go to the next tutorial to learn about monitoring your VM.
Monitor virtual machines
Tutorial: Monitor a Windows virtual machine in Azure
11/14/2019 • 4 minutes to read • Edit Online
Azure monitoring uses agents to collect boot and performance data from Azure VMs, store this data in Azure
storage, and make it accessible through portal, the Azure PowerShell module, and Azure CLI. Advanced
monitoring is delivered with Azure Monitor for VMs by collecting performance metrics, discover application
components installed on the VM, and includes performance charts and dependency map.
In this tutorial, you learn how to:
Enable boot diagnostics on a VM
View boot diagnostics
View VM host metrics
Enable Azure Monitor for VMs
View VM performance metrics
Create an alert
$cred = Get-Credential
Now create the VM with New -AzVM. The following example creates a VM named myVM in the EastUS location. If
they do not already exist, the resource group myResourceGroupMonitorMonitor and supporting network
resources are created:
New-AzVm `
-ResourceGroupName "myResourceGroupMonitor" `
-Name "myVM" `
-Location "East US" `
-Credential $cred
NOTE
To create a new Log Analytics workspace to store the monitoring data from the VM, see Create a Log Analytics
workspace. Your Log Analytics workspace must belong to one of the supported regions.
After you've enabled monitoring, you might need to wait several minutes before you can view the performance
metrics for the VM.
Create alerts
You can create alerts based on specific performance metrics. Alerts can be used to notify you when average CPU
usage exceeds a certain threshold or available free disk space drops below a certain amount, for example. Alerts
are displayed in the Azure portal or can be sent via email. You can also trigger Azure Automation runbooks or
Azure Logic Apps in response to alerts being generated.
The following example creates an alert for average CPU usage.
1. In the Azure portal, click Resource Groups, select myResourceGroupMonitor, and then select myVM in
the resource list.
2. Click Alert rules on the VM blade, then click Add metric alert across the top of the alerts blade.
3. Provide a Name for your alert, such as myAlertRule
4. To trigger an alert when CPU percentage exceeds 1.0 for five minutes, leave all the other defaults selected.
5. Optionally, check the box for Email owners, contributors, and readers to send email notification. The default
action is to present a notification in the portal.
6. Click the OK button.
Next steps
In this tutorial, you configured and viewed performance of your VM. You learned how to:
Create a resource group and VM
Enable boot diagnostics on the VM
View boot diagnostics
View host metrics
Enable Azure Monitor for VMs
View VM metrics
Create an alert
Advance to the next tutorial to learn about Azure Security Center.
Manage VM security
Tutorial: Use Azure Security Center to monitor
Windows virtual machines
11/13/2019 • 4 minutes to read • Edit Online
Azure Security Center can help you gain visibility into your Azure resource security practices. Security Center
offers integrated security monitoring. It can detect threats that otherwise might go unnoticed. In this tutorial, you
learn about Azure Security Center, and how to:
Set up data collection
Set up security policies
View and fix configuration health issues
Review detected threats
Security Center goes beyond data discovery to provide recommendations for issues that it detects. For example, if
a VM was deployed without an attached network security group, Security Center displays a recommendation, with
remediation steps you can take. You get automated remediation without leaving the context of Security Center.
In this tutorial, we install a SQL, IIS, .NET stack using Azure PowerShell. This stack consists of two VMs running
Windows Server 2016, one with IIS and .NET and the other with SQL Server.
Create a VM
Install IIS and the .NET Core SDK on the VM
Create a VM running SQL Server
Install the SQL Server extension
Create an IIS VM
In this example, we use New -AzVM cmdlet in the PowerShell Cloud Shell to quickly create a Windows Server
2016 VM and then install IIS and the .NET Framework. The IIS and SQL VMs share a resource group and virtual
network, so we create variables for those names.
$vmName = "IISVM"
$vNetName = "myIISSQLvNet"
$resourceGroup = "myIISSQLGroup"
New-AzVm `
-ResourceGroupName $resourceGroup `
-Name $vmName `
-Location "East US" `
-VirtualNetworkName $vNetName `
-SubnetName "myIISSubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-AddressPrefix 192.168.0.0/16 `
-PublicIpAddressName "myIISPublicIpAddress" `
-OpenPorts 80,3389
Install IIS and the .NET framework using the custom script extension with the Set-AzVMExtension cmdlet.
Set-AzVMExtension `
-ResourceGroupName $resourceGroup `
-ExtensionName IIS `
-VMName $vmName `
-Publisher Microsoft.Compute `
-ExtensionType CustomScriptExtension `
-TypeHandlerVersion 1.4 `
-SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server,Web-Asp-Net45,NET-Framework-
Features"}' `
-Location EastUS
$vNet = Get-AzVirtualNetwork `
-Name $vNetName `
-ResourceGroupName $resourceGroup
Add-AzVirtualNetworkSubnetConfig `
-AddressPrefix 192.168.0.0/24 `
-Name mySQLSubnet `
-VirtualNetwork $vNet `
-ServiceEndpoint Microsoft.Sql
Update the vNet with the new subnet information using Set-AzVirtualNetwork
$vNet | Set-AzVirtualNetwork
Azure SQL VM
Use a pre-configured Azure marketplace image of a SQL server to create the SQL VM. We first create the VM,
then we install the SQL Server Extension on the VM.
New-AzVm `
-ResourceGroupName $resourceGroup `
-Name "mySQLVM" `
-ImageName "MicrosoftSQLServer:SQL2016SP1-WS2016:Enterprise:latest" `
-Location eastus `
-VirtualNetworkName $vNetName `
-SubnetName "mySQLSubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "mySQLPublicIpAddress" `
-OpenPorts 3389,1401
Use Set-AzVMSqlServerExtension to add the SQL Server extension to the SQL VM.
Set-AzVMSqlServerExtension `
-ResourceGroupName $resourceGroup `
-VMName mySQLVM `
-Name "SQLExtension" `
-Location "EastUS"
Next steps
In this tutorial, you installed a SQL\IIS\.NET stack using Azure PowerShell. You learned how to:
Create a VM
Install IIS and the .NET Core SDK on the VM
Create a VM running SQL Server
Install the SQL Server extension
Advance to the next tutorial to learn how to secure IIS web server with SSL certificates.
Secure IIS web server with SSL certificates
Tutorial: Secure a web server on a Windows virtual
machine in Azure with SSL certificates stored in Key
Vault
1/17/2020 • 4 minutes to read • Edit Online
NOTE
Currently this doc only works for Generalized images. If attempting this tutorial using a Specialized disk you will receive an
error.
To secure web servers, a Secure Sockets Layer (SSL ) certificate can be used to encrypt web traffic. These SSL
certificates can be stored in Azure Key Vault, and allow secure deployments of certificates to Windows virtual
machines (VMs) in Azure. In this tutorial you learn how to:
Create an Azure Key Vault
Generate or upload a certificate to the Key Vault
Create a VM and install the IIS web server
Inject the certificate into the VM and configure IIS with an SSL binding
Overview
Azure Key Vault safeguards cryptographic keys and secrets, such certificates or passwords. Key Vault helps
streamline the certificate management process and enables you to maintain control of keys that access those
certificates. You can create a self-signed certificate inside Key Vault, or upload an existing, trusted certificate that
you already own.
Rather than using a custom VM image that includes certificates baked-in, you inject certificates into a running VM.
This process ensures that the most up-to-date certificates are installed on a web server during deployment. If you
renew or replace a certificate, you don't also have to create a new custom VM image. The latest certificates are
automatically injected as you create additional VMs. During the whole process, the certificates never leave the
Azure platform or are exposed in a script, command-line history, or template.
Next, create a Key Vault with New -AzKeyVault. Each Key Vault requires a unique name, and should be all lower
case. Replace mykeyvault in the following example with your own unique Key Vault name:
$keyvaultName="mykeyvault"
New-AzKeyVault -VaultName $keyvaultName `
-ResourceGroup $resourceGroup `
-Location $location `
-EnabledForDeployment
$policy = New-AzKeyVaultCertificatePolicy `
-SubjectName "CN=www.contoso.com" `
-SecretContentType "application/x-pkcs12" `
-IssuerName Self `
-ValidityInMonths 12
Add-AzKeyVaultCertificate `
-VaultName $keyvaultName `
-Name "mycert" `
-CertificatePolicy $policy
$cred = Get-Credential
Now you can create the VM with New -AzVM. The following example creates a VM named myVM in the EastUS
location. If they do not already exist, the supporting network resources are created. To allow secure web traffic, the
cmdlet also opens port 443.
# Create a VM
New-AzVm `
-ResourceGroupName $resourceGroup `
-Name "myVM" `
-Location $location `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-Credential $cred `
-OpenPorts 443
It takes a few minutes for the VM to be created. The last step uses the Azure Custom Script Extension to install the
IIS web server with Set-AzVmExtension.
$PublicSettings = '{
"fileUris":["https://raw.githubusercontent.com/Azure-Samples/compute-automation-
configurations/master/secure-iis.ps1"],
"commandToExecute":"powershell -ExecutionPolicy Unrestricted -File secure-iis.ps1"
}'
Now you can open a web browser and enter https://<myPublicIP> in the address bar. To accept the security
warning if you used a self-signed certificate, select Details and then Go on to the webpage:
The following table provides links to PowerShell script samples that create and manage Windows virtual
machines (VMs).
Quickly create a virtual machine Creates a resource group, a virtual machine, and all related
resources, with a minimum of prompts.
Create a fully configured virtual machine Creates a resource group, a virtual machine, and all related
resources.
Create highly available virtual machines Creates several virtual machines in a highly-available and
load-balanced configuration.
Create a VM and run a configuration script Creates a virtual machine and uses the Azure Custom Script
extension to install IIS.
Create a VM and run a DSC configuration Creates a virtual machine and uses the Azure Desired State
Configuration (DSC) extension to install IIS.
Upload a VHD and create VMs Uploads a local VHD file to Azure, creates an image from the
VHD, and then creates a VM from that image.
Create a VM from a managed OS disk Creates a virtual machine by attaching an existing Managed
Disk as OS disk.
Create a VM from a snapshot Creates a virtual machine from a snapshot by first creating a
managed disk from the snapshot and then attaching the
new managed disk as OS disk.
Manage storage
Create a managed disk from a VHD in the same or a Creates a managed disk from a specialized VHD as an OS
different subscription disk, or from a data VHD as a data disk, in the same or a
different subscription.
Create a managed disk from a snapshot Creates a managed disk from a snapshot.
Copy a managed disk to the same or a different subscription Copies a managed disk to the same or a different
subscription that is in the same region as the parent
managed disk.
Export a snapshot as a VHD to a storage account Exports a managed snapshot as a VHD to a storage account
in a different region.
Export the VHD of a managed disk to a storage account Exports the underlying VHD of a managed disk to a storage
account in a different region.
Create a snapshot from a VHD Creates a snapshot from a VHD and then uses that snapshot
to create multiple identical managed disks quickly.
Copy a snapshot to the same or a different subscription Copies snapshot to the same or a different subscription that
is in the same region as the parent snapshot.
Encrypt a VM and its data disks Creates an Azure key vault, an encryption key, and a service
principal, and then encrypts a VM.
Monitor a VM with Azure Monitor Creates a virtual machine, installs the Azure Log Analytics
agent, and enrolls the VM in a Log Analytics workspace.
Collect details about all VMs in a subscription with Creates a csv that contains the VM Name, Resource Group
PowerShell Name, Region, Virtual Network, Subnet, Private IP Address,
OS Type, and Public IP Address of the VMs in the provided
subscription.
Create a virtual machine with PowerShell
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016. After running the script, you can
access the virtual machine over RDP.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Variables for common values
$resourceGroup = "myResourceGroup"
$location = "westeurope"
$vmName = "myVM"
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a fully configured virtual machine with
PowerShell
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016. After running the script, you can
access the virtual machine over RDP.
This sample requires Azure PowerShell Az 1.0 or later. Run Get-Module -ListAvailable Az to see which versions
are installed. If you need to install, see Install Azure PowerShell module.
Run Connect-AzAccount to sign in to Azure.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Variables for common values
$resourceGroup = "myResourceGroup"
$location = "westeurope"
$vmName = "myVM"
# Create a virtual network card and associate with public IP address and NSG
$nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $resourceGroup -Location $location `
-SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Load balance traffic between highly available virtual
machines
11/13/2019 • 5 minutes to read • Edit Online
This script sample creates everything needed to run several Windows Server 2016 virtual machines configured in
a highly available and load balanced configuration. After running the script, you will have three virtual machines,
joined to an Azure Availability Set, and accessible through an Azure Load Balancer.
This sample requires Azure PowerShell Az 1.0 or later. Run Get-Module -ListAvailable Az to see which versions
are installed. If you need to install, see Install Azure PowerShell module.
Run Connect-AzAccount to sign in to Azure.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Variables for common values
$rgName='MyResourceGroup'
$location='eastus'
# Create three virtual network cards and associate with public IP address and NSG.
$nicVM1 = New-AzNetworkInterface -ResourceGroupName $rgName -Location $location `
-Name 'MyNic1' -LoadBalancerBackendAddressPool $bepool -NetworkSecurityGroup $nsg `
-LoadBalancerInboundNatRule $natrule1 -Subnet $vnet.Subnets[0]
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
You can also create the VMs using your own custom managed image. In the VM configuration, for
Set-AzVMSourceImage use the -Id and -VM parameters instead of -PublisherName , -Offer , -Skus , and -Version .
For example, creating the VM config would be:
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create an IIS VM with PowerShell
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016, and then uses the Azure Virtual
Machine Custom Script Extension to install IIS. After running the script, you can access the default IIS website on
the public IP address of the virtual machine.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Variables for common values
$resourceGroup = "myResourceGroup"
$location = "westeurope"
$vmName = "myVM"
# Install IIS
$PublicSettings = '{"commandToExecute":"powershell Add-WindowsFeature Web-Server"}'
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create an IIS VM with PowerShell
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016, and then uses the Azure Virtual
Machine DSC Extension to install IIS. After running the script, you can access the default IIS website on the public
IP address of the virtual machine.
This sample requires Azure PowerShell Az 1.0 or later. Run Get-Module -ListAvailable Az to see which versions
are installed. If you need to install, see Install Azure PowerShell module.
Run Connect-AzAccount to sign in to Azure.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Variables for common values
$resourceGroup = "myResourceGroup"
$location = "westeurope"
$vmName = "myVM"
# Install IIS
$PublicSettings = '{"ModulesURL":"https://github.com/Azure/azure-quickstart-templates/raw/master/dsc-
extension-iis-server-windows-vm/ContosoWebsite.ps1.zip", "configurationFunction":
"ContosoWebsite.ps1\\ContosoWebsite", "Properties": {"MachineName": "myVM"} }'
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Sample script to upload a VHD to Azure and create a
new VM
11/13/2019 • 3 minutes to read • Edit Online
This script takes a local .vhd file from a generalized VM and uploads it to Azure, creates a Managed Disk image
and uses the to create a new VM.
This sample requires Azure PowerShell Az 1.0 or later. Run Get-Module -ListAvailable Az to see which versions
are installed. If you need to install, see Install Azure PowerShell module.
Run Connect-AzAccount to sign in to Azure.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Provide values for the variables
$resourceGroup = 'myResourceGroup'
$location = 'EastUS'
$storageaccount = 'mystorageaccount'
$storageType = 'Standard_LRS'
$containername = 'mycontainer'
$localPath = 'C:\Users\Public\Documents\Hyper-V\VHDs\generalized.vhd'
$vmName = 'myVM'
$imageName = 'myImage'
$vhdName = 'myUploadedVhd.vhd'
$diskSizeGB = '128'
$subnetName = 'mySubnet'
$vnetName = 'myVnet'
$ipName = 'myPip'
$nicName = 'myNic'
$nsgName = 'myNsg'
$ruleName = 'myRdpRule'
$computerName = 'myComputerName'
$vmSize = 'Standard_DS1_v2'
# Get the username and password to be used for the administrators account on the VM.
# This is used when connecting to the VM using RDP.
$cred = Get-Credential
# Create the VM
New-AzVM -VM $vm -ResourceGroupName $resourceGroup -Location $location
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a virtual machine using an existing managed
OS disk with PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script creates a virtual machine by attaching an existing managed disk as OS disk. Use this script in preceding
scenarios:
Create a VM from an existing managed OS disk that was copied from a managed disk in different subscription
Create a VM from an existing managed disk that was created from a specialized VHD file
Create a VM from an existing managed OS disk that was created from a snapshot
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id
$subscriptionId = 'yourSubscriptionId'
#Provide the name of the snapshot that will be used to create OS disk
$snapshotName = 'yourSnapshotName'
#Provide the name of the OS disk that will be created using the snapshot
$osDiskName = 'yourOSDiskName'
#Provide the name of an existing virtual network where virtual machine will be created
$virtualNetworkName = 'yourVNETName'
#Set the context to the subscription Id where Managed Disk will be created
Select-AzSubscription -SubscriptionId $SubscriptionId
#Use the Managed Disk Resource Id to attach it to the virtual machine. Please change the OS type to linux if
OS disk has linux OS
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -ManagedDiskId $disk.Id -CreateOption Attach -Windows
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
COMMAND NOTES
Get-AzDisk Gets disk object based on the name and the resource group
of a disk. Id property of the returned disk object is used to
attach the disk to a new VM
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a virtual machine from a snapshot with
PowerShell
12/10/2019 • 2 minutes to read • Edit Online
Sample script
#Provide the subscription Id
$subscriptionId = 'yourSubscriptionId'
#Provide the name of the snapshot that will be used to create OS disk
$snapshotName = 'yourSnapshotName'
#Provide the name of the OS disk that will be created using the snapshot
$osDiskName = 'yourOSDiskName'
#Provide the name of an existing virtual network where virtual machine will be created
$virtualNetworkName = 'yourVNETName'
#Set the context to the subscription Id where Managed Disk will be created
Select-AzSubscription -SubscriptionId $SubscriptionId
#Use the Managed Disk Resource Id to attach it to the virtual machine. Please change the OS type to linux if
OS disk has linux OS
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -ManagedDiskId $disk.Id -CreateOption Attach -Windows
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a managed disk from a VHD file in a storage
account in same or different subscription with
PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script creates a managed disk from a VHD file in a storage account in same or different subscription. Use this
script to import a specialized (not generalized/sysprepped) VHD to managed OS disk to create a virtual machine.
Also, use it to import a data VHD to managed data disk.
Don't create multiple identical managed disks from a VHD file in small amount of time. To create managed disks
from a vhd file, blob snapshot of the vhd file is created and then it is used to create managed disks. Only one blob
snapshot can be created in a minute that causes disk creation failures due to throttling. To avoid this throttling,
create a managed snapshot from the vhd file and then use the managed snapshot to create multiple managed
disks in short amount of time.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id where Managed Disks will be created
$subscriptionId = 'yourSubscriptionId'
#Provide the name of your resource group where Managed Disks will be created.
$resourceGroupName ='yourResourceGroupName'
#Provide the size of the disks in GB. It should be greater than the VHD file size.
$diskSize = '128'
#Provide the Azure region (e.g. westus) where Managed Disk will be located.
#This location should be same as the storage account where VHD file is stored
#Get all the Azure location using command below:
#Get-AzLocation
$location = 'westus'
#Provide the URI of the VHD file (page blob) in a storage account. Please not that this is NOT the SAS URI of
the storage container where VHD file is stored.
#e.g. https://contosostorageaccount1.blob.core.windows.net/vhds/contosovhd123.vhd
#Note: VHD file can be deleted as soon as Managed Disk is created.
$sourceVHDURI = 'https://contosostorageaccount1.blob.core.windows.net/vhds/contosovhd123.vhd'
#Provide the resource Id of the storage account where VHD file is stored.
#e.g. /subscriptions/6472s1g8-h217-446b-b509-
314e17e1efb0/resourceGroups/MDDemo/providers/Microsoft.Storage/storageAccounts/contosostorageaccount
#This is an optional parameter if you are creating managed disk in the same subscription
$storageAccountId =
'/subscriptions/yourSubscriptionId/resourceGroups/yourResourceGroupName/providers/Microsoft.Storage/storageAcc
ounts/yourStorageAccountName'
#Set the context to the subscription Id where Managed Disk will be created
Select-AzSubscription -SubscriptionId $SubscriptionId
Script explanation
This script uses following commands to create a managed disk from a VHD in different subscription. Each
command in the table links to command specific documentation.
COMMAND NOTES
Next steps
Create a virtual machine by attaching a managed disk as OS disk
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a managed disk from a snapshot with
PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script creates a managed disk from a snapshot. Use it to restore a virtual machine from snapshots of OS and
data disks. Create OS and data managed disks from respective snapshots and then create a new virtual machine
by attaching managed disks. You can also restore data disks of an existing VM by attaching data disks created from
snapshots.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id
$subscriptionId = 'yourSubscriptionId'
#Provide the name of the snapshot that will be used to create Managed Disks
$snapshotName = 'yourSnapshotName'
#Provide the size of the disks in GB. It should be greater than the VHD file size.
$diskSize = '128'
#Provide the Azure region (e.g. westus) where Managed Disks will be located.
#This location should be same as the snapshot location
#Get all the Azure location using command below:
#Get-AzLocation
$location = 'westus'
#Set the context to the subscription Id where Managed Disk will be created
Select-AzSubscription -SubscriptionId $SubscriptionId
Script explanation
This script uses following commands to create a managed disk from a snapshot. Each command in the table links
to command specific documentation.
COMMAND NOTES
Next steps
Create a virtual machine from a managed disk
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Copy managed disks in the same subscription or
different subscription with PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script creates a copy of an existing managed disk in the same subscription or different subscription. The new
disk is created in the same region as the parent managed disk.
If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and
then run Connect-AzAccount to create a connection with Azure. Also, you need to have an SSH public key named
id_rsa.pub in the .ssh directory of your user profile.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where managed disk exists
$sourceSubscriptionId='yourSourceSubscriptionId'
#Provide the name of your resource group where managed disk exists
$sourceResourceGroupName='mySourceResourceGroupName'
#Provide the subscription Id of the subscription where managed disk will be copied to
#If managed disk is copied to the same subscription then you can skip this step
$targetSubscriptionId='yourTargetSubscriptionId'
#Set the context to the subscription Id where managed disk will be copied to
#If snapshot is copied to the same subscription then you can skip this step
Select-AzSubscription -SubscriptionId $targetSubscriptionId
#Create a new managed disk in the target subscription and resource group
New-AzDisk -Disk $diskConfig -DiskName $managedDiskName -ResourceGroupName $targetResourceGroupName
Script explanation
This script uses following commands to create a new managed disk in the target subscription using the Id of the
source managed disk. Each command in the table links to command specific documentation.
COMMAND NOTES
Next steps
Create a virtual machine from a managed disk
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Export/Copy managed snapshots as VHD to a
storage account in different region with PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script exports a managed snapshot to a storage account in different region. It first generates the SAS URI of
the snapshot and then uses it to copy it to a storage account in different region. Use this script to maintain backup
of your managed disks in different region for disaster recovery.
If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and
then run Connect-AzAccount to create a connection with Azure. Also, you need to have an SSH public key named
id_rsa.pub in the .ssh directory of your user profile.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where snapshot is created
$subscriptionId = "yourSubscriptionId"
#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600.
#Know more about SAS here: https://docs.microsoft.com/en-us/Az.Storage/storage-dotnet-shared-access-signature-
part-1
$sasExpiryDuration = "3600"
#Provide storage account name where you want to copy the snapshot.
$storageAccountName = "yourstorageaccountName"
#Name of the storage container where the downloaded snapshot will be stored
$storageContainerName = "yourstoragecontainername"
#Provide the key of the storage account where you want to copy snapshot.
$storageAccountKey = 'yourStorageAccountKey'
#Provide the name of the VHD file to which snapshot will be copied.
$destinationVHDFileName = "yourvhdfilename"
COMMAND NOTES
Next steps
Create a managed disk from a VHD
Create a virtual machine from a managed disk
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Export/Copy the VHD of a managed disk to a
storage account in different region with PowerShell
12/10/2019 • 2 minutes to read • Edit Online
This script exports the VHD of a managed disk to a storage account in different region. It first generates the SAS
URI of the managed disk and then uses it to copy the underlying VHD to a storage account in different region. Use
this script to copy managed disks to another region for regional expansion.
If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and
then run Connect-AzAccount to create a connection with Azure. Also, you need to have an SSH public key named
id_rsa.pub in the .ssh directory of your user profile.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where managed disk is created
$subscriptionId = "yourSubscriptionId"
#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600.
#Know more about SAS here: https://docs.microsoft.com/en-us/Az.Storage/storage-dotnet-shared-access-signature-
part-1
$sasExpiryDuration = "3600"
#Provide storage account name where you want to copy the underlying VHD of the managed disk.
$storageAccountName = "yourstorageaccountName"
#Name of the storage container where the downloaded VHD will be stored
$storageContainerName = "yourstoragecontainername"
#Provide the key of the storage account where you want to copy the VHD of the managed disk.
$storageAccountKey = 'yourStorageAccountKey'
#Provide the name of the destination VHD file to which the VHD of the managed disk will be copied.
$destinationVHDFileName = "yourvhdfilename"
#Set the value to 1 to use AzCopy tool to download the data. This is the recommended option for faster copy.
#Download AzCopy v10 from the link here: https://docs.microsoft.com/en-us/azure/storage/common/storage-use-
azcopy-v10
#Ensure that AzCopy is downloaded in the same folder as this file
#If you set the value to 0 then Start-AzStorageBlobCopy will be used. Azure storage will asynchronously copy
the data.
$useAzCopy = 1
#Create the context of the storage account where the underlying VHD of the managed disk will be copied
$destinationContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey
$storageAccountKey
}else{
Script explanation
This script uses the following commands to generate SAS URI of a managed disk and copies the underlying VHD
to a storage account using the SAS URI. Each command in the table links to the command specific documentation.
COMMAND NOTES
Grant-AzDiskAccess Generates SAS URI for a managed disk that is used to copy
the underlying VHD to a storage account.
Next steps
Create a managed disk from a VHD
Create a virtual machine from a managed disk
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create a snapshot from a VHD to create multiple
identical managed disks in small amount of time with
PowerShell
1/2/2020 • 2 minutes to read • Edit Online
This script creates a snapshot from a VHD file in a storage account in same or different subscription. Use this
script to import a specialized (not generalized/sysprepped) VHD to a snapshot and then use the snapshot to create
multiple identical managed disks in small amount of time. Also, use it to import a data VHD to a snapshot and
then use the snapshot to create multiple managed disks in small amount of time.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id where snapshot will be created
$subscriptionId = 'yourSubscriptionId'
#Provide the name of your resource group where snapshot will be created.
$resourceGroupName ='yourResourceGroupName'
#Provide the Azure region (e.g. westus) where snapshot will be located.
#This location should be same as the storage account location where VHD file is stored
#Get all the Azure location using command below:
#Get-AzLocation
$location = 'westus'
#Provide the URI of the VHD file (page blob) in a storage account. Please not that this is NOT the SAS URI of
the storage container where VHD file is stored.
#e.g. https://contosostorageaccount1.blob.core.windows.net/vhds/contosovhd123.vhd
#Note: VHD file can be deleted as soon as Managed Disk is created.
$sourceVHDURI = 'https://yourStorageAccountName.blob.core.windows.net/vhds/yourVHDName.vhd'
#Provide the resource Id of the storage account where VHD file is stored.
#e.g. /subscriptions/6582b1g7-e212-446b-b509-
314e17e1efb0/resourceGroups/MDDemo/providers/Microsoft.Storage/storageAccounts/contosostorageaccount1
#This is an optional parameter if you are creating snapshot in the same subscription
$storageAccountId =
'/subscriptions/yourSubscriptionId/resourceGroups/yourResourceGroupName/providers/Microsoft.Storage/storageAcc
ounts/yourStorageAccountName'
#Set the context to the subscription Id where Managed Disk will be created
Select-AzSubscription -SubscriptionId $SubscriptionId
This script copies a snapshot of a managed disk to same or different subscription. Use this script for the following
scenarios:
1. Migrate a snapshot in Premium storage (Premium_LRS ) to Standard storage (Standard_LRS or Standard_ZRS )
to reduce your cost.
2. Migrate a snapshot from locally redundant storage (Premium_LRS, Standard_LRS ) to zone redundant storage
(Standard_ZRS ) to benefit from the higher reliability of ZRS storage.
3. Move a snapshot to different subscription in the same region for longer retention.
If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and
then run Connect-AzAccount to create a connection with Azure. Also, you need to have an SSH public key named
id_rsa.pub in the .ssh directory of your user profile.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where snapshot exists
$sourceSubscriptionId='yourSourceSubscriptionId'
#We recommend you to store your snapshots in Standard storage to reduce cost. Please use Standard_ZRS in
regions where zone redundant storage (ZRS) is available, otherwise use Standard_LRS
#Please check out the availability of ZRS here: https://docs.microsoft.com/en-us/Az.Storage/common/storage-
redundancy-zrs#support-coverage-and-regional-availability
$snapshotConfig = New-AzSnapshotConfig -SourceResourceId $snapshot.Id -Location $snapshot.Location -
CreateOption Copy -SkuName Standard_LRS
Script explanation
This script uses following commands to create a snapshot in the target subscription using the Id of the source
snapshot. Each command in the table links to command specific documentation.
COMMAND NOTES
Next steps
Create a virtual machine from a snapshot
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Encrypt a Windows virtual machine with Azure
PowerShell
11/13/2019 • 3 minutes to read • Edit Online
This script creates a secure Azure Key Vault, encryption keys, Azure Active Directory service principal, and a
Windows virtual machine (VM ). The VM is then encrypted using the encryption key from Key Vault and service
principal credentials.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# Edit these global variables with you unique Key Vault name, resource group name and location
#Name of the Key Vault
$keyVaultName = "myKeyVault00"
#Resource Group Name
$rgName = "myResourceGroup"
#Region
$location = "East US"
#Password to place w/in the KeyVault
$password = $([guid]::NewGuid()).Guid
$securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force
#Name for the Azure AD Application
$appName = "My App"
#Name for the VM to be encrypt
$vmName = "myEncryptedVM"
#user name for the admin account in the vm being created and then encrypted
$vmAdminName = "encryptedUser"
# Put the password in the Key Vault as a Key Vault Secret so we can use it later
# We should never put passwords in scripts.
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name adminCreds -SecretValue $securePassword
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name protectValue -SecretValue $securePassword
# Set permissions to allow your AAD service principal to read keys from Key Vault
# Set permissions to allow your AAD service principal to read keys from Key Vault
Set-AzKeyVaultAccessPolicy -VaultName $keyvaultName `
-ServicePrincipalName $app.ApplicationId `
-PermissionsToKeys decrypt,encrypt,unwrapKey,wrapKey,verify,sign,get,list,update `
-PermissionsToSecrets get,list,set,delete,backup,restore,recover,purge
<#
#clean up
Remove-AzResourceGroup -Name $rgName
#removes all of the Azure AD Applications you created w/ the same name
Remove-AzADApplication -ObjectId $app.ObjectId -Force
#>
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create the deployment. Each item in the table links to command
specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Create an Azure Monitor VM with PowerShell
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine, installs the Log Analytics agent, and enrolls the system with a Log
Analytics workspace. Once the script has run, the virtual machine will be visible in Azure Monitor. Also, you need
to update the Log Analytics workspace ID and workspace key.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
# OMS ID and OMS key
$omsId = "<Replace with your OMS ID>"
$omsKey = "<Replace with your OMS key>"
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Collect details about all VMs in a subscription with
PowerShell
12/6/2019 • 2 minutes to read • Edit Online
This script creates a csv that contains the VM Name, Resource Group Name, Region, Virtual Network, Subnet,
Private IP Address, OS Type, and Public IP Address of the VMs in the provided subscription.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id where the VMs reside
$subscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Select-AzSubscription $subscriptionId
$report = @()
$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) {
$info = "" | Select VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType,
PublicIPAddress
$vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id
foreach($publicIp in $publicIps) {
if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
$info.PublicIPAddress = $publicIp.ipaddress
}
}
$info.OsType = $vm.StorageProfile.OsDisk.OsType
$info.VMName = $vm.Name
$info.ResourceGroupName = $vm.ResourceGroupName
$info.Region = $vm.Location
$info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3]
$info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1]
$info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress
$report+=$info
}
$report | ft VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType,
PublicIPAddress
$report | Export-CSV "$home/$reportName"
Script explanation
This script uses following commands to create a csv export of the details of VMs in a subscription. Each command
in the table links to command specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure PowerShell module, see Azure PowerShell documentation.
Additional virtual machine PowerShell script samples can be found in the Azure Windows VM documentation.
Azure CLI Samples for Windows virtual machines
11/13/2019 • 2 minutes to read • Edit Online
The following table includes links to bash scripts built using the Azure CLI that deploy Windows virtual
machines.
Create a fully configured virtual machine Creates a resource group, virtual machine, and all related
resources.
Create highly available virtual machines Creates several virtual machines in a highly available and load
balanced configuration.
Create a VM and run configuration script Creates a virtual machine and uses the Azure Custom Script
extension to install IIS.
Create a VM and run DSC configuration Creates a virtual machine and uses the Azure Desired State
Configuration (DSC) extension to install IIS.
Manage storage
Create managed disk from a VHD Creates a managed disk from a specialized VHD as an OS disk
or from a data VHD as data disk.
Create a managed disk from a snapshot Creates a managed disk from a snapshot.
Copy managed disk to same or different subscription Copies managed disk to same or different subscription but in
the same region as the parent managed disk.
Export a snapshot as VHD to a storage account Exports a managed snapshot as VHD to a storage account in
different region.
Export the VHD of a managed disk to a storage account Exports the underlying VHD of a managed disk to a storage
account in different region.
Copy snapshot to same or different subscription Copies snapshot to same or different subscription but in the
same region as the parent snapshot.
Secure network traffic between virtual machines Creates two virtual machines, all related resources, and an
internal and external network security groups (NSG).
Monitor a VM with Azure Monitor Creates a virtual machine, installs the Log Analytics agent,
and enrolls the VM in a Log Analytics workspace.
Quick Create a virtual machine with the Azure CLI
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016. After running the script, you can
access the virtual machine through a Remote Desktop connection.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, virtual machine, and all related resources.
Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Create a virtual machine with the Azure CLI
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016. After running the script, you can
access the virtual machine through a Remote Desktop connection.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
# Create a virtual network card and associate with public IP address and NSG.
az network nic create \
--resource-group myResourceGroup \
--name myNic \
--vnet-name myVnet \
--subnet mySubnet \
--network-security-group myNetworkSecurityGroup \
--public-ip-address myPublicIP
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
az group delete --name myResourceGroup --yes
Script explanation
This script uses the following commands to create a resource group, virtual machine, and all related resources.
Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
az network public-ip create Creates a public IP address with a static IP address and an
associated DNS name.
az network nsg create Creates a network security group (NSG), which is a security
boundary between the internet and the virtual machine.
az network nic create Creates a virtual network card and attaches it to the virtual
network, subnet, and NSG.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Load balance traffic between highly available virtual
machines
11/13/2019 • 4 minutes to read • Edit Online
This script sample creates everything needed to run several Ubuntu virtual machines configured in a highly
available and load balanced configuration. After running the script, you will have three virtual machines, joined to
an Azure Availability Set, and accessible through an Azure Load Balancer.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
# Create three virtual network cards and associate with public IP address and NSG.
for i in `seq 1 3`; do
az network nic create \
--resource-group myResourceGroup --name myNic$i \
--vnet-name myVnet --subnet mySubnet \
--network-security-group myNetworkSecurityGroup --lb-name myLoadBalancer \
--lb-address-pools myBackEndPool --lb-inbound-nat-rules myLoadBalancerRuleSSH$i
done
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, virtual machine, availability set, load balancer,
and all related resources. Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
az network public-ip create Creates a public IP address with a static IP address and an
associated DNS name.
az network lb probe create Creates an NLB probe. An NLB probe is used to monitor each
VM in the NLB set. If any VM becomes inaccessible, traffic is
not routed to the VM.
az network lb rule create Creates an NLB rule. In this sample, a rule is created for port
80. As HTTP traffic arrives at the NLB, it is routed to port 80
one of the VMs in the NLB set.
az network lb inbound-nat-rule create Creates an NLB Network Address Translation (NAT) rule. NAT
rules map a port of the NLB to a port on a VM. In this sample,
a NAT rule is created for SSH traffic to each VM in the NLB set.
az network nsg create Creates a network security group (NSG), which is a security
boundary between the internet and the virtual machine.
az network nsg rule create Creates an NSG rule to allow inbound traffic. In this sample,
port 22 is opened for SSH traffic.
az network nic create Creates a virtual network card and attaches it to the virtual
network, subnet, and NSG.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Quick Create a virtual machine with the Azure CLI
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine running Windows Server 2016, and uses the Azure Virtual Machine
Custom Script Extension to install IIS. After running the script, you can access the default IIS website on the public
IP address of the virtual machine.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, virtual machine, and all related resources.
Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
azure vm extension set Adds and runs a virtual machine extension to a VM. In this
sample, the custom script extension is used to install IIS.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Create a VM with IIS using DSC
11/13/2019 • 2 minutes to read • Edit Online
This script creates a virtual machine, and uses the Azure Virtual Machine DSC custom script extension to install
and configure IIS.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
# Create a VM
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image win2016datacenter \
--admin-username azureuser \
--admin-password $AdminPassword
# Start a CustomScript extension to use a simple bash script to update, download and install WordPress and
MySQL
az vm extension set \
--name DSC \
--publisher Microsoft.Powershell \
--version 2.19 \
--vm-name myVM \
--resource-group myResourceGroup \
--settings '{"ModulesURL":"https://github.com/Azure/azure-quickstart-templates/raw/master/dsc-extension-
iis-server-windows-vm/ContosoWebsite.ps1.zip", "configurationFunction": "ContosoWebsite.ps1\\ContosoWebsite",
"Properties": {"MachineName": "myVM"} }'
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
az vm extension set Add the Custom Script Extension to the virtual machine which
invokes a script to install IIS.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Create a managed disk from a VHD file in a storage
account in the same subscription with CLI
12/10/2019 • 2 minutes to read • Edit Online
This script creates a managed disk from a VHD file in a storage account in the same subscription. Use this script to
import a specialized (not generalized/sysprepped) VHD to managed OS disk to create a virtual machine. Or, use it
to import a data VHD to managed data disk.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or
Command Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id
subscriptionId=mySubscriptionId
#Provide the size of the disks in GB. It should be greater than the VHD file size.
diskSize=128
#Provide the URI of the VHD file that will be used to create Managed Disk.
# VHD file can be deleted as soon as Managed Disk is created.
# e.g. https://contosostorageaccount1.blob.core.windows.net/vhds/contosovhd123.vhd
vhdUri=https://contosostorageaccount1.blob.core.windows.net/vhds/contosoumd78620170425131836.vhd
#Provide the storage type for the Managed Disk. Premium_LRS or Standard_LRS.
storageType=Premium_LRS
#Provide the Azure location (e.g. westus) where Managed Disk will be located.
#The location should be same as the location of the storage account where VHD file is stored.
#Get all the Azure location supported for your subscription using command below:
#az account list-locations
location=westus
#Set the context to the subscription Id where Managed Disk will be created
az account set --subscription $subscriptionId
Script explanation
This script uses following commands to create a managed disk from a VHD. Each command in the table links to
command specific documentation.
COMMAND NOTES
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Create a managed disk from a snapshot with CLI
12/10/2019 • 2 minutes to read • Edit Online
This script creates a managed disk from a snapshot. Use it to restore a virtual machine from snapshots of OS and
data disks. Create OS and data managed disks from respective snapshots and then create a new virtual machine
by attaching managed disks. You can also restore data disks of an existing VM by attaching data disks created from
snapshots.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where you want to create Managed Disks
subscriptionId=dd80b94e-0463-4a65-8d04-c94f403879dc
#Provide the name of the snapshot that will be used to create Managed Disks
snapshotName=mySnapshotName
#Provide the name of the new Managed Disks that will be create
diskName=myDiskName
#Provide the size of the disks in GB. It should be greater than the VHD file size.
diskSize=128
#Set the context to the subscription Id where Managed Disk will be created
az account set --subscription $subscriptionId
Script explanation
This script uses following commands to create a managed disk from a snapshot. Each command in the table links
to command specific documentation.
COMMAND NOTES
az snapshot show Gets all the properties of a snapshot using the name and
resource group properties of the snapshot. Id property is
used to create managed disk.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Copy managed disks to same or different
subscription with CLI
12/10/2019 • 2 minutes to read • Edit Online
This script copies a managed disk to same or different subscription but in the same region. The copy works only
when the subscriptions are part of same AAD tenant.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where managed disk exists
sourceSubscriptionId=dd80b94e-0463-4a65-8d04-c94f403879dc
#Provide the name of your resource group where managed disk exists
sourceResourceGroupName=mySourceResourceGroupName
#If managedDiskId is blank then it means that managed disk does not exist.
echo 'source managed disk Id is: ' $managedDiskId
#Provide the subscription Id of the subscription where managed disk will be copied to
targetSubscriptionId=6492b1f7-f219-446b-b509-314e17e1efb0
#Set the context to the subscription Id where managed disk will be copied to
az account set --subscription $targetSubscriptionId
Script explanation
This script uses following commands to create a new managed disk in the target subscription using the Id of the
source managed disk. Each command in the table links to command specific documentation.
COMMAND NOTES
az disk show Gets all the properties of a managed disk using the name and
resource group properties of the managed disk. Id property is
used to copy the managed disk to different subscription.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Export/Copy a snapshot to a storage account in
different region with CLI
12/10/2019 • 2 minutes to read • Edit Online
This script exports a managed snapshot to a storage account in different region. It first generates the SAS URI of
the snapshot and then uses it to copy it to a storage account in different region. Use this script to maintain backup
of your managed disks in different region for disaster recovery.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id where snapshot is created
subscriptionId=dd80b94e-0463-4a65-8d04-c94f403879dc
#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600.
#Know more about SAS here: https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-
signature-part-1
sasExpiryDuration=3600
#Provide storage account name where you want to copy the snapshot.
storageAccountName=mystorageaccountname
#Name of the storage container where the downloaded snapshot will be stored
storageContainerName=mystoragecontainername
#Provide the key of the storage account where you want to copy snapshot.
storageAccountKey=mystorageaccountkey
#Provide the name of the VHD file to which snapshot will be copied.
destinationVHDFileName=myvhdfilename
COMMAND NOTES
az snapshot grant-access Generates read-only SAS that is used to copy underlying VHD
file to a storage account or download it to on-premises
az storage blob copy start Copies a blob asynchronously from one storage account to
another
Next steps
Create a managed disk from a VHD
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Export/Copy a managed disk to a storage account
using the Azure CLI
12/10/2019 • 2 minutes to read • Edit Online
This script exports the underlying VHD of a managed disk to a storage account in same or different region. It first
generates the SAS URI of the managed disk and then uses it to copy the VHD to a storage account. Use this script
to copy your managed disks for regional expansion.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id where managed disk is created
subscriptionId=yourSubscriptionId
#Provide the name of your resource group where managed disk is created
resourceGroupName=myResourceGroupName
#Provide Shared Access Signature (SAS) expiry duration in seconds e.g. 3600.
#Know more about SAS here: https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-
signature-part-1
sasExpiryDuration=3600
#Provide storage account name where you want to copy the underlying VHD file of the managed disk.
storageAccountName=mystorageaccountname
#Name of the storage container where the downloaded VHD will be stored
storageContainerName=mystoragecontainername
#Provide the key of the storage account where you want to copy the VHD
storageAccountKey=mystorageaccountkey
#Provide the name of the destination VHD file to which the VHD of the managed disk will be copied.
destinationVHDFileName=myvhdfilename.vhd
COMMAND NOTES
az disk grant-access Generates read-only SAS that is used to copy the underlying
VHD file to a storage account or download it to on-premises
az storage blob copy start Copies a blob asynchronously from one storage account to
another
Next steps
Create a managed disk from a VHD
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Copy snapshot of a managed disk to same or
different subscription with CLI
12/10/2019 • 2 minutes to read • Edit Online
This script copies a snapshot of a managed disk to same or different subscription. Use this script for the following
scenarios:
1. Migrate a snapshot in Premium storage (Premium_LRS ) to Standard storage (Standard_LRS or Standard_ZRS )
to reduce your cost.
2. Migrate a snapshot from locally redundant storage (Premium_LRS, Standard_LRS ) to zone redundant storage
(Standard_ZRS ) to benefit from the higher reliability of ZRS storage.
3. Move a snapshot to different subscription in the same region for longer retention.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#Provide the subscription Id of the subscription where snapshot exists
sourceSubscriptionId=dd80b94e-0463-4a65-8d04-c94f403879dc
#If snapshotId is blank then it means that snapshot does not exist.
echo 'source snapshot Id is: ' $snapshotId
Script explanation
This script uses following commands to create a snapshot in the target subscription using the Id of the source
snapshot. Each command in the table links to command specific documentation.
COMMAND NOTES
az snapshot show Gets all the properties of a snapshot using the name and
resource group properties of the snapshot. Id property is
used to copy the snapshot to different subscription.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine and managed disks CLI script samples can be found in the Azure Windows VM
documentation.
Secure network traffic between virtual machines
11/13/2019 • 3 minutes to read • Edit Online
This script creates two virtual machines and secures incoming traffic to both. One virtual machine is accessible on
the internet and has a network security group (NSG ) configured to allow traffic on port 3389 and port 80. The
second virtual machine is not accessible on the internet, and has an NSG configured to only allow traffic from the
first virtual machine.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
# Update back-end network security group rule to limit SSH to source prefix (priority 100).
az network nsg rule update --resource-group myResourceGroup --nsg-name myNetworkSecurityGroupBackEnd \
--name $nsgrule --protocol tcp --direction inbound --priority 100 \
--source-address-prefix 10.0.1.0/24 --source-port-range '*' --destination-address-prefix '*' \
--destination-port-range 22 --access allow
# Create backend NSG rule to block all incoming traffic (priority 200).
az network nsg rule create --resource-group myResourceGroup --nsg-name myNetworkSecurityGroupBackEnd \
--name denyAll --access Deny --protocol Tcp --direction Inbound --priority 200 \
--source-address-prefix "*" --source-port-range "*" --destination-address-prefix "*" --destination-port-
range "*"
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, virtual machine, and all related resources.
Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
az network nsg rule update Updates an NSG rule. In this sample, the back-end rule is
updated to pass through traffic only from the front-end
subnet.
az network nsg rule list Returns information about a network security group rule. In
this sample, the rule name is stored in a variable for use later
in the script.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Encrypt a Windows virtual machine in Azure
11/13/2019 • 2 minutes to read • Edit Online
This script creates a secure Azure Key Vault, encryption keys, Azure Active Directory service principal, and a
Windows virtual machine (VM ). The VM is then encrypted using the encryption key from Key Vault and service
principal credentials.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/bash
# Create a Key Vault for storing keys and enabled for disk encryption.
az keyvault create --name $keyvault_name --resource-group myResourceGroup --location eastus \
--enabled-for-disk-encryption True
# Create an Azure Active Directory service principal for authenticating requests to Key Vault.
# Read in the service principal ID and password for use in later commands.
read sp_id sp_password <<< $(az ad sp create-for-rbac --query [appId,password] -o tsv)
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, Azure Key Vault, service principal, virtual
machine, and all related resources. Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
az keyvault create Creates an Azure Key Vault to store secure data such as
encryption keys.
az keyvault set-policy Sets permissions on the Key Vault to grant the service
principal access to encryption keys.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Monitor a VM with Azure Monitor logs
11/13/2019 • 2 minutes to read • Edit Online
This script creates an Azure Virtual Machine, installs the Log Analytics agent, and enrolls the system with a Log
Analytics workspace. Once the script has run, the virtual machine will be visible in Azure Monitoring.
To run this sample, install the latest version of the Azure CLI. To start, run az login to create a connection with
Azure.
Samples for the Azure CLI are written for the bash shell. To run this sample in Windows PowerShell or Command
Prompt, you may need to change elements of the script.
If you don't have an Azure subscription, create a free account before you begin.
Sample script
#!/bin/sh
Clean up deployment
Run the following command to remove the resource group, VM, and all related resources.
Script explanation
This script uses the following commands to create a resource group, virtual machine, and all related resources.
Each command in the table links to command specific documentation.
COMMAND NOTES
az group create Creates a resource group in which all resources are stored.
Next steps
For more information on the Azure CLI, see Azure CLI documentation.
Additional virtual machine CLI script samples can be found in the Azure Windows VM documentation.
Azure Resource Manager overview
12/23/2019 • 5 minutes to read • Edit Online
Azure Resource Manager is the deployment and management service for Azure. It provides a management layer
that enables you to create, update, and delete resources in your Azure subscription. You use management
features, like access control, locks, and tags, to secure and organize your resources after deployment.
To learn about Azure Resource Manager templates, see Template deployment overview.
All capabilities that are available in the portal are also available through PowerShell, Azure CLI, REST APIs, and
client SDKs. Functionality initially released through APIs will be represented in the portal within 180 days of
initial release.
Terminology
If you're new to Azure Resource Manager, there are some terms you might not be familiar with.
resource - A manageable item that is available through Azure. Virtual machines, storage accounts, web apps,
databases, and virtual networks are examples of resources.
resource group - A container that holds related resources for an Azure solution. The resource group includes
those resources that you want to manage as a group. You decide which resources belong in a resource group
based on what makes the most sense for your organization. See Resource groups.
resource provider - A service that supplies Azure resources. For example, a common resource provider is
Microsoft.Compute, which supplies the virtual machine resource. Microsoft.Storage is another common
resource provider. See Resource providers and types.
Resource Manager template - A JavaScript Object Notation (JSON ) file that defines one or more resources
to deploy to a resource group or subscription. The template can be used to deploy the resources consistently
and repeatedly. See Template deployment overview.
declarative syntax - Syntax that lets you state "Here is what I intend to create" without having to write the
sequence of programming commands to create it. The Resource Manager template is an example of
declarative syntax. In the file, you define the properties for the infrastructure to deploy to Azure. See Template
deployment overview.
Understand scope
Azure provides four levels of scope: management groups, subscriptions, resource groups, and resources. The
following image shows an example of these layers.
You apply management settings at any of these levels of scope. The level you select determines how widely the
setting is applied. Lower levels inherit settings from higher levels. For example, when you apply a policy to the
subscription, the policy is applied to all resource groups and resources in your subscription. When you apply a
policy on the resource group, that policy is applied the resource group and all its resources. However, another
resource group doesn't have that policy assignment.
You can deploy templates to management groups, subscriptions, or resource groups.
Resource groups
There are some important factors to consider when defining your resource group:
All the resources in your group should share the same lifecycle. You deploy, update, and delete them
together. If one resource, such as a database server, needs to exist on a different deployment cycle it should
be in another resource group.
Each resource can only exist in one resource group.
You can add or remove a resource to a resource group at any time.
You can move a resource from one resource group to another group. For more information, see Move
resources to new resource group or subscription.
A resource group can contain resources that are located in different regions.
A resource group can be used to scope access control for administrative actions.
A resource can interact with resources in other resource groups. This interaction is common when the two
resources are related but don't share the same lifecycle (for example, web apps connecting to a database).
When creating a resource group, you need to provide a location for that resource group. You may be wondering,
"Why does a resource group need a location? And, if the resources can have different locations than the resource
group, why does the resource group location matter at all?" The resource group stores metadata about the
resources. When you specify a location for the resource group, you're specifying where that metadata is stored.
For compliance reasons, you may need to ensure that your data is stored in a particular region.
If the resource group's region is temporarily unavailable, you can't update resources in the resource group
because the metadata is unavailable. The resources in other regions will still function as expected, but you can't
update them. For more information about building reliable applications, see Designing reliable Azure
applications.
Next steps
For all the operations offered by resource providers, see the Azure REST APIs.
To learn about moving resources, see Move resources to new resource group or subscription.
To learn about tagging resources, see Use tags to organize your Azure resources.
To learn about locking resources, see Lock resources to prevent unexpected changes.
For information about creating templates for deployments, see Template deployment overview.
Regions for virtual machines in Azure
1/19/2020 • 4 minutes to read • Edit Online
It is important to understand how and where your virtual machines (VMs) operate in Azure, along with your
options to maximize performance, availability, and redundancy. This article provides you with an overview of the
availability and redundancy features of Azure.
Region pairs
Each Azure region is paired with another region within the same geography (such as US, Europe, or Asia). This
approach allows for the replication of resources, such as VM storage, across a geography that should reduce the
likelihood of natural disasters, civil unrest, power outages, or physical network outages affecting both regions at
once. Additional advantages of region pairs include:
In the event of a wider Azure outage, one region is prioritized out of every pair to help reduce the time to
restore for applications.
Planned Azure updates are rolled out to paired regions one at a time to minimize downtime and risk of
application outage.
Data continues to reside within the same geography as its pair (except for Brazil South) for tax and law
enforcement jurisdiction purposes.
Examples of region pairs include:
PRIMARY SECONDARY
West US East US
Feature availability
Some services or VM features are only available in certain regions, such as specific VM sizes or storage types.
There are also some global Azure services that do not require you to select a particular region, such as Azure
Active Directory, Traffic Manager, or Azure DNS. To assist you in designing your application environment, you can
check the availability of Azure services across each region. You can also programmatically query the supported VM
sizes and restrictions in each region.
Storage availability
Understanding Azure regions and geographies becomes important when you consider the available storage
replication options. Depending on the storage type, you have different replication options.
Azure Managed Disks
Locally redundant storage (LRS )
Replicates your data three times within the region in which you created your storage account.
Storage account-based disks
Locally redundant storage (LRS )
Replicates your data three times within the region in which you created your storage account.
Zone redundant storage (ZRS )
Replicates your data three times across two to three facilities, either within a single region or across two
regions.
Geo-redundant storage (GRS )
Replicates your data to a secondary region that is hundreds of miles away from the primary region.
Read-access geo-redundant storage (RA-GRS )
Replicates your data to a secondary region, as with GRS, but also then provides read-only access to the
data in the secondary location.
The following table provides a quick overview of the differences between the storage replication types:
REPLICATION
STRATEGY LRS ZRS GRS RA-GRS
Number of copies of 3 3 6 6
data maintained on
separate nodes.
You can read more about Azure Storage replication options here. For more information about managed disks, see
Azure Managed Disks overview.
Storage costs
Prices vary depending on the storage type and availability that you select.
Azure Managed Disks
Premium Managed Disks are backed by Solid-State Drives (SSDs) and Standard Managed Disks are backed by
regular spinning disks. Both Premium and Standard Managed Disks are charged based on the provisioned
capacity for the disk.
Unmanaged disks
Premium storage is backed by Solid-State Drives (SSDs) and is charged based on the capacity of the disk.
Standard storage is backed by regular spinning disks and is charged based on the in-use capacity and desired
storage availability.
For RA-GRS, there is an additional Geo-Replication Data Transfer charge for the bandwidth of replicating
that data to another Azure region.
See Azure Storage Pricing for pricing information on the different storage types and availability options.
Availability options for virtual machines in Azure
1/19/2020 • 5 minutes to read • Edit Online
This article provides you with an overview of the availability features of Azure virtual machines (VMs).
High availability
Workloads are typically spread across different virtual machines to gain high throughput, performance, and to
create redundancy in case a VM is impacted due to an update or other event.
There are few options that Azure provides to achieve High Availability. First let’s talk about basic constructs.
Availability zones
Availability zones expand the level of control you have to maintain the availability of the applications and data on
your VMs. An Availability Zone is a physically separate zone, within an Azure region. There are three Availability
Zones per supported Azure region.
Each Availability Zone has a distinct power source, network, and cooling. By architecting your solutions to use
replicated VMs in zones, you can protect your apps and data from the loss of a datacenter. If one zone is
compromised, then replicated apps and data are instantly available in another zone.
Adding new VM to Scale Set VMs are explicitly added to the scale set VMs are implicitly created and added to
when the VM is created. the scale set based on the VM
configuration model, instance count,
and AutoScaling rules.
Fault domains Can define fault domains count. 2 or 3 Can define 1, 2, or 3 fault domains for
based on regional support and 5 for non-zonal deployments, and 5 for
Availability zone. The assigned VM fault Availability zone deployments. The
domain will persist with VM lifecycle, assigned VM fault domain does not
including deallocate and restart. persist with VM lifecycle, virtual
machines are assigned a fault domain at
time of allocation.
Update domains N/A. Update domains are automatically N/A. Update domains are automatically
mapped to fault domains mapped to fault domains
Availability sets
An availability set is a logical grouping of VMs within a datacenter that allows Azure to understand how your
application is built to provide for redundancy and availability. We recommended that two or more VMs are created
within an availability set to provide for a highly available application and to meet the 99.95% Azure SLA. There is
no cost for the Availability Set itself, you only pay for each VM instance that you create. When a single VM is using
Azure premium SSDs, the Azure SLA applies for unplanned maintenance events.
In an availability set, VMs are automatically distributed across these fault domains. This approach limits the impact
of potential physical hardware failures, network outages, or power interruptions.
For VMs using Azure Managed Disks, VMs are aligned with managed disk fault domains when using a managed
availability set. This alignment ensures that all the managed disks attached to a VM are within the same managed
disk fault domain.
Only VMs with managed disks can be created in a managed availability set. The number of managed disk fault
domains varies by region - either two or three managed disk fault domains per region. You can read more about
these managed disk fault domains for Linux VMs or Windows VMs.
VMs within an availability set are also automatically distributed across update domains.
Next steps
You can now start to use these availability and redundancy features to build your Azure environment. For best
practices information, see Azure availability best practices.
Co-locate resource for improved latency
10/30/2019 • 3 minutes to read • Edit Online
When deploying your application in Azure, spreading instances across regions or availability zones creates network
latency, which may impact the overall performance of your application.
Best practices
For the lowest latency, use proximity placement groups together with accelerated networking. For more
information, see Create a Linux virtual machine with Accelerated Networking or Create a Windows virtual
machine with Accelerated Networking.
Deploy all VM sizes in a single template. In order to avoid landing on hardware that doesn't support all the VM
SKUs and sizes you require, include all of the application tiers in a single template so that they will all be
deployed at the same time.
If you are scripting your deployment using PowerShell, CLI or the SDK, you may get an allocation error
OverconstrainedAllocationRequest . In this case, you should stop/deallocate all the existing VMs, and change the
sequence in the deployment script to begin with the VM SKU/sizes that failed.
When reusing an existing placement group from which VMs were deleted, wait for the deletion to fully
complete before adding VMs to it.
If latency is your first priority, put VMs in a proximity placement group and the entire solution in an availability
zone. But, if resiliency is your top priority, spread your instances across multiple availability zones (a single
proximity placement group cannot span zones).
Next steps
Deploy a VM to a proximity placement group using Azure PowerShell.
Learn how to test network latency.
Learn how to optimize network throughput.
Learn how to use proximity placement groups with SAP applications.
Optimize network throughput for Azure virtual
machines
1/6/2020 • 3 minutes to read • Edit Online
Azure virtual machines (VM ) have default network settings that can be further optimized for network
throughput. This article describes how to optimize network throughput for Microsoft Azure Windows and Linux
VMs, including major distributions such as Ubuntu, CentOS, and Red Hat.
Windows VM
If your Windows VM supports Accelerated Networking, enabling that feature would be the optimal
configuration for throughput. For all other Windows VMs, using Receive Side Scaling (RSS ) can reach higher
maximal throughput than a VM without RSS. RSS may be disabled by default in a Windows VM. To determine
whether RSS is enabled, and enable it if it's currently disabled, complete the following steps:
1. See if RSS is enabled for a network adapter with the Get-NetAdapterRss PowerShell command. In the
following example output returned from the Get-NetAdapterRss , RSS is not enabled.
Name : Ethernet
InterfaceDescription : Microsoft Hyper-V Network Adapter
Enabled : False
The previous command does not have an output. The command changed NIC settings, causing
temporary connectivity loss for about one minute. A Reconnecting dialog box appears during the
connectivity loss. Connectivity is typically restored after the third attempt.
3. Confirm that RSS is enabled in the VM by entering the Get-NetAdapterRss command again. If successful,
the following example output is returned:
Name : Ethernet
InterfaceDescription : Microsoft Hyper-V Network Adapter
Enabled : True
Linux VM
RSS is always enabled by default in an Azure Linux VM. Linux kernels released since October 2017 include new
network optimizations options that enable a Linux VM to achieve higher network throughput.
Ubuntu for new deployments
The Ubuntu Azure kernel provides the best network performance on Azure and has been the default kernel
since September 21, 2017. In order to get this kernel, first install the latest supported version of 16.04-LTS, as
follows:
"Publisher": "Canonical",
"Offer": "UbuntuServer",
"Sku": "16.04-LTS",
"Version": "latest"
After the creation is complete, enter the following commands to get the latest updates. These steps also work
for VMs currently running the Ubuntu Azure kernel.
The following optional command set may be helpful for existing Ubuntu deployments that already have the
Azure kernel but that have failed to further updates with errors.
#optional steps may be helpful in existing deployments with the Azure kernel
#run as root or preface with sudo
apt-get -f install
apt-get --fix-missing install
apt-get clean
apt-get -y update
apt-get -y upgrade
apt-get -y dist-upgrade
If your VM does not have the Azure kernel, the version number usually begins with "4.4." If the VM does not
have the Azure kernel, run the following commands as root:
CentOS
In order to get the latest optimizations, it is best to create a VM with the latest supported version by specifying
the following parameters:
"Publisher": "OpenLogic",
"Offer": "CentOS",
"Sku": "7.4",
"Version": "latest"
New and existing VMs can benefit from installing the latest Linux Integration Services (LIS ). The throughput
optimization is in LIS, starting from 4.2.2-2, although later versions contain further improvements. Enter the
following commands to install the latest LIS:
Red Hat
In order to get the optimizations, it is best to create a VM with the latest supported version by specifying the
following parameters:
"Publisher": "RedHat"
"Offer": "RHEL"
"Sku": "7-RAW"
"Version": "latest"
New and existing VMs can benefit from installing the latest Linux Integration Services (LIS ). The throughput
optimization is in LIS, starting from 4.2. Enter the following commands to download and install LIS:
wget https://aka.ms/lis
tar xvf lis
cd LISISO
sudo ./install.sh #or upgrade.sh if prior LIS was previously installed
Learn more about Linux Integration Services Version 4.2 for Hyper-V by viewing the download page.
Next steps
See the optimized result with Bandwidth/Throughput testing Azure VM for your scenario.
Read about how bandwidth is allocated to virtual machines
Learn more with Azure Virtual Network frequently asked questions (FAQ )
Sizes for Windows virtual machines in Azure
2/25/2020 • 2 minutes to read • Edit Online
This article describes the available sizes and options for the Azure virtual machines you can use to run your
Windows apps and workloads. It also provides deployment considerations to be aware of when you're planning
to use these resources. This article is also available for Linux virtual machines.
General purpose B, Dsv3, Dv3, Dasv4, Dav4, DSv2, Dv2, Balanced CPU-to-memory ratio. Ideal
Av2, DC for testing and development, small to
medium databases, and low to
medium traffic web servers.
Memory optimized Esv3, Ev3, Easv4, Eav4, Mv2, M, DSv2, High memory-to-CPU ratio. Great for
Dv2 relational database servers, medium to
large caches, and in-memory analytics.
GPU NC, NCv2, NCv3, ND, NDv2 (Preview), Specialized virtual machines targeted
NV, NVv3, NVv4 for heavy graphic rendering and video
editing, as well as model training and
inferencing (ND) with deep learning.
Available with single or multiple GPUs.
High performance compute HB, HC, H Our fastest and most powerful CPU
virtual machines with optional high-
throughput network interfaces
(RDMA).
For information about pricing of the various sizes, see Virtual Machines Pricing.
To see general limits on Azure VMs, see Azure subscription and service limits, quotas, and constraints.
Storage costs are calculated separately based on used pages in the storage account. For details, Azure
Storage Pricing.
Learn more about how Azure compute units (ACU ) can help you compare compute performance across
Azure SKUs.
REST API
For information on using the REST API to query for VM sizes, see the following:
List available virtual machine sizes for resizing
List available virtual machine sizes for a subscription
List available virtual machine sizes in an availability set
ACU
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Benchmark scores
Learn more about compute performance for Windows VMs using the CoreMark benchmark scores.
Next steps
Learn more about the different VM sizes that are available:
General purpose
Compute optimized
Memory optimized
Storage optimized
GPU optimized
High performance compute
Check the Previous generation page for A Standard, Dv1 (D1-4 and D11-14 v1), and A8-A11 series
Support for generation 2 VMs on Azure
2/12/2020 • 6 minutes to read • Edit Online
Support for generation 2 virtual machines (VMs) is now available on Azure. You can't change a virtual machine's
generation after you've created it, so review the considerations on this page before you choose a generation.
Generation 2 VMs support key features that aren't supported in generation 1 VMs. These features include
increased memory, Intel Software Guard Extensions (Intel SGX), and virtualized persistent memory (vPMEM ).
Generation 2 VMs running on-premises, have some features that aren't supported in Azure yet. For more
information, see the Features and capabilities section.
Generation 2 VMs use the new UEFI-based boot architecture rather than the BIOS -based architecture used by
generation 1 VMs. Compared to generation 1 VMs, generation 2 VMs might have improved boot and installation
times. For an overview of generation 2 VMs and some of the differences between generation 1 and generation 2,
see Should I create a generation 1 or 2 virtual machine in Hyper-V?.
Generation 2 VM sizes
Generation 1 VMs are supported by all VM sizes in Azure (except for Mv2-series VMs). Azure now offers
generation 2 support for the following selected VM series:
B -series
DC -series
Dsv2-series and Dsv3-series
Esv3-series
Fsv2-series
GS -series
HB -series
HC -series
Ls-series and Lsv2-series
Mv2-series
NCv2-series and NCv3-series
ND -series
NVv3-series
NOTE
The usage of generation 2 VM images for Mv2-series VMs is generally available since the Mv2-series works with generation
2 VM images exclusively. Generation 1 VM images are not supported on Mv2-series VMs.
Secure boot ✔
Shielded VM ✔
vTPM ✔
VHDX format ✔
OS disk > 2 TB ✔
Custom disk/image/swap OS ✔ ✔
Backup/restore ✔ ✔
Creating a generation 2 VM
Marketplace image
In the Azure portal or Azure CLI, you can create generation 2 VMs from a Marketplace image that supports UEFI
boot.
Azure portal
Below are the steps to create a generation 2 (Gen2) VM in Azure portal.
1. Sign in to the Azure portal at https://portal.azure.com.
2. Select Create a resource.
3. Click See all from the Azure Marketplace on the left.
4. Select an image which supports Gen2.
5. Click Create.
6. In the Advanced tab, under the VM generation section, select the Gen 2 option.
7. In the Basics tab, Under Instance details, go to Size and open the Select a VM size blade.
8. Select a supported generation 2 VM.
9. Go through the Azure portal creation flow to finish creating the VM.
PowerShell
You can also use PowerShell to create a VM by directly referencing the generation 1 or generation 2 SKU.
For example, use the following PowerShell cmdlet to get a list of the SKUs in the WindowsServer offer.
Alternatively, you can use the Azure CLI to see any available generation 2 images, listed by Publisher.
If you're creating a VM with Windows Server 2012 as the OS, then you will select either the generation 1 (BIOS ) or
generation 2 (UEFI) VM SKU, which looks like this:
2012-Datacenter
2012-datacenter-gensecond
See the Features and capabilities section for a current list of supported Marketplace images.
Managed image or managed disk
You can create a generation 2 VM from a managed image or managed disk in the same way you would create a
generation 1 VM.
Virtual machine scale sets
You can also create generation 2 VMs by using virtual machine scale sets. In the Azure CLI, use Azure scale sets to
create generation 2 VMs.
3. Once the disk is available, create a VM by attaching this disk. The VM created will be a generation 2
VM. When the generation 2 VM is created, you can optionally generalize the image of this VM. By
generalizing the image, you can use it to create multiple VMs.
How do I increase the OS disk size?
OS disks larger than 2 TB are new to generation 2 VMs. By default, OS disks are smaller than 2 TB for
generation 2 VMs. You can increase the disk size up to a recommended maximum of 4 TB. Use the Azure
CLI or the Azure portal to increase the OS disk size. For information about how to expand disks
programmatically, see Resize a disk.
To increase the OS disk size from the Azure portal:
1. In the Azure portal, go to the VM properties page.
2. To shut down and deallocate the VM, select the Stop button.
3. In the Disks section, select the OS disk you want to increase.
4. In the Disks section, select Configuration, and update the Size to the value you want.
5. Go back to the VM properties page and Start the VM.
You might see a warning for OS disks larger than 2 TB. The warning doesn't apply to generation 2 VMs.
However, OS disk sizes larger than 4 TB are not recommended.
Do generation 2 VMs support accelerated networking?
Yes. For more information, see Create a VM with accelerated networking.
Is VHDX supported on generation 2?
No, generation 2 VMs support only VHD.
Do generation 2 VMs support Azure Ultra Disk Storage?
Yes.
Can I migrate a VM from generation 1 to generation 2?
No, you can't change the generation of a VM after you create it. If you need to switch between VM
generations, create a new VM of a different generation.
Why is my VM size not enabled in the size selector when I try to create a Gen2 VM?
This may be solved by doing the following:
1. Verify that the VM generation property is set to Gen 2 in the Advanced tab.
2. Verify you are searching for a VM size which supports Gen2 VMs.
Next steps
Learn about generation 2 virtual machines in Hyper-V.
Learn how to prepare a VHD to upload from on-premises systems to Azure.
General purpose virtual machine sizes
2/25/2020 • 2 minutes to read • Edit Online
General purpose VM sizes provide balanced CPU -to-memory ratio. Ideal for testing and development, small to
medium databases, and low to medium traffic web servers. This article provides information about the
offerings for general purpose computing.
The Av2-series VMs can be deployed on a variety of hardware types and processors. A-series VMs have
CPU performance and memory configurations best suited for entry level workloads like development
and test. The size is throttled, based upon the hardware, to offer consistent processor performance for
the running instance, regardless of the hardware it is deployed on. To determine the physical hardware
on which this size is deployed, query the virtual hardware from within the Virtual Machine. Example use
cases include development and test servers, low traffic web servers, small to medium databases, proof-
of-concepts, and code repositories.
B -series burstable VMs are ideal for workloads that do not need the full performance of the CPU
continuously, like web servers, small databases and development and test environments. These
workloads typically have burstable performance requirements. The B -Series provides these customers
the ability to purchase a VM size with a price conscious baseline performance that allows the VM
instance to build up credits when the VM is utilizing less than its base performance. When the VM has
accumulated credit, the VM can burst above the VM’s baseline using up to 100% of the CPU when your
application requires the higher CPU performance.
Dav4 and Dasv4-series are new sizes utilizing AMD’s 2.35Ghz EPYC TM 7452 processor in a multi-
threaded configuration with up to 256 MB L3 cache dedicating 8 GB of that L3 cache to every 8 cores
increasing customer options for running their general purpose workloads. The Dav4-series and Dasv4-
series have the same memory and disk configurations as the D & Dsv3-series.
The DCv2-series can help protect the confidentiality and integrity of your data and code while it’s
processed in the public cloud. These machines are backed by the latest generation of Intel XEON E -
2288G Processor with SGX technology. With the Intel Turbo Boost Technology these machines can go
up to 5.0GHz. DCv2 series instances enable customers to build secure enclave-based applications to
protect their code and data while it’s in use.
Dv2 and Dsv2-series VMs, a follow -on to the original D -series, features a more powerful CPU and
optimal CPU -to-memory configuration making them suitable for most production workloads. The Dv2-
series is about 35% faster than the D -series. Dv2-series runs on the Intel® Xeon® 8171M 2.1GHz
(Skylake), Intel® Xeon® E5-2673 v4 2.3 GHz (Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz
(Haswell) processors with the Intel Turbo Boost Technology 2.0. The Dv2-series has the same memory
and disk configurations as the D -series.
Dv3 and Dsv3-series VMs run on the Intel® Xeon® 8171M 2.1GHz (Skylake), Intel® Xeon® E5-2673
v4 2.3 GHz (Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors in a hyper-
threaded configuration, providing a better value proposition for most general purpose workloads.
Memory has been expanded (from ~3.5 GiB/vCPU to 4 GiB/vCPU ) while disk and network limits have
been adjusted on a per core basis to align with the move to hyperthreading. The Dv3-series no longer
has the high memory VM sizes of the D/Dv2-series, those have been moved to the memory optimized
Ev3 and Esv3-series.
Example D -series use cases include enterprise-grade applications, relational databases, in-memory caching,
and analytics.
Other sizes
Compute optimized
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Av2-series
2/20/2020 • 2 minutes to read • Edit Online
The Av2-series VMs can be deployed on a variety of hardware types and processors. Av2-series VMs have CPU
performance and memory configurations best suited for entry level workloads like development and test. The size
is throttled to offer consistent processor performance for the running instance, regardless of the hardware it is
deployed on. To determine the physical hardware on which this size is deployed, query the virtual hardware from
within the Virtual Machine. Some example use cases include development and test servers, low traffic web
servers, small to medium databases, proof-of-concepts, and code repositories.
ACU: 100
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHPUT: NICS/EXPECTED
IOPS/READ MAX DATA NETWORK
TEMP STORAGE MBPS/WRITE DISKS/THROU BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS GHPUT: IOPS (MBPS)
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
B-series burstable virtual machine sizes
2/20/2020 • 6 minutes to read • Edit Online
The B -series VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web
servers, proof of concepts, small databases and development build environments. These workloads typically have
burstable performance requirements. The B -series provides you with the ability to purchase a VM size with
baseline performance and the VM instance builds up credits when it is using less than its baseline. When the VM
has accumulated credit, the VM can burst above the baseline using up to 100% of the vCPU when your application
requires higher CPU performance.
The B -series comes in the following VM sizes:
Premium Storage: Supported
Premium Storage caching: Not Supported
MAX
CACH
ED
AND MAX
TEMP UNCA
STOR CHED
AGE DISK
TEMP BASE MAX CREDI MAX THRO THRO
STOR CPU CPU INITI TS BANK UGHP UGHP
MEM AGE PERF PERF AL BANK ED MAX UT: UT:
ORY: (SSD) OF OF CREDI ED/H CREDI DATA IOPS/ IOPS/ MAX
SIZE VCPU GIB GIB VM VM TS OUR TS DISKS MBPS MBPS NICS
Workload example
Consider an office check-in/out application. The application needs CPU bursts during business hours, but not a lot
of computing power during off hours. In this example, the workload requires a 16vCPU virtual machine with
64GiB of RAM to work efficiently.
The table shows the hourly traffic data and the chart is a visual representation of that traffic.
B16 characteristics:
Max CPU perf: 16vCPU * 100% = 1600%
Baseline: 270%
CREDITS
SCENARIO TIME CPU USAGE (%) ACCUMULATED 1 CREDITS AVAILABLE
For a D16s_v3 which has 16 vCPUs and 64 GiB of memory the hourly rate is $0.936 per hour (monthly $673.92)
and for B16ms with 16 vCPUs and 64 GiB memory the rate is $0.794 per hour (monthly $547.86). This results in
15% savings!
Q&A
Q: How do you get 135% baseline performance from a VM?
A: The 135% is shared amongst the 8 vCPU’s that make up the VM size. For example, if your application uses 4 of
the 8 cores working on batch processing and each of those 4 vCPU’s are running at 30% utilization the total
amount of VM CPU performance would equal 120%. Meaning that your VM would be building credit time based
on the 15% delta from your baseline performance. But it also means that when you have credits available that
same VM can use 100% of all 8 vCPU’s giving that VM a Max CPU performance of 800%.
Q: How can I monitor my credit balance and consumption
A: We will be introducing 2 new metrics in the coming weeks, the Credit metric will allow you to view how many
credits your VM has banked and the ConsumedCredit metric will show how many CPU credits your VM has
consumed from the bank. You will be able to view these metrics from the metrics pane in the portal or
programmatically through the Azure Monitor APIs.
For more information on how to access the metrics data for Azure, see Overview of metrics in Microsoft Azure.
Q: How are credits accumulated?
A: The VM accumulation and consumption rates are set such that a VM running at exactly its base performance
level will have neither a net accumulation or consumption of bursting credits. A VM will have a net increase in
credits whenever it is running below its base performance level and will have a net decrease in credits whenever
the VM is utilizing the CPU more than its base performance level.
Example: I deploy a VM using the B1ms size for my small time and attendance database application. This size
allows my application to use up to 20% of a vCPU as my baseline, which is 0.2 credits per minute I can use or
bank.
My application is busy at the beginning and end of my employees work day, between 7:00-9:00 AM and 4:00 -
6:00PM. During the other 20 hours of the day, my application is typically at idle, only using 10% of the vCPU. For
the non-peak hours, I earn 0.2 credits per minute but only consume 0.l credits per minute, so my VM will bank 0.1
x 60 = 6 credits per hour. For the 20 hours that I am off-peak, I will bank 120 credits.
During peak hours my application averages 60% vCPU utilization, I still earn 0.2 credits per minute but I consume
0.6 credits per minute, for a net cost of 0.4 credits a minute or 0.4 x 60 = 24 credits per hour. I have 4 hours per day
of peak usage, so it costs 4 x 24 = 96 credits for my peak usage.
If I take the 120 credits I earned off-peak and subtract the 96 credits I used for my peak times, I bank an additional
24 credits per day that I can use for other bursts of activity.
Q: How can I calculate credits accumulated and used?
A: You can use the following formula:
(Base CPU perf of VM - CPU Usage) / 100 = Credits bank or use per minute
e.g in above instance your baseline is 20% and if you use 10% of the CPU you are accumulating (20%-10%)/100 =
0.1 credit per minute.
Q: Does the B -Series support Premium Storage data disks?
A: Yes, all B -Series sizes support Premium Storage data disks.
Q: Why is my remaining credit set to 0 after a redeploy or a stop/start?
A : When a VM is “REDPLOYED” and the VM moves to another node, the accumulated credit is lost. If the VM is
stopped/started, but remains on the same node, the VM retains the accumulated credit. Whenever the VM starts
fresh on a node, it gets an initial credit, for Standard_B8ms it is 240 mins.
Q: What happens if I deploy an unsupported OS image on B1ls?
A : B1ls only supports Linux images and if you deploy any another OS image you might not get the best customer
experience.
Other sizes
General purpose
Compute optimized
Memory optimized
Storage optimized
GPU optimized
High performance compute
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Preview: DCv2-series
2/25/2020 • 2 minutes to read • Edit Online
The DCv2-series can help protect the confidentiality and integrity of your data and code while it’s processed in the
public cloud. These machines are backed by the latest generation of Intel XEON E -2288G Processor with SGX
technology. With the Intel Turbo Boost Technology these machines can go up to 5.0GHz. DCv2 series instances
enable customers to build secure enclave-based applications to protect their code and data while it’s in use.
Example use cases include confidential multiparty data sharing, fraud detection, anti-money laundering,
blockchain, confidential usage analytics, intelligence analysis and confidential machine learning.
Premium Storage: Supported*
Premium Storage caching: Supported*
*Except for Standard_DC8_v2
MAX
CACHED AND
TEMP
STORAGE MAX
THROUGHP UNCACHED MAX NICS /
UT: IOPS / DISK EXPECTED
TEMP MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: IOPS / BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) MBPS (MBPS)
DCv2-series VMs are generation 2 VMs and only support Gen2 images.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Dv2 and DSv2-series
2/20/2020 • 2 minutes to read • Edit Online
The Dv2 and Dsv2-series, a follow -on to the original D -series, feature a more powerful CPU and optimal CPU -to-
memory configuration making them suitable for most production workloads. The Dv2-series is about 35% faster
than the D -series. Dv2-series runs on the Intel® Xeon® 8171M 2.1GHz (Skylake), Intel® Xeon® E5-2673 v4 2.3
GHz (Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors with the Intel Turbo Boost
Technology 2.0. The Dv2-series has the same memory and disk configurations as the D -series.
Dv2-series
Dv2-series sizes run on the Intel® Xeon® 8171M 2.1GHz (Skylake) or the the Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell) or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors with Intel Turbo Boost Technology 2.0.
ACU: 210-250
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHP NICS/EXPECT
UT: ED
TEMP IOPS/READ NETWORK
MEMORY: STORAGE MBPS/WRIT MAX DATA THROUGHP BANDWIDTH
SIZE VCPU GIB (SSD) GIB E MBPS DISKS UT: IOPS (MBPS)
DSv2-series
DSv2-series sizes run on the Intel® Xeon® 8171M 2.1GHz (Skylake) or the the Intel® Xeon® E5-2673 v4 2.3
GHz (Broadwell) or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors with Intel Turbo Boost
Technology 2.0 and use premium storage.
ACU: 210-250
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS (MBPS)
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Dv3 and Dsv3-series
2/20/2020 • 3 minutes to read • Edit Online
The Dv3-series runs on the Intel® Xeon® 8171M 2.1GHz (Skylake), Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors in a hyper-threaded configuration,
providing a better value proposition for most general purpose workloads. Memory has been expanded (from ~3.5
GiB/vCPU to 4 GiB/vCPU ) while disk and network limits have been adjusted on a per core basis to align with the
move to hyperthreading. The Dv3-series no longer has the high memory VM sizes of the D/Dv2-series, those
have been moved to the memory optimized Ev3 and Esv3-series.
Example D -series use cases include enterprise-grade applications, relational databases, in-memory caching, and
analytics.
Dv3-series
Dv3-series sizes run on the Intel® Xeon® 8171M 2.1GHz (Skylake), Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors with Intel Turbo Boost Technology
2.0. The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production
workloads.
Data disk storage is billed separately from virtual machines. To use premium storage disks, use the Dsv3 sizes.
The pricing and billing meters for Dsv3 sizes are the same as Dv3-series.
Dv3-series VMs feature Intel® Hyper-Threading Technology.
ACU: 160-190
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE
THROUGHPUT:
IOPS/READ MAX
TEMP STORAGE MAX DATA MBPS/WRITE NICS/NETWOR
SIZE VCPU MEMORY: GIB (SSD) GIB DISKS MBPS K BANDWIDTH
Dsv3-series
Dsv3-series sizes run on the Intel® Xeon® 8171M 2.1GHz (Skylake), Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell), or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors with Intel Turbo Boost Technology
2.0 and use premium storage. The Dsv3-series sizes offer a combination of vCPU, memory, and temporary
storage for most production workloads.
Dsv3-series VMs feature Intel® Hyper-Threading Technology.
ACU: 160-190
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS H (MBPS)
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Dav4 and Dasv4-series
2/20/2020 • 3 minutes to read • Edit Online
The Dav4-series and Dasv4-series are new sizes utilizing AMD’s 2.35Ghz EPYC TM 7452 processor in a multi-
threaded configuration with up to 256 MB L3 cache dedicating 8 GB of that L3 cache to every 8 cores increasing
customer options for running their general purpose workloads. The Dav4-series and Dasv4-series have the same
memory and disk configurations as the D & Dsv3-series.
Dav4-series
ACU: 230-260
Premium Storage: Not Supported
Premium Storage caching: Not Supported
Dav4-series sizes are based on the 2.35Ghz AMD EPYC TM 7452 processor that can achieve a boosted maximum
frequency of 3.35GHz. The Dav4-series sizes offer a combination of vCPU, memory and temporary storage for
most production workloads. Data disk storage is billed separately from virtual machines. To use premium SSD, use
the Dasv4 sizes. The pricing and billing meters for Dasv4 sizes are the same as the Dav4-series.
MAX TEMP
STORAGE MAX NICS /
THROUGHPUT: EXPECTED
IOPS / READ NETWORK
TEMP STORAGE MAX DATA MBPS / WRITE BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB DISKS MBPS (MBPS)
**These sizes are in Preview. If you are interested in trying out these larger sizes, sign up at
https://aka.ms/AzureAMDLargeVMPreview.
Dasv4-series
ACU: 230-260
Premium Storage: Supported
Premium Storage caching: Supported
Dasv4-series sizes are based on the 2.35Ghz AMD EPYC TM 7452 processor that can achieve a boosted maximum
frequency of 3.35GHz and use premium SSD. The Dasv4-series sizes offer a combination of vCPU, memory and
temporary storage for most production workloads.
MAX
CACHED AND
TEMP
STORAGE MAX
THROUGHP UNCACHED MAX NICS /
UT: IOPS / DISK EXPECTED
TEMP MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: IOPS / BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) MBPS (MBPS)
**These sizes are in Preview. If you are interested in trying out these larger sizes, sign up at
https://aka.ms/AzureAMDLargeVMPreview.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Compute optimized virtual machine sizes
2/20/2020 • 2 minutes to read • Edit Online
Compute optimized VM sizes have a high CPU -to-memory ratio. These sizes are good for medium traffic web
servers, network appliances, batch processes, and application servers. This article provides information about the
number of vCPUs, data disks, and NICs. It also includes information about storage throughput and network
bandwidth for each size in this grouping.
The Fsv2-series is based on the Intel® Xeon® Platinum 8168 processor. It features a sustained all core Turbo
clock speed of 3.4 GHz and a maximum single-core turbo frequency of 3.7 GHz. Intel® AVX-512 instructions are
new on Intel Scalable Processors. These instructions provide up to a 2X performance boost to vector processing
workloads on both single and double precision floating point operations. In other words, they're really fast for any
computational workload.
At a lower per-hour list price, the Fsv2-series is the best value in price-performance in the Azure portfolio based
on the Azure Compute Unit (ACU ) per vCPU.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Fsv2-series
2/20/2020 • 2 minutes to read • Edit Online
The Fsv2-series is based on the Intel® Xeon® Platinum 8168 processor. It features a sustained all core Turbo
clock speed of 3.4 GHz and a maximum single-core turbo frequency of 3.7 GHz. Intel® AVX-512 instructions are
new on Intel Scalable Processors. These instructions provide up to a 2X performance boost to vector processing
workloads on both single and double precision floating point operations. In other words, they're really fast for any
computational workload.
Fsv2-series VMs feature Intel® Hyper-Threading Technology.
ACU: 195 - 210
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED AND
TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: BANDWIDTH
SIZE VCPU'S GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS (MBPS)
1 The use of more than 64 vCPU require one of these supported guest operating systems:
Windows Server 2016 or later
Ubuntu 16.04 LTS or later, with Azure tuned kernel (4.15 kernel or later)
SLES 12 SP2 or later
RHEL or CentOS version 6.7 through 6.10, with Microsoft-provided LIS package 4.3.1 (or later) installed
RHEL or CentOS version 7.3, with Microsoft-provided LIS package 4.2.1 (or later) installed
RHEL or CentOS version 7.6 or later
Oracle Linux with UEK4 or later
Debian 9 with the backports kernel, Debian 10 or later
CoreOS with a 4.14 kernel or later
2 Instance is isolated to hardware dedicated to a single customer.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Memory optimized virtual machine sizes
2/20/2020 • 2 minutes to read • Edit Online
Memory optimized VM sizes offer a high memory-to-CPU ratio that are great for relational database servers,
medium to large caches, and in-memory analytics. This article provides information about the number of
vCPUs, data disks and NICs as well as storage throughput and network bandwidth for each size in this
grouping.
Dv2 and DSv2-series, a follow -on to the original D -series, features a more powerful CPU. The Dv2-
series is about 35% faster than the D -series. It runs on the Intel® Xeon® 8171M 2.1 GHz (Skylake) or
the Intel® Xeon® E5-2673 v4 2.3 GHz (Broadwell) or the Intel® Xeon® E5-2673 v3 2.4 GHz
(Haswell) processors, and with the Intel Turbo Boost Technology 2.0. The Dv2-series has the same
memory and disk configurations as the D -series.
Dv2 and DSv2-series are ideal for applications that demand faster vCPUs, better temporary storage
performance, or have higher memory demands. They offer a powerful combination for many
enterprise-grade applications.
The Eav4 and Easv4-series utilize AMD’s 2.35Ghz EPYC TM 7452 processor in a multi-threaded
configuration with up to 256MB L3 cache, increasing options for running most memory optimized
workloads. The Eav4-series and Easv4-series have the same memory and disk configurations as the
Ev3 & Esv3-series.
The Ev3 and Esv3-series Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-2673 v4 2.3
GHz (Broadwell) processor in a hyper-threaded configuration, providing a better value proposition for
most general purpose workloads, and bringing the Ev3 into alignment with the general purpose VMs
of most other clouds. Memory has been expanded (from 7 GiB/vCPU to 8 GiB/vCPU ) while disk and
network limits have been adjusted on a per core basis to align with the move to hyper-threading. The
Ev3 is the follow up to the high memory VM sizes of the D/Dv2 families.
The M -series offers a high vCPU count (up to 128 vCPUs) and a large amount of memory (up to 3.8
TiB ). It’s also ideal for extremely large databases or other applications that benefit from high vCPU
counts and large amounts of memory.
The Mv2-series offers the highest vCPU count (up to 416 vCPUs) and largest memory (up to 8.19 TiB )
of any VM in the cloud. It’s ideal for extremely large databases or other applications that benefit from
high vCPU counts and large amounts of memory.
Azure Compute offers virtual machine sizes that are Isolated to a specific hardware type and dedicated to a
single customer. These virtual machine sizes are best suited for workloads that require a high degree of
isolation from other customers for workloads involving elements like compliance and regulatory
requirements. Customers can also choose to further subdivide the resources of these Isolated virtual
machines by using Azure support for nested virtual machines . See the pages for virtual machine families
below for your isolated VM options.
Other sizes
General purpose
Compute optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across
Azure SKUs.
Memory optimized Dv2 and Dsv2-series
2/20/2020 • 3 minutes to read • Edit Online
Dv2 and Dsv2-series, a follow -on to the original D -series, features a more powerful CPU. DSv2-series sizes run on
the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-2673 v4 2.3 GHz (Broadwell) or the Intel®
Xeon® E5-2673 v3 2.4 GHz (Haswell) processors. The Dv2-series has the same memory and disk configurations
as the D -series.
Dv2-series 11-15
Dv2-series sizes run on the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell) or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors.
ACU: 210 - 250
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHPUT: NICS/EXPECTED
IOPS/READ MAX DATA NETWORK
TEMP STORAGE MBPS/WRITE DISKS/THROU BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS GHPUT: IOPS (MBPS)
1 Instance is isolated to hardware dedicated to a single customer. 2 25000 Mbps with Accelerated Networking.
DSv2-series 11-15
DSv2-series sizes run on the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-2673 v4 2.3 GHz
(Broadwell) or the Intel® Xeon® E5-2673 v3 2.4 GHz (Haswell) processors.
ACU: 210 - 250 1
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED AND
TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
(CACHE SIZE
MEMORY: STORAGE MAX DATA UT: BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS (MBPS)
1 The maximum disk throughput (IOPS or MBps) possible with a DSv2 series VM may be limited by the number,
size and striping of the attached disk(s). For details, see Designing for high performance. 2 Instance is isolated to
the Intel Haswell based hardware and dedicated to a single customer.
3 Constrained core sizes available.
4 25000 Mbps with Accelerated Networking.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Ev3 and Esv3-series
2/20/2020 • 3 minutes to read • Edit Online
The Ev3 and Esv3-series feature the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-2673 v4
2.3 GHz (Broadwell) processor in a hyper-threaded configuration, providing a better value proposition for most
general purpose workloads, and bringing the Ev3 into alignment with the general purpose VMs of most other
clouds. Memory has been expanded (from 7 GiB/vCPU to 8 GiB/vCPU ) while disk and network limits have been
adjusted on a per core basis to align with the move to hyperthreading. The Ev3 is the follow up to the high
memory VM sizes of the D/Dv2 families.
Ev3-series
Ev3-series instances are based on feature the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-
2673 v4 2.3 GHz (Broadwell) processor and Intel Turbo Boost Technology 2.0. Ev3-series instances are ideal for
memory-intensive enterprise applications.
Data disk storage is billed separately from virtual machines. To use premium storage disks, use the ESv3 sizes. The
pricing and billing meters for ESv3 sizes are the same as Ev3-series.
Ev3-series VM’s feature Intel® Hyper-Threading Technology.
ACU: 160 - 190
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE
THROUGHPUT:
IOPS / READ MAX NICS /
TEMP STORAGE MAX DATA MBPS / WRITE NETWORK
SIZE VCPU MEMORY: GIB (SSD) GIB DISKS MBPS BANDWIDTH
Esv3-series
Esv3-series instances are based on feature the Intel® Xeon® 8171M 2.1 GHz (Skylake) or the Intel® Xeon® E5-
2673 v4 2.3 GHz (Broadwell) processor, Intel Turbo Boost Technology 2.0, and use premium storage. Esv3-series
instances are ideal for memory-intensive enterprise applications.
Esv3-series VM’s feature Intel® Hyper-Threading Technology.
ACU: 160-190
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS H (MBPS)
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Eav4 and Easv4-series
2/20/2020 • 3 minutes to read • Edit Online
The Eav4-series and Easv4-series utilize AMD’s 2.35Ghz EPYC TM 7452 processor in a multi-threaded
configuration with up to 256MB L3 cache, increasing options for running most memory optimized workloads. The
Eav4-series and Easv4-series have the same memory and disk configurations as the Ev3 & Esv3-series.
Eav4-series
ACU: 230 - 260
Premium Storage: Not Supported
Premium Storage caching: Not Supported
Eav4-series sizes are based on the 2.35Ghz AMD EPYC TM 7452 processor that can achieve a boosted maximum
frequency of 3.35GHz and use premium SSD. The Eav4-series sizes are ideal for memory-intensive enterprise
applications. Data disk storage is billed separately from virtual machines. To use premium SSD, use the Easv4-
series sizes. The pricing and billing meters for Easv4 sizes are the same as the Eav3-series.
MAX TEMP
STORAGE MAX NICS /
THROUGHPUT: EXPECTED
IOPS / READ NETWORK
TEMP STORAGE MAX DATA MBPS / WRITE BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB DISKS MBPS (MBPS)
**
**These sizes are in Preview. If you are interested in trying out these larger sizes, sign up at
https://aka.ms/AzureAMDLargeVMPreview.
Easv4-series
ACU: 230 - 260
Premium Storage: Supported
Premium Storage caching: Supported
Easv4-series sizes are based on the 2.35Ghz AMD EPYC TM 7452 processor that can achieve a boosted maximum
frequency of 3.35GHz and use premium SSD. The Easv4-series sizes are ideal for memory-intensive enterprise
applications.
MAX
CACHED AND
TEMP
STORAGE MAX
THROUGHP UNCACHED MAX NICS /
UT: IOPS / DISK EXPECTED
TEMP MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: IOPS / BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) MBPS (MBPS)
**These sizes are in Preview. If you are interested in trying out these larger sizes, sign up at
https://aka.ms/AzureAMDLargeVMPreview.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
M-series
2/20/2020 • 2 minutes to read • Edit Online
The M -series offers a high vCPU count (up to 128 vCPUs) and a large amount of memory (up to 3.8 TiB ). It’s also
ideal for extremely large databases or other applications that benefit from high vCPU counts and large amounts of
memory. M -series sizes are based on the Intel® Xeon® CPU E7-8890 v3 @ 2.50GHz
M -series VM’s feature Intel® Hyper-Threading Technology
ACU: 160-180
Premium Storage: Supported
Premium Storage caching: Supported
Write Accelerator: Supported
MAX
CACHED AND
TEMP
STORAGE MAX MAX
THROUGHP UNCACHED NICS/EXPECT
UT: DISK ED
TEMP IOPS/MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) IOPS/MBPS (MBPS)
1 More than 64vCPU’s require one of these supported guest OSes: Windows Server 2016, Ubuntu 16.04 LTS,
SLES 12 SP2, and Red Hat Enterprise Linux, CentOS 7.3 or Oracle Linux 7.3 with LIS 4.2.1.
2 Constrained core sizes available.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Mv2-series
2/20/2020 • 2 minutes to read • Edit Online
The Mv2-series features high throughput, low latency platform running on a hyper-threaded Intel® Xeon®
Platinum 8180M 2.5GHz (Skylake) processor with an all core base frequency of 2.5 GHz and a max turbo
frequency of 3.8 GHz. All Mv2-series virtual machine sizes can use both standard and premium persistent disks.
Mv2-series instances are memory optimized VM sizes providing unparalleled computational performance to
support large in-memory databases and workloads, with a high memory-to-CPU ratio that is ideal for relational
database servers, large caches, and in-memory analytics.
Mv2-series VM’s feature Intel® Hyper-Threading Technology
Premium Storage: Supported
Premium Storage caching: Supported
Write Accelerator: Supported
MAX
CACHED AND
TEMP
STORAGE MAX
THROUGHP UNCACHED MAX NICS /
UT: IOPS / DISK EXPECTED
TEMP MBPS THROUGHP NETWORK
MEMORY: STORAGE MAX DATA (CACHE SIZE UT: IOPS / BANDWIDTH
SIZE VCPU GIB (SSD) GIB DISKS IN GIB) MBPS (MBPS)
1 Mv2 -series VMs are generation 2 only. If you're using Linux, see Support for generation 2 VMs on Azure for
instructions on how to find and select an image.
2 For
the M416ms_v2 and M416s_v2 sizes, note that there is initial support for the following image only: “GEN2:
SUSE Linux Enterprise Server (SLES ) 12 SP4 for SAP Applications."
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Constrained vCPU capable VM sizes
11/13/2019 • 2 minutes to read • Edit Online
Some database workloads like SQL Server or Oracle require high memory, storage, and I/O bandwidth, but not a
high core count. Many database workloads are not CPU -intensive. Azure offers certain VM sizes where you can
constrain the VM vCPU count to reduce the cost of software licensing, while maintaining the same memory,
storage, and I/O bandwidth.
The vCPU count can be constrained to one half or one quarter of the original VM size. These new VM sizes have a
suffix that specifies the number of active vCPUs to make them easier for you to identify.
For example, the current VM size Standard_GS5 comes with 32 vCPUs, 448 GB RAM, 64 disks (up to 256 TB ), and
80,000 IOPs or 2 GB/s of I/O bandwidth. The new VM sizes Standard_GS5-16 and Standard_GS5-8 comes with
16 and 8 active vCPUs respectively, while maintaining the rest of the specs of the Standard_GS5 for memory,
storage, and I/O bandwidth.
The licensing fees charged for SQL Server or Oracle are constrained to the new vCPU count, and other products
should be charged based on the new vCPU count. This results in a 50% to 75% increase in the ratio of the VM
specs to active (billable) vCPUs. These new VM sizes allow customer workloads to use the same memory, storage,
and I/O bandwidth while optimizing their software licensing cost. At this time, the compute cost, which includes OS
licensing, remains the same one as the original size. For more information, see Azure VM sizes for more cost-
effective database workloads.
Other sizes
Compute optimized
Memory optimized
Storage optimized
GPU
High performance compute
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Storage optimized virtual machine sizes
2/20/2020 • 2 minutes to read • Edit Online
Storage optimized VM sizes offer high disk throughput and IO, and are ideal for Big Data, SQL, NoSQL
databases, data warehousing, and large transactional databases. Examples include Cassandra, MongoDB,
Cloudera, and Redis. This article provides information about the number of vCPUs, data disks, and NICs as
well as local storage throughput and network bandwidth for each optimized size.
The Lsv2-series features high throughput, low latency, directly mapped local NVMe storage running on the
AMD EPYC TM 7551 processor with an all core boost of 2.55GHz and a max boost of 3.0GHz. The Lsv2-series
VMs come in sizes from 8 to 80 vCPU in a simultaneous multi-threading configuration. There is 8 GiB of
memory per vCPU, and one 1.92TB NVMe SSD M.2 device per 8 vCPUs, with up to 19.2TB (10x1.92TB )
available on the L80s v2.
Other sizes
General purpose
Compute optimized
Memory optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across
Azure SKUs.
Learn how to optimize performance on the Lsv2-series virtual machines for Windows or Linux.
Lsv2-series
2/24/2020 • 3 minutes to read • Edit Online
The Lsv2-series features high throughput, low latency, directly mapped local NVMe storage running on the AMD
EPYC TM 7551 processor with an all core boost of 2.55GHz and a max boost of 3.0GHz. The Lsv2-series VMs come
in sizes from 8 to 80 vCPU in a simultaneous multi-threading configuration. There is 8 GiB of memory per vCPU,
and one 1.92TB NVMe SSD M.2 device per 8 vCPUs, with up to 19.2TB (10x1.92TB ) available on the L80s v2.
NOTE
The Lsv2-series VMs are optimized to use the local disk on the node attached directly to the VM rather than using durable
data disks. This allows for greater IOPs / throughput for your workloads. The Lsv2 and Ls-series do not support the creation
of a local cache to increase the IOPs achievable by durable data disks.
The high throughput and IOPs of the local disk makes the Lsv2-series VMs ideal for NoSQL stores such as Apache Cassandra
and MongoDB which replicate data across multiple VMs to achieve persistence in the event of the failure of a single VM.
To learn more, see Optimize performance on the Lsv2-series virtual machines for Windows or Linux.
ACU: 150-175
Premium Storage: Supported
Premium Storage caching: Not Supported
MAX
NVME UNCACHE
DISK D DATA MAX NICS
THROUGH DISK /
PUT3 THROUGH EXPECTED
TEMP (READ PUT NETWORK
MEMORY DISK 1 NVME IOPS/MBP (IOPS/MBP MAX DATA BANDWID
SIZE VCPU (GIB) (GIB) DISKS 2 S) S)4 DISKS TH (MBPS)
1 Lsv2 -series
VMs have a standard SCSI based temp resource disk for OS paging/swap file use (D: on Windows,
/dev/sdb on Linux). This disk provides 80 GiB of storage, 4,000 IOPS, and 80 MBps transfer rate for every 8
vCPUs (e.g. Standard_L80s_v2 provides 800 GiB at 40,000 IOPS and 800 MBPS ). This ensures the NVMe drives
can be fully dedicated to application use. This disk is Ephemeral, and all data will be lost on stop/deallocate.
2 Local NVMe Disks are ephemeral, data will be lost on these disks if you stop/deallocate your VM.
3 Hyper -V NVMe Direct technology provides unthrottled access to local NVMe drives mapped securely into the
guest VM space. Achieving maximum performance requires using either the latest WS2019 build or Ubuntu 18.04
or 16.04 from the Azure Marketplace. Write performance varies based on IO size, drive load, and capacity
utilization.
4 Lsv2 -series
VMs do not provide host cache for data disk as it does not benefit the Lsv2 workloads. However,
Lsv2 VMs can accommodate Azure’s Ephemeral VM OS disk option (up to 30 GiB ).
5 VMs with more than 64 vCPUs require one of these supported guest operating systems:
Windows Server 2016 or later
Ubuntu 16.04 LTS or later, with Azure tuned kernel (4.15 kernel or later)
SLES 12 SP2 or later
RHEL or CentOS version 6.7 through 6.10, with Microsoft-provided LIS package 4.3.1 (or later) installed
RHEL or CentOS version 7.3, with Microsoft-provided LIS package 4.2.1 (or later) installed
RHEL or CentOS version 7.6 or later
Oracle Linux with UEK4 or later
Debian 9 with the backports kernel, Debian 10 or later
CoreOS with a 4.14 kernel or later
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Optimize performance on the Lsv2-series virtual
machines
11/13/2019 • 5 minutes to read • Edit Online
Lsv2-series virtual machines support a variety of workloads that need high I/O and throughput on local storage
across a wide range of applications and industries. The Lsv2-series is ideal for Big Data, SQL, NoSQL databases,
data warehousing and large transactional databases, including Cassandra, MongoDB, Cloudera, and Redis.
The design of the Lsv2-series Virtual Machines (VMs) maximizes the AMD EPYC™ 7551 processor to provide the
best performance between the processor, memory, NVMe devices, and the VMs. In addition to maximizing the
hardware performance, Lsv2-series VMs are designed to work with the needs of Windows and Linux operating
systems for better performance with the hardware and the software.
Tuning the software and hardware resulted in the optimized version of Windows Server 2019 Datacenter, released
in early December 2018 to the Azure Marketplace, which supports maximum performance on the NVMe devices
in Lsv2-series VMs.
This article provides tips and suggestions to ensure your workloads and applications achieve the maximum
performance designed into the VMs. The information on this page will be continuously updated as more Lsv2
optimized images are added to the Azure Marketplace.
Next steps
See specifications for all VMs optimized for storage performance on Azure
2 minutes to read
NC-series
2/20/2020 • 2 minutes to read • Edit Online
NC -series VMs are powered by the NVIDIA Tesla K80 card and the Intel Xeon E5-2690 v3 (Haswell) processor.
Users can crunch through data faster by leveraging CUDA for energy exploration applications, crash simulations,
ray traced rendering, deep learning, and more. The NC24r configuration provides a low latency, high-throughput
network interface optimized for tightly coupled parallel computing workloads.
Premium Storage: Not Supported
Premium Storage caching: Not Supported
TEMP GPU
MEMORY: STORAGE MEMORY: MAX DATA
SIZE VCPU GIB (SSD) GIB GPU GIB DISKS MAX NICS
Standard_N 6 56 340 1 12 24 1
C6
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
NCv2-series
2/20/2020 • 2 minutes to read • Edit Online
NCv2-series VMs are powered by NVIDIA Tesla P100 GPUs. These GPUs can provide more than 2x the
computational performance of the NC -series. Customers can take advantage of these updated GPUs for traditional
HPC workloads such as reservoir modeling, DNA sequencing, protein analysis, Monte Carlo simulations, and
others. In addition to the GPUs, the NCv2-series VMs are also powered by Intel Xeon E5-2690 v4 (Broadwell)
CPUs.
The NC24rs v2 configuration provides a low latency, high-throughput network interface optimized for tightly
coupled parallel computing workloads.
Premium Storage: Supported
Premium Storage caching: Supported
IMPORTANT
For this VM series, the vCPU (core) quota in your subscription is initially set to 0 in each region. Request a vCPU quota
increase for this series in an available region.
MAX
UNCACHED
DISK
THROUGH
TEMP GPU PUT:
MEMORY: STORAGE MEMORY: MAX DATA IOPS/MBP
SIZE VCPU GIB (SSD) GIB GPU GIB DISKS S MAX NICS
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
NCv3-series
2/20/2020 • 2 minutes to read • Edit Online
NCv3-series VMs are powered by NVIDIA Tesla V100 GPUs. These GPUs can provide 1.5x the computational
performance of the NCv2-series. Customers can take advantage of these updated GPUs for traditional HPC
workloads such as reservoir modeling, DNA sequencing, protein analysis, Monte Carlo simulations, and others.
The NC24rs v3 configuration provides a low latency, high-throughput network interface optimized for tightly
coupled parallel computing workloads. In addition to the GPUs, the NCv3-series VMs are also powered by Intel
Xeon E5-2690 v4 (Broadwell) CPUs.
Premium Storage: Supported
Premium Storage caching: Supported
IMPORTANT
For this VM series, the vCPU (core) quota in your subscription is initially set to 0 in each region. Request a vCPU quota
increase for this series in an available region.
MAX
UNCACHED
DISK
THROUGH
TEMP GPU PUT:
MEMORY: STORAGE MEMORY: MAX DATA IOPS/MBP
SIZE VCPU GIB (SSD) GIB GPU GIB DISKS S MAX NICS
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
ND-series
2/20/2020 • 3 minutes to read • Edit Online
The ND -series virtual machines are a new addition to the GPU family designed for AI, and Deep Learning
workloads. They offer excellent performance for training and inference. ND instances are powered by NVIDIA
Tesla P40 GPUs and Intel Xeon E5-2690 v4 (Broadwell) CPUs. These instances provide excellent performance for
single-precision floating point operations, for AI workloads utilizing Microsoft Cognitive Toolkit, TensorFlow, Caffe,
and other frameworks. The ND -series also offers a much larger GPU memory size (24 GB ), enabling to fit much
larger neural net models. Like the NC -series, the ND -series offers a configuration with a secondary low -latency,
high-throughput network through RDMA, and InfiniBand connectivity so you can run large-scale training jobs
spanning many GPUs.
Premium Storage: Supported
Premium Storage caching: Supported
IMPORTANT
For this VM series, the vCPU (core) quota per region in your subscription is initially set to 0. Request a vCPU quota increase
for this series in an available region.
MAX
UNCACHED
DISK
THROUGH
TEMP GPU PUT:
MEMORY: STORAGE MEMORY: MAX DATA IOPS/MBP
SIZE VCPU GIB (SSD) GIB GPU GIB DISKS S MAX NICS
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Updated NDv2-series (Preview)
2/25/2020 • 3 minutes to read • Edit Online
The NDv2-series virtual machine is a new addition to the GPU family designed for the needs of the most
demanding GPU -accelerated AI, machine learning, simulation, and HPC workloads.
NDv2 is powered by 8 NVIDIA Tesla V100 NVLINK-connected GPUs, each with 32 GB of GPU memory. Each
NDv2 VM also has 40 non-HyperThreaded Intel Xeon Platinum 8168 (Skylake) cores and 672 GiB of system
memory.
NDv2 instances provide excellent performance for HPC and AI workloads utilizing CUDA GPU -optimized
computation kernels, and the many AI, ML, and analytics tools that support GPU acceleration 'out-of-box,' such as
TensorFlow, Pytorch, Caffe, RAPIDS, and other frameworks.
Critically, the NDv2 is built for both computationally intense scale-up (harnessing 8 GPUs per VM ) and scale-out
(harnessing multiple VMs working together) workloads. The NDv2 series now supports 100-Gigabit InfiniBand
EDR backend networking, similar to that available on the HB series of HPC VM, to allow high-performance
clustering for parallel scenarios including distributed training for AI and ML. This backend network supports all
major InfiniBand protocols, including those employed by NVIDIA’s NCCL2 libraries, allowing for seamless
clustering of GPUs.
NOTE
When enabling InfiniBand on the ND40rs_v2 VM, please use the 4.7-1.0.0.1 Mellanox OFED driver.
Due to increased GPU memory, the new ND40rs_v2 VM requires the use of Generation 2 VMs and marketplace images.
Sign-up to request early access to the NDv2 virtual machine preview.
Please note: The ND40s_v2 featuring 16 GB of per-GPU memory is no longer available for preview and has been superceded
by the updated ND40rs_v2.
MAX
UNCACH
ED DISK MAX
TEMP THROUG NETWOR
STORAGE GPU MAX HPUT: K
MEMORY (SSD): MEMORY DATA IOPS / BANDWI MAX
SIZE VCPU : GIB GIB GPU : GIB DISKS MBPS DTH NICS
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
NV-series
2/20/2020 • 2 minutes to read • Edit Online
The NV -series virtual machines are powered by NVIDIA Tesla M60 GPUs and NVIDIA GRID technology for
desktop accelerated applications and virtual desktops where customers are able to visualize their data or
simulations. Users are able to visualize their graphics intensive workflows on the NV instances to get superior
graphics capability and additionally run single precision workloads such as encoding and rendering. NV -series
VMs are also powered by Intel Xeon E5-2690 v3 (Haswell) CPUs.
Each GPU in NV instances comes with a GRID license. This license gives you the flexibility to use an NV instance
as a virtual workstation for a single user, or 25 concurrent users can connect to the VM for a virtual application
scenario.
Premium Storage: Not Supported
Premium Storage caching: Not Supported
TEMP
STORAGE GPU MAX VIRTUAL VIRTUAL
MEMORY (SSD) MEMORY DATA MAX WORKST APPLICAT
SIZE VCPU : GIB GIB GPU : GIB DISKS NICS ATIONS IONS
Standar 6 56 340 1 8 24 1 1 25
d_NV6
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
NVv3-series
2/20/2020 • 2 minutes to read • Edit Online
The NVv3-series virtual machines are powered by NVIDIA Tesla M60 GPUs and NVIDIA GRID technology with
Intel E5-2690 v4 (Broadwell) CPUs and Intel Hyper-Threading Technology. These virtual machines are targeted for
GPU accelerated graphics applications and virtual desktops where customers want to visualize their data, simulate
results to view, work on CAD, or render and stream content. Additionally, these virtual machines can run single
precision workloads such as encoding and rendering. NVv3 virtual machines support Premium Storage and come
with twice the system memory (RAM ) when compared with its predecessor NV -series.
Each GPU in NVv3 instances comes with a GRID license. This license gives you the flexibility to use an NV instance
as a virtual workstation for a single user, or 25 concurrent users can connect to the VM for a virtual application
scenario.
Premium Storage caching: Supported
MAX
UNCAC
HED
TEMP DISK VIRTUA
STORA THROU L VIRTUA
GE GPU MAX GHPUT: WORKS L
MEMOR (SSD) MEMOR DATA IOPS/M MAX TATION APPLICA
SIZE VCPU Y: GIB GIB GPU Y: GIB DISKS BPS NICS S TIONS
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
NVv4-series (Preview)
2/23/2020 • 2 minutes to read • Edit Online
The NVv4-series virtual machines are powered by AMD Radeon Instinct MI25 GPUs and AMD EPYC
7V12(Rome) CPUs. With NVv4-series Azure is introducing virtual machines with partial GPUs. Pick the right sized
virtual machine for GPU accelerated graphics applications and virtual desktops starting at 1/8th of a GPU with 2
GiB frame buffer to a full GPU with 16 GiB frame buffer. NVv4 virtual machines currently support only Windows
guest operating system.
Sign-up and get access to these machines during preview.
Premium Storage: Supported
Premium Storage caching: Supported
TEMP GPU
MEMORY: STORAGE MEMORY: MAX DATA
SIZE VCPU GIB (SSD) GIB GPU GIB DISKS MAX NICS
Standard_N 4 14 88 1/8 2 4 2
V4as_v4
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Install NVIDIA GPU drivers on N-series VMs running
Windows
11/13/2019 • 3 minutes to read • Edit Online
To take advantage of the GPU capabilities of Azure N -series VMs running Windows, NVIDIA GPU drivers must be
installed. The NVIDIA GPU Driver Extension installs appropriate NVIDIA CUDA or GRID drivers on an N -series
VM. Install or manage the extension using the Azure portal or tools such as Azure PowerShell or Azure Resource
Manager templates. See the NVIDIA GPU Driver Extension documentation for supported operating systems and
deployment steps.
If you choose to install GPU drivers manually, this article provides supported operating systems, drivers, and
installation and verification steps. Manual driver setup information is also available for Linux VMs.
For basic specs, storage capacities, and disk details, see GPU Windows VM sizes.
TIP
As an alternative to manual CUDA driver installation on a Windows Server VM, you can deploy an Azure Data Science Virtual
Machine image. The DSVM editions for Windows Server 2016 pre-install NVIDIA CUDA drivers, the CUDA Deep Neural
Network Library, and other tools.
OS DRIVER
Driver installation
1. Connect by Remote Desktop to each N -series VM.
2. Download, extract, and install the supported driver for your Windows operating system.
After GRID driver installation on a VM, a restart is required. After CUDA driver installation, a restart is not
required.
To query the GPU device state, run the nvidia-smi command-line utility installed with the driver.
1. Open a command prompt and change to the C:\Program Files\NVIDIA Corporation\NVSMI directory.
2. Run nvidia-smi . If the driver is installed, you will see output similar to the following. The GPU -Util shows
0% unless you are currently running a GPU workload on the VM. Your driver version and GPU details may
be different from the ones shown.
RDMA network connectivity
RDMA network connectivity can be enabled on RDMA-capable N -series VMs such as NC24r deployed in the
same availability set or in a single placement group in a virtual machine scale set. The HpcVmDrivers extension
must be added to install Windows network device drivers that enable RDMA connectivity. To add the VM extension
to an RDMA-enabled N -series VM, use Azure PowerShell cmdlets for Azure Resource Manager.
To install the latest version 1.1 HpcVMDrivers extension on an existing RDMA-capable VM named myVM in the
West US region:
For more information, see Virtual machine extensions and features for Windows.
The RDMA network supports Message Passing Interface (MPI) traffic for applications running with Microsoft MPI
or Intel MPI 5.x.
Next steps
Developers building GPU -accelerated applications for the NVIDIA Tesla GPUs can also download and install
the latest CUDA Toolkit. For more information, see the CUDA Installation Guide.
Install AMD GPU drivers on N-series VMs running
Windows
2/12/2020 • 2 minutes to read • Edit Online
To take advantage of the GPU capabilities of the new Azure NVv4 series VMs running Windows, AMD GPU
drivers must be installed. The AMD driver extension will be available in the coming weeks. This article provides
supported operating systems, drivers, and manual installation and verification steps.
For basic specs, storage capacities, and disk details, see GPU Windows VM sizes.
Driver installation
1. Connect by Remote Desktop to each NVv4-series VM.
2. Download and extract the driver setup files. Navigate to the folder and run 'setup.exe' to install the
supported driver for your Windows operating system.
Azure H-series virtual machines (VMs) are designed to deliver leadership-class performance, MPI
scalability, and cost efficiency for a variety of real-world HPC workloads.
HBv2-series VMs feature 200 Gb/sec Mellanox HDR InfiniBand, while both HB and HC -series VMs feature
100 Gb/sec Mellanox EDR InfiniBand. Each of these VM types are connected in a non-blocking fat tree for
optimized and consistent RDMA performance. HBv2 VMs support Adaptive Routing and the Dynamic
Connected Transport (DCT, in additional to standard RC and UD transports). These features enhance
application performance, scalability, and consistency, and usage of them is strongly recommended.
HB -series VMs are optimized for applications driven by memory bandwidth, such as fluid dynamics, explicit
finite element analysis, and weather modeling. HB VMs feature 60 AMD EPYC 7551 processor cores, 4 GB
of RAM per CPU core, and no hyperthreading. The AMD EPYC platform provides more than 260 GB/sec of
memory bandwidth.
HC -series VMs are optimized for applications driven by dense computation, such as implicit finite element
analysis, molecular dynamics, and computational chemistry. HC VMs feature 44 Intel Xeon Platinum 8168
processor cores, 8 GB of RAM per CPU core, and no hyperthreading. The Intel Xeon Platinum platform
supports Intel’s rich ecosystem of software tools such as the Intel Math Kernel Library.
H-series VMs are optimized for applications driven by high CPU frequencies or large memory per core
requirements. H-series VMs feature 8 or 16 Intel Xeon E5 2667 v3 processor cores, 7 or 14 GB of RAM per
CPU core, and no hyperthreading. H-series features 56 Gb/sec Mellanox FDR InfiniBand in a non-blocking
fat tree configuration for consistent RDMA performance. H-series VMs support Intel MPI 5.x and MS -MPI.
Deployment considerations
Azure subscription – To deploy more than a few compute-intensive instances, consider a pay-as-
you-go subscription or other purchase options. If you're using an Azure free account, you can use
only a limited number of Azure compute cores.
Pricing and availability - These VM sizes are offered only in the Standard pricing tier. Check
Products available by region for availability in Azure regions.
Cores quota – You might need to increase the cores quota in your Azure subscription from the
default value. Your subscription might also limit the number of cores you can deploy in certain VM
size families, including the H-series. To request a quota increase, open an online customer support
request at no charge. (Default limits may vary depending on your subscription category.)
NOTE
Contact Azure Support if you have large-scale capacity needs. Azure quotas are credit limits, not capacity
guarantees. Regardless of your quota, you are only charged for cores that you use.
Virtual network – An Azure virtual network is not required to use the compute-intensive instances.
However, for many deployments you need at least a cloud-based Azure virtual network, or a site-to-
site connection if you need to access on-premises resources. When needed, create a new virtual
network to deploy the instances. Adding compute-intensive VMs to a virtual network in an affinity
group is not supported.
Resizing – Because of their specialized hardware, you can only resize compute-intensive instances
within the same size family (H-series or compute-intensive A-series). For example, you can only
resize an H-series VM from one H-series size to another. In addition, resizing from a non-compute-
intensive size to a compute-intensive size is not supported.
RDMA-capable instances
A subset of the compute-intensive instances (A8, A9, H16r, H16mr, HB and HC ) feature a network interface
for remote direct memory access (RDMA) connectivity. Selected N -series sizes designated with 'r' such as
the NC24rs configurations (NC24rs_v2 and NC24rs_v3) are also RDMA-capable. This interface is in
addition to the standard Azure network interface available to other VM sizes.
This interface allows the RDMA-capable instances to communicate over an InfiniBand (IB ) network,
operating at EDR rates for HB, HC, FDR rates for H16r, H16mr, and RDMA-capable N -series virtual
machines, and QDR rates for A8 and A9 virtual machines. These RDMA capabilities can boost the
scalability and performance of certain Message Passing Interface (MPI) applications. For more information
on speed, see the details in the tables on this page.
NOTE
In Azure, IP over IB is only supported on the SR-IOV enabled VMs (SR-IOV for InfiniBand, currently HB and HC).
RDMA over IB is supported for all RDMA-capable instances.
Operating system - Windows Server 2016 on all the above HPC series VMs. Windows Server 2012
R2, Windows Server 2012 are also supported on the non-SR -IOV enabled VMs (hence excluding HB
and HC ).
MPI - The SR -IOV enabled VM sizes on Azure (HB, HC ) allow almost any flavor of MPI to be used
with Mellanox OFED. On non-SR -IOV enabled VMs, supported MPI implementations use the
Microsoft Network Direct (ND ) interface to communicate between instances. Hence, only Microsoft
MPI (MS -MPI) 2012 R2 or later and Intel MPI 5.x versions are supported. Later versions (2017,
2018) of the Intel MPI runtime library may or may not be compatible with the Azure RDMA drivers.
InfiniBandDriverWindows VM extension - On RDMA-capable VMs, add the
InfiniBandDriverWindows extension to enable InfiniBand. This Windows VM extension installs
Windows Network Direct drivers (on non-SR -IOV VMs) or Mellanox OFED drivers (on SR -IOV
VMs) for RDMA connectivity. In certain deployments of A8 and A9 instances, the HpcVmDrivers
extension is added automatically. Note that the HpcVmDrivers VM extension is being deprecated; it
will not be updated. To add the VM extension to a VM, you can use Azure PowerShell cmdlets.
The following command installs the latest version 1.0 InfiniBandDriverWindows extension on an
existing RDMA-capable VM named myVM deployed in the resource group named
myResourceGroup in the West US region:
Alternatively, VM extensions can be included in Azure Resource Manager templates for easy
deployment, with the following JSON element:
"properties":{
"publisher": "Microsoft.HpcCompute",
"type": "InfiniBandDriverWindows",
"typeHandlerVersion": "1.0",
}
The following command installs the latest version 1.0 InfiniBandDriverWindows extension on all
RDMA-capable VMs in an existing VM scale set named myVMSS deployed in the resource group
named myResourceGroup:
For more information, see Virtual machine extensions and features. You can also work with
extensions for VMs deployed in the classic deployment model.
RDMA network address space - The RDMA network in Azure reserves the address space
172.16.0.0/16. To run MPI applications on instances deployed in an Azure virtual network, make sure
that the virtual network address space does not overlap the RDMA network.
MPI among virtual machines - If MPI communication if required between virtual machines (VMs),
ensure that the VMs are in the same availability set or the virtual machine same scale set.
Azure CycleCloud - Create an HPC cluster in Azure CycleCloud to run MPI jobs on Windows
nodes.
Azure Batch - Create an Azure Batch pool to run MPI workloads on Windows Server compute
nodes. For more information, see Use RDMA-capable or GPU -enabled instances in Batch pools. Also
see the Batch Shipyard project, for running container-based workloads on Batch.
Microsoft HPC Pack - HPC Pack includes a runtime environment for MS -MPI that uses the Azure
RDMA network when deployed on RDMA-capable Linux VMs. For example deployments, see Set up
a Linux RDMA cluster with HPC Pack to run MPI applications.
Other sizes
General purpose
Compute optimized
Memory optimized
Storage optimized
GPU optimized
Previous generations
Next steps
For checklists to use the compute-intensive instances with HPC Pack on Windows Server, see Set up
a Linux RDMA cluster with HPC Pack to run MPI applications.
To use compute-intensive instances when running MPI applications with Azure Batch, see Use multi-
instance tasks to run Message Passing Interface (MPI) applications in Azure Batch.
Learn more about how Azure compute units (ACU ) can help you compare compute performance
across Azure SKUs.
H-series
2/20/2020 • 2 minutes to read • Edit Online
H-series VMs are optimized for applications driven by high CPU frequencies or large memory per core
requirements. H-series VMs feature 8 or 16 Intel Xeon E5 2667 v3 processor cores, up to 14 GB of RAM per CPU
core, and no hyperthreading. H-series features 56 Gb/sec Mellanox FDR InfiniBand in a non-blocking fat tree
configuration for consistent RDMA performance. H-series VMs support Intel MPI 5.x and MS -MPI.
ACU: 290-300
Premium Storage: Not Supported
Premium Storage Caching: Not Supported
ALL- SINGL
CORE E- RDM
MEM BASE S CORE A
ORY CPU FREQ FREQ PERF
BAND FREQ UENC UENC ORM TEMP MAX
PROC MEM WIDT UENC Y Y ANCE MPI STOR MAX ETHE
ESSO ORY H Y (GHZ, (GHZ, (GB/S SUPP AGE DATA RNET
SIZE VCPU R (GB) GB/S (GHZ) PEAK) PEAK) ) ORT (GB) DISKS NICS
1 For MPI applications, dedicated RDMA backend network is enabled by FDR InfiniBand network.
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
HB-series
2/20/2020 • 2 minutes to read • Edit Online
HB -series VMs are optimized for applications driven by memory bandwidth, such as fluid dynamics, explicit finite
element analysis, and weather modeling. HB VMs feature 60 AMD EPYC 7551 processor cores, 4 GB of RAM per
CPU core, and no simultaneous multithreading. An HB VM provides up to 260 GB/sec of memory bandwidth.
ACU: 199-216
Premium Storage: Supported
Premium Storage Caching: Supported
ALL- SINGL
CORE E- RDM
MEM BASE S CORE A
ORY CPU FREQ FREQ PERF
BAND FREQ UENC UENC ORM TEMP MAX
PROC MEM WIDT UENC Y Y ANCE MPI STOR MAX ETHE
ESSO ORY H Y (GHZ, (GHZ, (GB/S SUPP AGE DATA RNET
SIZE VCPU R (GB) GB/S (GHZ) PEAK) PEAK) ) ORT (GB) DISKS NICS
Stand 60 AMD 240 263 2.0 2.55 2.55 100 All 700 4 1
ard_ EPYC
HB60 7551
rs
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
HBv2-series
2/20/2020 • 2 minutes to read • Edit Online
HBv2-series VMs are optimized for applications driven by memory bandwidth, such as fluid dynamics, finite
element analysis, and reservoir simulation. HBv2 VMs feature 120 AMD EPYC 7742 processor cores, 4 GB of
RAM per CPU core, and no simultaneous multithreading. Each HBv2 VM provides up to 340 GB/sec of memory
bandwidth, and up to 4 teraFLOPS of FP64 compute.
Premium Storage: Supported
ALL- SINGL
CORE E- RDM
MEM BASE S CORE A
ORY CPU FREQ FREQ PERF
BAND FREQ UENC UENC ORM TEMP MAX
PROC MEM WIDT UENC Y Y ANCE MPI STOR MAX ETHER
ESSO ORY H Y (GHZ, (GHZ, (GB/S SUPP AGE DATA NET
SIZE VCPU R (GB) GB/S (GHZ) PEAK) PEAK) ) ORT (GB) DISKS NICS
Stand 120 AMD 480 350 2.45 3.1 3.3 200 All 480 8 1
ard_ EPYC +
HB12 7V12 960
0rs_v
2
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
HC-series
2/20/2020 • 2 minutes to read • Edit Online
HC -series VMs are optimized for applications driven by dense computation, such as implicit finite element
analysis, molecular dynamics, and computational chemistry. HC VMs feature 44 Intel Xeon Platinum 8168
processor cores, 8 GB of RAM per CPU core, and no hyperthreading. The Intel Xeon Platinum platform supports
Intel’s rich ecosystem of software tools such as the Intel Math Kernel Library.
ACU: 297-315
Premium Storage: Supported
Premium Storage Caching: Supported
ALL- SINGL
CORE E- RDM
MEM BASE S CORE A
ORY CPU FREQ FREQ PERF
BAND FREQ UENC UENC ORM TEMP MAX
PROC MEM WIDT UENC Y Y ANCE MPI STOR MAX ETHE
ESSO ORY H Y (GHZ, (GHZ, (GB/S SUPP AGE DATA RNET
SIZE VCPU R (GB) GB/S (GHZ) PEAK) PEAK) ) ORT (GB) DISKS NICS
Stand 44 Intel 352 191 2.7 3.4 3.7 100 All 700 4 1
ard_ Xeon
HC44 Platin
rs um
8168
Other sizes
General purpose
Memory optimized
Storage optimized
GPU optimized
High performance compute
Previous generations
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across Azure
SKUs.
Save costs with Azure Reserved VM Instances
11/12/2019 • 7 minutes to read • Edit Online
When you commit to an Azure reserved VM instance you can save money. The reservation discount is applied
automatically to the number of running virtual machines that match the reservation scope and attributes. You don't
need to assign a reservation to a virtual machine to get the discounts. A reserved instance purchase covers only the
compute part of your VM usage. For Windows VMs, the usage meter is split into two separate meters. There's a
compute meter, which is same as the Linux meter, and a Windows IP meter. The charges that you see when you
make the purchase are only for the compute costs. Charges don't include Windows software costs. For more
information about software costs, see Software costs not included with Azure Reserved VM Instances.
FIELD DESCRIPTION
Subscription The subscription used to pay for the reservation. The payment
method on the subscription is charged the costs for the
reservation. The subscription type must be an enterprise
agreement (offer numbers: MS-AZR-0017P or MS-AZR-
0148P) or Microsoft Customer Agreement or an individual
subscription with pay-as-you-go rates (offer numbers: MS-
AZR-0003P or MS-AZR-0023P). The charges are deducted
from the monetary commitment balance, if available, or
charged as overage. For a subscription with pay-as-you-go
rates, the charges are billed to the credit card or invoice
payment method on the subscription.
Next steps
To learn how to manage a reservation, see Manage Azure Reservations.
To learn more about Azure Reservations, see the following articles:
What are Azure Reservations?
Manage Reservations in Azure
Understand how the reservation discount is applied
Understand reservation usage for a subscription with pay-as-you-go rates
Understand reservation usage for your Enterprise enrollment
Windows software costs not included with reservations
Azure Reservations in Partner Center Cloud Solution Provider (CSP ) program
2 minutes to read
Virtual machine size flexibility with Reserved VM
Instances
2/19/2020 • 2 minutes to read • Edit Online
When you buy a Reserved VM Instance, you can choose to optimize for instance size flexibility or capacity priority.
For more information about setting or changing the optimize setting for reserved VM instances, see Change the
optimize setting for reserved VM instances.
With a reserved virtual machine instance that's optimized for instance size flexibility, the reservation you buy can
apply to the virtual machines (VMs) sizes in the same instance size flexibility group. For example, if you buy a
reservation for a VM size that's listed in the DSv2 Series, like Standard_DS5_v2, the reservation discount can apply
to the other four sizes that are listed in that same instance size flexibility group:
Standard_DS1_v2
Standard_DS2_v2
Standard_DS3_v2
Standard_DS4_v2
But that reservation discount doesn't apply to VMs sizes that are listed in different instance size flexibility groups,
like SKUs in DSv2 Series High Memory: Standard_DS11_v2, Standard_DS12_v2, and so on.
Within the instance size flexibility group, the number of VMs the reservation discount applies to depends on the
VM size you pick when you buy a reservation. It also depends on the sizes of the VMs that you have running. The
ratio column compares the relative footprint for each VM size in that instance size flexibility group. Use the ratio
value to calculate how the reservation discount applies to the VMs you have running.
Examples
The following examples use the sizes and ratios in the DSv2-series table.
You buy a reserved VM instance with the size Standard_DS4_v2 where the ratio or relative footprint compared to
the other sizes in that series is 8.
Scenario 1: Run eight Standard_DS1_v2 sized VMs with a ratio of 1. Your reservation discount applies to all
eight of those VMs.
Scenario 2: Run two Standard_DS2_v2 sized VMs with a ratio of 2 each. Also run a Standard_DS3_v2 sized VM
with a ratio of 4. The total footprint is 2+2+4=8. So your reservation discount applies to all three of those VMs.
Scenario 3: Run one Standard_DS5_v2 with a ratio of 16. Your reservation discount applies to half that VM's
compute cost.
The following sections show what sizes are in the same size series group when you buy a reserved VM instance
optimized for instance size flexibility.
Using Spot VMs allows you to take advantage of our unused capacity at a significant cost savings. At any point in
time when Azure needs the capacity back, the Azure infrastructure will evict Spot VMs. Therefore, Spot VMs are
great for workloads that can handle interruptions like batch processing jobs, dev/test environments, large compute
workloads, and more.
The amount of available capacity can vary based on size, region, time of day, and more. When deploying Spot
VMs, Azure will allocate the VMs if there is capacity available, but there is no SLA for these VMs. A Spot VM offers
no high availability guarantees. At any point in time when Azure needs the capacity back, the Azure infrastructure
will evict Spot VMs with 30 seconds notice.
IMPORTANT
Spot instances are currently in public preview. This preview version is not recommended for production workloads. Certain
features might not be supported or might have constrained capabilities. For more information, see Supplemental Terms of
Use for Microsoft Azure Previews.
Eviction policy
VMs can be evicted based on capacity or the max price you set. For virtual machines, the eviction policy is set to
Deallocate which moves your evicted VMs to the stopped-deallocated state, allowing you to redeploy the evicted
VMs at a later time. However, reallocating Spot VMs will be dependent on there being available Spot capacity. The
deallocated VMs will count against your spot vCPU quota and you will be charged for your underlying disks.
Users can opt-in to receive in-VM notifications through Azure Scheduled Events. This will notify you if your VMs
are being evicted and you will have 30 seconds to finish any jobs and perform shutdown tasks prior to the eviction.
OPTION OUTCOME
Max price is set to >= the current price. VM is deployed if capacity and quota are available.
Max price is set to < the current price. The VM is not deployed. You will get an error message that
the max price needs to be >= current price.
Restarting a stop/deallocate VM if the max price is >= the If there is capacity and quota, then the VM is deployed.
current price
Restarting a stop/deallocate VM if the max price is < the You will get an error message that the max price needs to be
current price >= current price.
Price for the VM has gone up and is now > the max price. The VM gets evicted. You get a 30s notification before actual
eviction.
After eviction the price for the VM goes back to being < the The VM will not be automatically re-started. You can restart
max price. the VM yourself, and it will be charged at the current price.
OPTION OUTCOME
If the max price is set to -1 The VM will not be evicted for pricing reasons. The max price
will be the current price, up to the price for standard VMs. You
will never be charged above the standard price.
Changing the max price You need to deallocate the VM to change the max price.
Deallocate the VM, set t a new max price, then update the
VM.
Limitations
The following VM sizes are not supported for Spot VMs:
B -series
Promo versions of any size (like Dv2, NV, NC, H promo sizes)
Spot VMs can't currently use ephemeral OS disks.
Spot VMs can be deployed to any region, except Microsoft Azure China 21Vianet.
Pricing
Pricing for Spot VMs is variable, based on region and SKU. For more information, see VM pricing for Linux and
Windows.
With variable pricing, you have option to set a max price, in US dollars (USD ), using up to 5 decimal places. For
example, the value 0.98765 would be a max price of $0.98765 USD per hour. If you set the max price to be -1 , the
VM won't be evicted based on price. The price for the VM will be the current price for spot or the price for a
standard VM, which ever is less, as long as there is capacity and quota available.
Next steps
Use the portal, CLI or PowerShell to deploy Spot VMs.
You can also deploy a scale set with Spot VM instances.
If you encounter an error, see Error codes.
Previous generations of virtual machine sizes
2/25/2020 • 11 minutes to read • Edit Online
This section provides information on previous generations of virtual machine sizes. These sizes can still be
used, but there are newer generations available.
F-series
F -series is based on the 2.4 GHz Intel Xeon® E5-2673 v3 (Haswell) processor, which can achieve clock
speeds as high as 3.1 GHz with the Intel Turbo Boost Technology 2.0. This is the same CPU performance
as the Dv2-series of VMs.
F -series VMs are an excellent choice for workloads that demand faster CPUs but do not need as much
memory or temporary storage per vCPU. Workloads such as analytics, gaming servers, web servers, and
batch processing will benefit from the value of the F -series.
ACU: 210 - 250
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHPU MAX DATA NICS/EXPECTE
TEMP T: IOPS/READ DISKS/THRO D NETWORK
STORAGE MBPS/WRITE UGHPUT: BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS IOPS (MBPS)
Fs-series 1
The Fs-series provides all the advantages of the F -series, in addition to Premium storage.
ACU: 210 - 250
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE
THROUGHP MAX MAX
UT: UNCACHED NICS/EXPEC
IOPS/MBPS DISK TED
TEMP (CACHE THROUGHP NETWORK
MEMORY: STORAGE MAX DATA SIZE IN UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS GIB) IOPS/MBPS H (MBPS)
NVv2-series
Newer size recommendation: NVv3-series
The NVv2-series virtual machines are powered by NVIDIA Tesla M60 GPUs and NVIDIA GRID
technology with Intel Broadwell CPUs. These virtual machines are targeted for GPU accelerated graphics
applications and virtual desktops where customers want to visualize their data, simulate results to view,
work on CAD, or render and stream content. Additionally, these virtual machines can run single precision
workloads such as encoding and rendering. NVv2 virtual machines support Premium Storage and come
with twice the system memory (RAM ) when compared with its predecessor NV -series.
Each GPU in NVv2 instances comes with a GRID license. This license gives you the flexibility to use an NV
instance as a virtual workstation for a single user, or 25 concurrent users can connect to the VM for a
virtual application scenario.
VIRTUA
TEMP L VIRTUA
STORAG GPU MAX WORKS L
MEMOR E (SSD) MEMOR DATA MAX TATION APPLICA
SIZE VCPU Y: GIB GIB GPU Y: GIB DISKS NICS S TIONS
Basic A
Newer size recommendation: Av2-series
Premium Storage: Not Supported
Premium Storage caching: Not Supported
The basic tier sizes are primarily for development workloads and other applications that don't require load
balancing, auto-scaling, or memory-intensive virtual machines.
MAX MAX. DATA MAX. IOPS
SIZE – TEMPORARY DISKS (1023 (300 PER
SIZE\NAME VCPU MEMORY NICS (MAX) DISK SIZE GB EACH) DISK)
MAX
MAX DATA NICS/EXPECTE
TEMP DISK D NETWORK
STORAGE MAX DATA THROUGHPU BANDWIDTH
SIZE VCPU MEMORY: GIB (HDD): GIB DISKS T: IOPS (MBPS)
1
1 The A0 size is over-subscribed on the physical hardware. For this specific size only, other customer
deployments may impact the performance of your running workload. The relative performance is outlined
below as the expected baseline, subject to an approximate variability of 15 percent.
MAX DATA
TEMP DISK
STORAGE MAX DATA THROUGHPU
SIZE VCPU MEMORY: GIB (HDD): GIB DISKS T: IOPS MAX NICS
1For MPI applications, dedicated RDMA backend network is enabled by FDR InfiniBand network, which
delivers ultra-low -latency and high bandwidth.
D-series
Newer size recommendation: Dv3-series
ACU: 160-250 1
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHPU MAX DATA NICS/EXPECTE
TEMP T: IOPS/READ DISKS/THRO D NETWORK
STORAGE MBPS/WRITE UGHPUT: BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS IOPS (MBPS)
1 VMFamily can run on one of the following CPU's: 2.2 GHz Intel Xeon® E5-2660 v2, 2.4 GHz Intel
Xeon® E5-2673 v3 (Haswell) or 2.3 GHz Intel XEON® E5-2673 v4 (Broadwell)
MAX TEMP
STORAGE MAX
THROUGHPU MAX DATA NICS/EXPECTE
TEMP T: IOPS/READ DISKS/THRO D NETWORK
STORAGE MBPS/WRITE UGHPUT: BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS IOPS (MBPS)
1 VMFamily can run on one of the following CPU's: 2.2 GHz Intel Xeon® E5-2660 v2, 2.4 GHz Intel
Xeon® E5-2673 v3 (Haswell) or 2.3 GHz Intel XEON® E5-2673 v4 (Broadwell)
Preview: DC-series
Premium Storage: Supported
Premium Storage caching: Supported
The DC -series uses the latest generation of 3.7GHz Intel XEON E -2176G Processor with SGX technology,
and with the Intel Turbo Boost Technology can go up to 4.7GHz.
MAX
CACHED
AND TEMP
STORAGE
THROUGHP MAX
UT: IOPS / UNCACHED MAX NICS /
MBPS DISK EXPECTED
TEMP (CACHE THROUGHP NETWORK
MEMORY: STORAGE MAX DATA SIZE IN UT: IOPS / BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS GIB) MBPS H (MBPS)
IMPORTANT
DC-series VMs are generation 2 VMs and only support Gen2 images.
DS -series
Newer size recommendation: Dsv3-series
ACU: 160-250 1
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE
THROUGHP MAX MAX
UT: UNCACHED NICS/EXPEC
IOPS/MBPS DISK TED
TEMP (CACHE THROUGHP NETWORK
MEMORY: STORAGE MAX DATA SIZE IN UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS GIB) IOPS/MBPS H (MBPS)
1 VMFamily can run on one of the following CPU's: 2.2 GHz Intel Xeon® E5-2660 v2, 2.4 GHz Intel
Xeon® E5-2673 v3 (Haswell) or 2.3 GHz Intel XEON® E5-2673 v4 (Broadwell)
MAX
CACHED
AND TEMP
STORAGE
THROUGHP MAX MAX
UT: UNCACHED NICS/EXPEC
IOPS/MBPS DISK TED
TEMP (CACHE THROUGHP NETWORK
MEMORY: STORAGE MAX DATA SIZE IN UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS GIB) IOPS/MBPS H (MBPS)
1 The maximum disk throughput (IOPS or MBps) possible with a DS series VM may be limited by the
number, size and striping of the attached disk(s). For details, see designing for high performance for
Windows or Linux. 2 VM Family can run on one of the following CPU's: 2.2 GHz Intel Xeon® E5-2660 v2,
2.4 GHz Intel Xeon® E5-2673 v3 (Haswell) or 2.3 GHz Intel XEON® E5-2673 v4 (Broadwell)
Ls-series
The Ls-series offers up to 32 vCPUs, using the Intel® Xeon® processor E5 v3 family. The Ls-series gets
the same CPU performance as the G/GS -Series and comes with 8 GiB of memory per vCPU.
The Ls-series does not support the creation of a local cache to increase the IOPS achievable by durable
data disks. The high throughput and IOPS of the local disk makes Ls-series VMs ideal for NoSQL stores
such as Apache Cassandra and MongoDB which replicate data across multiple VMs to achieve persistence
in the event of the failure of a single VM.
ACU: 180-240
Premium Storage: Supported
Premium Storage caching: Not Supported
MAX
MAX TEMP UNCACHED MAX
STORAGE DISK NICS/EXPEC
THROUGHP THROUGHP TED
TEMP UT UT NETWORK
MEMORY STORAGE MAX DATA (IOPS/MBP (IOPS/MBP BANDWIDT
SIZE VCPU (GIB) (GIB) DISKS S) S) H (MBPS)
The maximum disk throughput possible with Ls-series VMs may be limited by the number, size, and
striping of any attached disks. For details, see designing for high performance for Windows or Linux.
1 Instance is isolated to hardware dedicated to a single customer.
GS -series
ACU: 180 - 240 1
Premium Storage: Supported
Premium Storage caching: Supported
MAX
CACHED
AND TEMP
STORAGE
THROUGHP MAX MAX
UT: IOPS / UNCACHED NICS/EXPEC
MBPS DISK TED
TEMP (CACHE THROUGHP NETWORK
MEMORY: STORAGE MAX DATA SIZE IN UT: BANDWIDT
SIZE VCPU GIB (SSD) GIB DISKS GIB) IOPS/MBPS H (MBPS)
1 The maximum disk throughput (IOPS or MBps) possible with a GS series VM may be limited by the
number, size and striping of the attached disk(s). For details, see designing for high performance for
Windows or Linux.
2 Instance is isolated to hardware dedicated to a single customer.
3
3 Constrained core sizes available.
G -series
ACU: 180 - 240
Premium Storage: Not Supported
Premium Storage caching: Not Supported
MAX TEMP
STORAGE MAX
THROUGHPU MAX DATA NICS/EXPECTE
TEMP T: IOPS/READ DISKS/THRO D NETWORK
STORAGE MBPS/WRITE UGHPUT: BANDWIDTH
SIZE VCPU MEMORY: GIB (SSD) GIB MBPS IOPS (MBPS)
Other sizes
General purpose
Compute optimized
Memory optimized
Storage optimized
GPU
High performance compute
Next steps
Learn more about how Azure compute units (ACU ) can help you compare compute performance across
Azure SKUs.
Virtual machine isolation in Azure
11/13/2019 • 4 minutes to read • Edit Online
Azure Compute offers virtual machine sizes that are Isolated to a specific hardware type and dedicated to a single
customer. These virtual machine sizes are best suited for workloads that require a high degree of isolation from
other customers for workloads involving elements like compliance and regulatory requirements. Customers can
also choose to further subdivide the resources of these Isolated virtual machines by using Azure support for
nested virtual machines.
Utilizing an isolated size guarantees that your virtual machine will be the only one running on that specific server
instance. The current Isolated virtual machine offerings include:
Standard_E64is_v3
Standard_E64i_v3
Standard_M128ms
Standard_GS5
Standard_G5
Standard_DS15_v2
Standard_D15_v2
Standard_F72s_v2
You can learn more about each available isolated size here.
Timeline
DATE ACTION
May 15, 2021 Retire D/DS15i_v2 (all customers except who bought 3-year RI
of D/DS15_v2 before November 18, 2019)
November 17, 2022 Retire D/DS15i_v2 when 3-year RIs done (for customers who
bought 3-year RI of D/DS15_v2 before November 18, 2019)
FAQ
Q: Is the size D/DS15_v2 going to get retired?
A: No, only "isolation" feature is going to get retired. If you do not need isolation, you do not need to take any
action.
Q: Is the size D/DS15i_v2 going to get retired?
A: Yes, the size is only available until May 15,2021. For customers who have bought 3-year RIs on D/DS15_v2
before November 18, 2019 will have access to D/DS15i_v2 until November 17, 2022.
Q: Why am I not seeing the new D/DS15i_v2 sizes in the portal?
A: If you are a current D/DS15_v2 customer and want to use the new D/DS15i_v2 sizes, fill this form
Q: Why I am not seeing any quota for the new D/DS15i_v2 sizes?
A: If you are a current D/DS15_v2 customer and want to use the new D/DS15i_v2 sizes, fill this form
Q: When are the other isolated sizes going to retire?
A: We will provide reminders 12 months in advance of the official decommissioning of the sizes.
Q: Is there a downtime when my vm lands on a non-isolated hardware?
A: If you do not need isolation, you do not need to take any action and you would not see any downtime.
Q: Are there any cost changes for moving to a non-isolated virtual machine?
A: No
Q: I already purchased 1- or 3-year Reserved Instance for D15_v2 or Ds15_v2. How will the discount be applied to
my VM usage?
A: RIs purchased before November 18, 2019 will automatically extend coverage to the new isolated VM series.
Instance Size Flexibility cannot be used to apply to any other sizes such as D2_v2, D4_v2, or D15_v2. Likewise, for
Dsv2 series.
Q: Can I buy a new 3-year RI for D15i_v2 and DS15i_v2?
A: Unfortunately no, only 1-year RI is available for new purchase.
Q: Can I move my existing D15_v2/DS15_v2 Reserve Instance to an isolated size Reserved Instance?
A: This action is not necessary since the benefit will apply to both isolated and non-isolated sizes. But Azure will
support changing existing D15_v2/DS15_v2 Reserved Instances to D15i_v2/DS15i_v2. For all other Dv2/Dsv2
Reserved Instances, use the existing Reserved Instance or buy new Reserved Instances for the isolated sizes.
Q: I'm an Azure Service Fabric Customer relying on the Silver or Gold Durability Tiers. Does this change impact
me?
A: No. The guarantees provided by Service Fabric's Durability Tiers will continue to function even after this change.
If you require physical hardware isolation for other reasons, you may still need to take one of the actions described
above.
Next steps
You can deploy a dedicated host using Azure PowerShell, the portal, and Azure CLI. For more information, see
the Dedicated hosts overview.
Azure compute unit (ACU)
2/20/2020 • 2 minutes to read • Edit Online
The concept of the Azure Compute Unit (ACU ) provides a way of comparing compute (CPU ) performance
across Azure SKUs. This will help you easily identify which SKU is most likely to satisfy your performance
needs. ACU is currently standardized on a Small (Standard_A1) VM being 100 and all other SKUs then
represent approximately how much faster that SKU can run a standard benchmark.
IMPORTANT
The ACU is only a guideline. The results for your workload may vary.
A0 50 1:1
A1 - A4 100 1:1
A5 - A7 100 1:1
*ACUs use Intel® Turbo technology to increase CPU frequency and provide a performance increase. The
amount of the performance increase can vary based on the VM size, workload, and other workloads
running on the same host. **ACUs use AMD® Boost technology to increase CPU frequency and provide a
performance increase. The amount of the performance increase can vary based on the VM size, workload,
and other workloads running on the same host. ***Hyper-threaded and capable of running nested
virtualization
Here are links to more information about the different sizes:
General-purpose
Memory optimized
Compute optimized
GPU optimized
High performance compute
Storage optimized
Compute benchmark scores for Windows VMs
2/26/2020 • 17 minutes to read • Edit Online
The following SPECInt benchmark scores show compute performance for select Azure VMs running Windows
Server. Compute benchmark scores are also available for Linux VMs.
Note: Av2-series VMs can be deployed on a variety of hardware types and processors (as seen above). Av2-series
VMs have CPU performance and memory configurations best suited for entry level workloads like development
and test. The size is throttled to offer relatively consistent processor performance for the running instance,
regardless of the hardware it is deployed on; however, software that takes advantage of specific newer processor
optimizations may see more significant variation across processor types.
B - Burstable
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
Note: B -Series VMs are for workloads with burstable performance requirements. VM instances accumulate credits
when using less than its baseline. When the VM has accumulated credit, the VM can burst above the baseline
using up to 100% to meet short CPU burst requirements. Burst time depends on available credits which is a
function of VM size and time.
SPEC Int is a fairly long running test that typically exhausts available burst credits. Therefore the numbers above
are closer to the baseline performance of the VM (although they may reflect some burst time accumulated
between runs). For short, bursty, workloads (typical on B -Series) performance will typically be closer to that of the
Ds v3 Series..
F - Compute Optimized
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
GS - Storage Optimized
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
G - Compute Optimized
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
Ls - Storage Optimized
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
M - Memory Optimized
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
NC - GPU Enabled
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
NV - GPU Enabled
SIZE VCPUS NUMA NODES CPU RUNS AVG BASE RATE STDDEV
About SPECint
Windows numbers were computed by running SPECint 2006 on Windows Server. SPECint was run using the
base rate option (SPECint_rate2006), with one copy per vCPU. SPECint consists of 12 separate tests, each run
three times, taking the median value from each test and weighting them to form a composite score. Those tests
were then run across multiple VMs to provide the average scores shown.
Next steps
For storage capacities, disk details, and additional considerations for choosing among VM sizes, see Sizes for
virtual machines.
Virtual machine vCPU quotas
1/10/2020 • 2 minutes to read • Edit Online
The vCPU quotas for virtual machines and virtual machine scale sets are arranged in two tiers for each
subscription, in each region. The first tier is the Total Regional vCPUs, and the second tier is the various VM size
family cores such as the D -series vCPUs. Any time a new VM is deployed the vCPUs for the VM must not exceed
the vCPU quota for the VM size family or the total regional vCPU quota. If either of those quotas are exceeded, the
VM deployment will not be allowed. There is also a quota for the overall number of virtual machines in the region.
The details on each of these quotas can be seen in the Usage + quotas section of the Subscription page in the
Azure portal, or you can query for the values using PowerShell.
Check usage
You can use the Get-AzVMUsage cmdlet to check on your quota usage.
Next steps
For more information about billing and quotas, see Azure subscription and service limits, quotas, and constraints.
Save costs with Azure Reserved VM Instances
11/12/2019 • 7 minutes to read • Edit Online
When you commit to an Azure reserved VM instance you can save money. The reservation discount is applied
automatically to the number of running virtual machines that match the reservation scope and attributes. You don't
need to assign a reservation to a virtual machine to get the discounts. A reserved instance purchase covers only
the compute part of your VM usage. For Windows VMs, the usage meter is split into two separate meters. There's
a compute meter, which is same as the Linux meter, and a Windows IP meter. The charges that you see when you
make the purchase are only for the compute costs. Charges don't include Windows software costs. For more
information about software costs, see Software costs not included with Azure Reserved VM Instances.
FIELD DESCRIPTION
Subscription The subscription used to pay for the reservation. The payment
method on the subscription is charged the costs for the
reservation. The subscription type must be an enterprise
agreement (offer numbers: MS-AZR-0017P or MS-AZR-
0148P) or Microsoft Customer Agreement or an individual
subscription with pay-as-you-go rates (offer numbers: MS-
AZR-0003P or MS-AZR-0023P). The charges are deducted
from the monetary commitment balance, if available, or
charged as overage. For a subscription with pay-as-you-go
rates, the charges are billed to the credit card or invoice
payment method on the subscription.
Next steps
To learn how to manage a reservation, see Manage Azure Reservations.
To learn more about Azure Reservations, see the following articles:
What are Azure Reservations?
Manage Reservations in Azure
Understand how the reservation discount is applied
Understand reservation usage for a subscription with pay-as-you-go rates
Understand reservation usage for your Enterprise enrollment
Windows software costs not included with reservations
Azure Reservations in Partner Center Cloud Solution Provider (CSP ) program
2 minutes to read
Virtual machine size flexibility with Reserved VM
Instances
2/19/2020 • 2 minutes to read • Edit Online
When you buy a Reserved VM Instance, you can choose to optimize for instance size flexibility or capacity priority.
For more information about setting or changing the optimize setting for reserved VM instances, see Change the
optimize setting for reserved VM instances.
With a reserved virtual machine instance that's optimized for instance size flexibility, the reservation you buy can
apply to the virtual machines (VMs) sizes in the same instance size flexibility group. For example, if you buy a
reservation for a VM size that's listed in the DSv2 Series, like Standard_DS5_v2, the reservation discount can apply
to the other four sizes that are listed in that same instance size flexibility group:
Standard_DS1_v2
Standard_DS2_v2
Standard_DS3_v2
Standard_DS4_v2
But that reservation discount doesn't apply to VMs sizes that are listed in different instance size flexibility groups,
like SKUs in DSv2 Series High Memory: Standard_DS11_v2, Standard_DS12_v2, and so on.
Within the instance size flexibility group, the number of VMs the reservation discount applies to depends on the
VM size you pick when you buy a reservation. It also depends on the sizes of the VMs that you have running. The
ratio column compares the relative footprint for each VM size in that instance size flexibility group. Use the ratio
value to calculate how the reservation discount applies to the VMs you have running.
Examples
The following examples use the sizes and ratios in the DSv2-series table.
You buy a reserved VM instance with the size Standard_DS4_v2 where the ratio or relative footprint compared to
the other sizes in that series is 8.
Scenario 1: Run eight Standard_DS1_v2 sized VMs with a ratio of 1. Your reservation discount applies to all
eight of those VMs.
Scenario 2: Run two Standard_DS2_v2 sized VMs with a ratio of 2 each. Also run a Standard_DS3_v2 sized VM
with a ratio of 4. The total footprint is 2+2+4=8. So your reservation discount applies to all three of those VMs.
Scenario 3: Run one Standard_DS5_v2 with a ratio of 16. Your reservation discount applies to half that VM's
compute cost.
The following sections show what sizes are in the same size series group when you buy a reserved VM instance
optimized for instance size flexibility.
Azure Dedicated Host is a service that provides physical servers - able to host one or more virtual machines -
dedicated to one Azure subscription. Dedicated hosts are the same physical servers used in our data centers,
provided as a resource. You can provision dedicated hosts within a region, availability zone, and fault domain.
Then, you can place VMs directly into your provisioned hosts, in whatever configuration best meets your needs.
Limitations
Virtual machine scale sets are not currently supported on dedicated hosts.
The following VM series are supported: DSv3, ESv3 and Fsv2.
Benefits
Reserving the entire host provides the following benefits:
Hardware isolation at the physical server level. No other VMs will be placed on your hosts. Dedicated hosts are
deployed in the same data centers and share the same network and underlying storage infrastructure as other,
non-isolated hosts.
Control over maintenance events initiated by the Azure platform. While the majority of maintenance events
have little to no impact on your virtual machines, there are some sensitive workloads where each second of
pause can have an impact. With dedicated hosts, you can opt-in to a maintenance window to reduce the impact
to your service.
With the Azure hybrid benefit, you can bring your own licenses for Windows and SQL to Azure. Using the
hybrid benefits provides you with additional benefits. For more information, see Azure Hybrid Benefit.
A host group is a resource that represents a collection of dedicated hosts. You create a host group in a region and
an availability zone, and add hosts to it.
A host is a resource, mapped to a physical server in an Azure data center. The physical server is allocated when
the host is created. A host is created within a host group. A host has a SKU describing which VM sizes can be
created. Each host can host multiple VMs, of different sizes, as long as they are from the same size series.
When creating a VM in Azure, you can select which dedicated host to use for your VM. You have full control as to
which VMs are placed on your hosts.
Maintenance control
The infrastructure supporting your virtual machines may occasionally be updated to improve reliability,
performance, security, and to launch new features. The Azure platform tries to minimize the impact of platform
maintenance whenever possible, but customers with maintenance sensitive workloads can't tolerate even few
seconds that the VM needs to be frozen or disconnected for maintenance.
Maintenance Control provides customers with an option to skip regular platform updates scheduled on their
dedicated hosts, then apply it at the time of their choice within a 35-day rolling window.
NOTE
Maintenance control is currently in public preview. For more information, see Control updates with Maintenance Control
using CLI or PowerShell.
Capacity considerations
Once a dedicated host is provisioned, Azure assigns it to physical server. This guarantees the availability of the
capacity when you need to provision your VM. Azure uses the entire capacity in the region (or zone) to pick a
physical server for your host. It also means that customers can expect to be able to grow their dedicated host
footprint without the concern of running out of space in the cluster.
Quotas
There is a default quota limit of 3000 vCPUs for dedicated hosts, per region. But, the number of hosts you can
deploy is also limited by the quota for the VM size family used for the host. For example, a Pay-as-you-go
subscription may only have a quota of 10 vCPUs available for the Dsv3 size series, in the East US region. In this
case, you need to request a quota increase to at least 64 vCPUs before you can deploy a dedicated host. Select the
Request increase button in the upper right corner to file a request if needed.
Pricing
Users are charged per dedicated host, regardless how many VMs are deployed. In your monthly statement you
will see a new billable resource type of hosts. The VMs on a dedicated host will still be shown in your statement,
but will carry a price of 0.
The host price is set based on VM family, type (hardware size), and region. A host price is relative to the largest
VM size supported on the host.
Software licensing, storage and network usage are billed separately from the host and VMs. There is no change to
those billable items.
For more information, see Azure Dedicated Host pricing.
Host Under Investigation We’re having some issues with the host which we’re looking
into. This is a transitional state required for Azure to try and
identify the scope and root cause for the issue identified.
Virtual machines running on the host may be impacted.
Host Pending Deallocate Azure can’t restore the host back to a healthy state and ask
you to redeploy your virtual machines out of this host. If
autoReplaceOnFailure is enabled, your virtual machines are
service healed to healthy hardware. Otherwise, your virtual
machine may be running on a host that is about to fail.
Host deallocated All virtual machines have been removed from the host. You
are no longer being charged for this host since the hardware
was taken out of rotation.
Next steps
You can deploy a dedicated host using Azure PowerShell, the portal, and Azure CLI.
There is sample template, found here, that uses both zones and fault domains for maximum resiliency in a
region.
Maintenance for virtual machines in Azure
2/10/2020 • 6 minutes to read • Edit Online
Azure periodically updates its platform to improve the reliability, performance, and security of the host
infrastructure for virtual machines. The purpose of these updates ranges from patching software components in
the hosting environment to upgrading networking components or decommissioning hardware.
Updates rarely affect the hosted VMs. When updates do have an effect, Azure chooses the least impactful method
for updates:
If the update doesn't require a reboot, the VM is paused while the host is updated, or the VM is live-migrated to
an already updated host.
If maintenance requires a reboot, you're notified of the planned maintenance. Azure also provides a time
window in which you can start the maintenance yourself, at a time that works for you. The self-maintenance
window is typically 30 days unless the maintenance is urgent. Azure is investing in technologies to reduce the
number of cases in which planned platform maintenance requires the VMs to be rebooted. For instructions on
managing planned maintenance, see Handling planned maintenance notifications using the Azure CLI,
PowerShell or portal.
This page describes how Azure performs both types of maintenance. For more information about unplanned
events (outages), see Manage the availability of VMs for Windows or the corresponding article for Linux.
Within a VM, you can get notifications about upcoming maintenance by using Scheduled Events for Windows or
for Linux.
Next steps
You can use the Azure CLI, Azure PowerShell or the portal to manage planned maintenance.
Introduction to Azure managed disks
12/16/2019 • 9 minutes to read • Edit Online
Azure managed disks are block-level storage volumes that are managed by Azure and used with Azure Virtual
Machines. Managed disks are like a physical disk in an on-premises server but virtualized. With managed disks,
all you have to do is specify the disk size, the disk type, and provision the disk. Once you provision the disk,
Azure handles the rest.
The available types of disks are ultra disks, premium solid-state drives (SSD ), standard SSDs, and standard hard
disk drives (HDD ). For information about each individual disk type, see Select a disk type for IaaS VMs.
Encryption
Managed disks offer two different kinds of encryption. The first is Server Side Encryption (SSE ), which is
performed by the storage service. The second one is Azure Disk Encryption (ADE ), which you can enable on the
OS and data disks for your VMs.
Server-side encryption
Azure Server-side Encryption provides encryption-at-rest and safeguards your data to meet your organizational
security and compliance commitments. Server-side encryption is enabled by default for all managed disks,
snapshots, and images in all the regions where managed disks are available. You can either allow Azure to
manage your keys for you, these are platform-managed keys, or you can manage the keys yourself, these are
customer-managed keys. Visit the Managed Disks FAQ page for more details.
Azure Disk Encryption
Azure Disk Encryption allows you to encrypt the OS and Data disks used by an IaaS Virtual Machine. This
encryption includes managed disks. For Windows, the drives are encrypted using industry-standard BitLocker
encryption technology. For Linux, the disks are encrypted using the DM -Crypt technology. The encryption
process is integrated with Azure Key Vault to allow you to control and manage the disk encryption keys. For
more information, see Azure Disk Encryption for IaaS VMs.
Disk roles
There are three main disk roles in Azure: the data disk, the OS disk, and the temporary disk. These roles map to
disks that are attached to your virtual machine.
Data disk
A data disk is a managed disk that's attached to a virtual machine to store application data, or other data you
need to keep. Data disks are registered as SCSI drives and are labeled with a letter that you choose. Each data
disk has a maximum capacity of 32,767 gibibytes (GiB ). The size of the virtual machine determines how many
data disks you can attach to it and the type of storage you can use to host the disks.
OS disk
Every virtual machine has one attached operating system disk. That OS disk has a pre-installed OS, which was
selected when the VM was created. This disk contains the boot volume.
This disk has a maximum capacity of 2,048 GiB.
Temporary disk
Every VM contains a temporary disk, which is not a managed disk. The temporary disk provides short-term
storage for applications and processes and is intended to only store data such as page or swap files. Data on the
temporary disk may be lost during a maintenance event event or when you redeploy a VM. On Azure Linux
VMs, the temporary disk is /dev/sdb by default and on Windows VMs the temporary disk is D: by default.
During a successful standard reboot of the VM, the data on the temporary disk will persist.
The first level provisioning sets the per-disk IOPS and bandwidth assignment. At the second level, compute
server host implements SSD provisioning, applying it only to data that is stored on the server’s SSD, which
includes disks with caching (ReadWrite and ReadOnly) as well as local and temp disks. Finally, VM network
provisioning takes place at the third level for any I/O that the compute host sends to Azure Storage's backend.
With this scheme, the performance of a VM depends on a variety of factors, from how the VM uses the local
SSD, to the number of disks attached, as well as the performance and caching type of the disks it has attached.
As an example of these limitations, a Standard_DS1v1 VM is prevented from achieving the 5,000 IOPS potential
of a P30 disk, whether it is cached or not, because of limits at the SSD and network levels:
Azure uses prioritized network channel for disk traffic, which gets the precedence over other low priority of
network traffic. This helps disks maintain their expected performance in case of network contentions. Similarly,
Azure Storage handles resource contentions and other issues in the background with automatic load balancing.
Azure Storage allocates required resources when you create a disk, and applies proactive and reactive balancing
of resources to handle the traffic level. This further ensures disks can sustain their expected IOPS and
throughput targets. You can use the VM -level and Disk-level metrics to track the performance and setup alerts as
needed.
Refer to our design for high performance article, to learn the best practices for optimizing VM + Disk
configurations so that you can achieve your desired performance
Next steps
If you'd like a video going into more detail on managed disks, check out: Better Azure VM Resiliency with
Managed Disks.
Learn more about the individual disk types Azure offers, which type is a good fit for your needs, and learn about
their performance targets in our article on disk types.
Select a disk type for IaaS VMs
What disk types are available in Azure?
11/12/2019 • 13 minutes to read • Edit Online
Azure managed disks currently offers four disk types, each type is aimed towards specific customer scenarios.
Disk comparison
The following table provides a comparison of ultra disks, premium solid-state drives (SSD ), standard SSD, and
standard hard disk drives (HDD ) for managed disks to help you decide what to use.
Max disk size 65,536 gibibyte (GiB) 32,767 GiB 32,767 GiB 32,767 GiB
Max throughput 2,000 MiB/s 900 MiB/s 750 MiB/s 500 MiB/s
Ultra disk
Azure ultra disks deliver high throughput, high IOPS, and consistent low latency disk storage for Azure IaaS VMs.
Some additional benefits of ultra disks include the ability to dynamically change the performance of the disk,
along with your workloads, without the need to restart your virtual machines (VM ). Ultra disks are suited for data-
intensive workloads such as SAP HANA, top tier databases, and transaction-heavy workloads. Ultra disks can only
be used as data disks. We recommend using premium SSDs as OS disks.
Performance
When you provision an ultra disk, you can independently configure the capacity and the performance of the disk.
Ultra disks come in several fixed sizes, ranging from 4 GiB up to 64 TiB, and feature a flexible performance
configuration model that allows you to independently configure IOPS and throughput.
Some key capabilities of ultra disks are:
Disk capacity: Ultra disks capacity ranges from 4 GiB up to 64 TiB.
Disk IOPS: Ultra disks support IOPS limits of 300 IOPS/GiB, up to a maximum of 160 K IOPS per disk. To
achieve the IOPS that you provisioned, ensure that the selected Disk IOPS are less than the VM IOPS limit.
The minimum IOPS per disk is 2 IOPS/GiB, with an overall baseline minimum of 100 IOPS. For example, if
you had a 4 GiB ultra disk, you will have a minimum of 100 IOPS, instead of eight IOPS.
Disk throughput: With ultra disks, the throughput limit of a single disk is 256 KiB/s for each provisioned IOPS,
up to a maximum of 2000 MBps per disk (where MBps = 10^6 Bytes per second). The minimum throughput
per disk is 4KiB/s for each provisioned IOPS, with an overall baseline minimum of 1 MBps.
Ultra disks support adjusting the disk performance attributes (IOPS and throughput) at runtime without
detaching the disk from the virtual machine. Once a disk performance resize operation has been issued on a
disk, it can take up to an hour for the change to actually take effect. There is a limit of four performance resize
operations during a 24 hour window. It is possible for a performance resize operation to fail due to a lack of
performance bandwidth capacity.
Disk size
DISK SIZE (GIB) IOPS CAP THROUGHPUT CAP (MBPS)
4 1,200 300
8 2,400 600
16 4,800 1,200
32 9,600 2,000
64 19,200 2,000
Premium SSD
Azure premium SSDs deliver high-performance and low -latency disk support for virtual machines (VMs) with
input/output (IO )-intensive workloads. To take advantage of the speed and performance of premium storage disks,
you can migrate existing VM disks to Premium SSDs. Premium SSDs are suitable for mission-critical production
applications. Premium SSDs can only be used with VM series that are premium storage-compatible.
To learn more about individual VM types and sizes in Azure for Windows, including which sizes are premium
storage-compatible, see Windows VM sizes. To learn more about individual VM types and sizes in Azure for Linux,
including which sizes are premium storage-compatible, see Linux VM sizes.
Disk size
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
IOP 120 120 120 120 240 500 1,1 2,30 5,00 7,50 7,50 16,0 18,0 20,0
S 00 0 0 0 0 00 00 00
per
disk
Thr 25 25 25 25 50 100 125 150 200 250 250 500 750 900
oug MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
hpu /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
t
per
disk
Max 30 30 30 30 30 30 30 30
bur min min min min min min min min
st
dur
atio
n**
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
**Denotes a feature that is currently in preview, see Disk bursting for more information.
When you provision a premium storage disk, unlike standard storage, you are guaranteed the capacity, IOPS, and
throughput of that disk. For example, if you create a P50 disk, Azure provisions 4,095-GB storage capacity, 7,500
IOPS, and 250-MB/s throughput for that disk. Your application can use all or part of the capacity and
performance. Premium SSD disks are designed to provide low single-digit millisecond latencies and target IOPS
and throughput described in the preceding table 99.9% of the time.
Bursting (preview)
Premium SSD sizes smaller than P30 now offer disk bursting (preview ) and can burst their IOPS per disk up to
3,500 and their bandwidth up to 170 Mbps. Bursting is automated and operates based on a credit system. Credits
are automatically accumulated in a burst bucket when disk traffic is below the provisioned performance target and
credits are automatically consumed when traffic bursts beyond the target, up to the max burst limit. The max burst
limit defines the ceiling of disk IOPS & Bandwidth even if you have burst credits to consume from. Disk bursting
provides better tolerance on unpredictable changes of IO patterns. You can best leverage it for OS disk boot and
applications with spiky traffic.
Disks bursting support will be enabled on new deployments of applicable disk sizes in the preview regions by
default, with no user action required. For existing disks of the applicable sizes, you can enable bursting with either
of two the options: detach and reattach the disk or stop and restart the attached VM. All burst applicable disk sizes
will start with a full burst credit bucket when the disk is attached to a Virtual Machine that supports a max
duration at peak burst limit of 30 mins. To learn more about how bursting work on Azure Disks, see Premium SSD
bursting.
Transactions
For premium SSDs, each I/O operation less than or equal to 256 KiB of throughput is considered a single I/O
operation. I/O operations larger than 256 KiB of throughput are considered multiple I/Os of size 256 KiB.
Standard SSD
Azure standard SSDs are a cost-effective storage option optimized for workloads that need consistent
performance at lower IOPS levels. Standard SSD offers a good entry level experience for those who wish to move
to the cloud, especially if you experience issues with the variance of workloads running on your HDD solutions on
premises. Compared to standard HDDs, standard SSDs deliver better availability, consistency, reliability, and
latency. Standard SSDs are suitable for Web servers, low IOPS application servers, lightly used enterprise
applications, and Dev/Test workloads. Like standard HDDs, standard SSDs are available on all Azure VMs.
Disk size
STA
NDA
RD
SSD
SIZE
S E1* E2* E3* E4 E6 E10 E15 E20 E30 E40 E50 E60 E70 E80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
IOP Up Up Up Up Up Up Up Up Up Up Up Up Up Up
S to to to to to to to to to to to to to to
per 120 120 120 120 240 500 500 500 500 500 500 2,00 4,00 6,00
disk 0 0 0
Thr Up Up Up Up Up Up Up Up Up Up Up Up Up Up
oug to to to to to to to to to to to to to to
hpu 25 25 25 25 50 60 60 60 60 60 60 400 600 750
t MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
per /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
disk
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
Standard SSDs are designed to provide single-digit millisecond latencies and the IOPS and throughput up to the
limits described in the preceding table 99% of the time. Actual IOPS and throughput may vary sometimes
depending on the traffic patterns. Standard SSDs will provide more consistent performance than the HDD disks
with the lower latency.
Transactions
For standard SSDs, each I/O operation less than or equal to 256 KiB of throughput is considered a single I/O
operation. I/O operations larger than 256 KiB of throughput are considered multiple I/Os of size 256 KiB. These
transactions have a billing impact.
Standard HDD
Azure standard HDDs deliver reliable, low -cost disk support for VMs running latency-insensitive workloads. With
standard storage, the data is stored on hard disk drives (HDDs). Latency, IOPS, and Throughput of Standard HDD
disks may vary more widely as compared to SSD -based disks. Standard HDD Disks are designed to deliver write
latencies under 10ms and read latencies under 20ms for most IO operations, however the actual performance
may vary depending on the IO size and workload pattern. When working with VMs, you can use standard HDD
disks for dev/test scenarios and less critical workloads. Standard HDDs are available in all Azure regions and can
be used with all Azure VMs.
Disk size
STAND
ARD
DISK
TYPE S4 S6 S10 S15 S20 S30 S40 S50 S60 S70 S80
Disk 32 64 128 256 512 1,024 2,048 4,096 8,192 16,38 32,76
size in 4 7
GiB
IOPS Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to
per 500 500 500 500 500 500 500 500 1,300 2,000 2,000
disk
Throu Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to
ghput 60 60 60 60 60 60 60 60 300 500 500
per MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s
disk ec ec ec ec ec ec ec ec ec ec ec
Transactions
For Standard HDDs, each IO operation is considered as a single transaction, regardless of the I/O size. These
transactions have a billing impact.
Billing
When using managed disks, the following billing considerations apply:
Disk type
managed disk Size
Snapshots
Outbound data transfers
Number of transactions
Managed disk size: managed disks are billed on the provisioned size. Azure maps the provisioned size (rounded
up) to the nearest offered disk size. For details of the disk sizes offered, see the previous tables. Each disk maps to
a supported provisioned disk size offering and is billed accordingly. For example, if you provisioned a 200 GiB
Standard SSD, it maps to the disk size offer of E15 (256 GiB ). Billing for any provisioned disk is prorated hourly by
using the monthly price for the Premium Storage offer. For example, if you provisioned an E10 disk and deleted it
after 20 hours, you're billed for the E10 offering prorated to 20 hours. This is regardless of the amount of actual
data written to the disk.
Snapshots: Snapshots are billed based on the size used. For example, if you create a snapshot of a managed disk
with provisioned capacity of 64 GiB and actual used data size of 10 GiB, the snapshot is billed only for the used
data size of 10 GiB.
For more information on snapshots, see the section on snapshots in the managed disk overview.
Outbound data transfers: Outbound data transfers (data going out of Azure data centers) incur billing for
bandwidth usage.
Transactions: You're billed for the number of transactions that you perform on a standard managed disk. For
standard SSDs, each I/O operation less than or equal to 256 KiB of throughput is considered a single I/O
operation. I/O operations larger than 256 KiB of throughput are considered multiple I/Os of size 256 KiB. For
Standard HDDs, each IO operation is considered as a single transaction, regardless of the I/O size.
For detailed information on pricing for Managed Disks, including transaction costs, see Managed Disks Pricing.
Ultra disk VM reservation fee
Azure VMs have the capability to indicate if they are compatible with ultra disks. An ultra disk compatible VM
allocates dedicated bandwidth capacity between the compute VM instance and the block storage scale unit to
optimize the performance and reduce latency. Adding this capability on the VM results in a reservation charge that
is only imposed if you enabled ultra disk capability on the VM without attaching an ultra disk to it. When an ultra
disk is attached to the ultra disk compatible VM, this charge would not be applied. This charge is per vCPU
provisioned on the VM.
NOTE
For constrained core VM sizes, the reservation fee is based on the actual number of vCPUs and not the constrained cores.
For Standard_E32-8s_v3, the reservation fee will be based on 32 cores.
Refer to the Azure Disks pricing page for ultra disk pricing details.
Azure disk reservation
Disk reservation is the option to purchase one year of disk storage in advance at a discount, reducing your total
cost. When purchasing a disk reservation, you select a specific Disk SKU in a target region, for example, 10 P30
(1TiB ) premium SSDs in East US 2 region for a one year term. The reservation experience is similar to reserved
virtual machine (VM ) instances. You can bundle VM and Disk reservations to maximize your savings. For now,
Azure Disks Reservation offers one year commitment plan for premium SSD SKUs from P30 (1TiB ) to P80 (32
TiB ) in all production regions. For more details on the Reserved Disks pricing, see Azure Disks pricing page.
Server side encryption of Azure managed disks
2/18/2020 • 12 minutes to read • Edit Online
Azure managed disks automatically encrypt your data by default when persisting it to the cloud. Server-side
encryption protects your data and helps you meet your organizational security and compliance commitments. Data
in Azure managed disks is encrypted transparently using 256-bit AES encryption, one of the strongest block
ciphers available, and is FIPS 140-2 compliant.
Encryption does not impact the performance of managed disks. There is no additional cost for the encryption.
For more information about the cryptographic modules underlying Azure managed disks, see Cryptography API:
Next Generation
Platform-managed keys
By default, managed disks use platform-managed encryption keys. As of June 10, 2017, all new managed disks,
snapshots, images, and new data written to existing managed disks are automatically encrypted-at-rest with
platform-managed keys.
Customer-managed keys
You can choose to manage encryption at the level of each managed disk, with your own keys. Server-side
encryption for managed disks with customer-managed keys offers an integrated experience with Azure Key Vault.
You can either import your RSA keys to your Key Vault or generate new RSA keys in Azure Key Vault. Azure
managed disks handles the encryption and decryption in a fully transparent fashion using envelope encryption. It
encrypts data using an AES 256 based data encryption key (DEK), which is, in turn, protected using your keys. You
have to grant access to managed disks in your Key Vault to use your keys for encrypting and decrypting the DEK.
This allows you full control of your data and keys. You can disable your keys or revoke access to managed disks at
any time. You can also audit the encryption key usage with Azure Key Vault monitoring to ensure that only
managed disks or other trusted Azure services are accessing your keys.
The following diagram shows how managed disks use Azure Active Directory and Azure Key Vault to make
requests using the customer-managed key:
The following list explains the diagram in even more detail:
1. An Azure Key Vault administrator creates key vault resources.
2. The key vault admin either imports their RSA keys to Key Vault or generate new RSA keys in Key Vault.
3. That administrator creates an instance of Disk Encryption Set resource, specifying an Azure Key Vault ID and a
key URL. Disk Encryption Set is a new resource introduced for simplifying the key management for managed
disks.
4. When a disk encryption set is created, a system-assigned managed identity is created in Azure Active Directory
(AD ) and associated with the disk encryption set.
5. The Azure key vault administrator then grants the managed identity permission to perform operations in the
key vault.
6. A VM user creates disks by associating them with the disk encryption set. The VM user can also enable server-
side encryption with customer-managed keys for existing resources by associating them with the disk
encryption set.
7. Managed disks use the managed identity to send requests to the Azure Key Vault.
8. For reading or writing data, managed disks sends requests to Azure Key Vault to encrypt (wrap) and decrypt
(unwrap) the data encryption key in order to perform encryption and decryption of the data.
To revoke access to customer-managed keys, see Azure Key Vault PowerShell and Azure Key Vault CLI. Revoking
access effectively blocks access to all data in the storage account, as the encryption key is inaccessible by Azure
Storage.
Supported regions
Only the following regions are currently supported:
Available as a GA offering in the East US, West US 2, South Central US, UK South regions.
Available as a public preview in the West Central US, East US 2, Canada Central, and North Europe regions.
Restrictions
For now, customer-managed keys have the following restrictions:
Only "soft" and "hard" RSA keys of size 2080 are supported, no other keys or sizes.
Disks created from custom images that are encrypted using server-side encryption and customer-managed
keys must be encrypted using the same customer-managed keys and must be in the same subscription.
Snapshots created from disks that are encrypted with server-side encryption and customer-managed keys must
be encrypted with the same customer-managed keys.
Custom images encrypted using server-side encryption and customer-managed keys cannot be used in the
shared image gallery.
All resources related to your customer-managed keys (Azure Key Vaults, disk encryption sets, VMs, disks, and
snapshots) must be in the same subscription and region.
Disks, snapshots, and images encrypted with customer-managed keys cannot move to another subscription.
If you use the Azure portal to create your disk encryption set, you cannot use snapshots for now.
PowerShell
Setting up your Azure Key Vault and DiskEncryptionSet
1. Make sure that you have installed latest Azure PowerShell version, and you are signed in to an Azure
account in with Connect-AzAccount
2. Create an instance of Azure Key Vault and encryption key.
When creating the Key Vault instance, you must enable soft delete and purge protection. Soft delete ensures
that the Key Vault holds a deleted key for a given retention period (90 day default). Purge protection ensures
that a deleted key cannot be permanently deleted until the retention period lapses. These settings protect
you from losing data due to accidental deletion. These settings are mandatory when using a Key Vault for
encrypting managed disks.
$ResourceGroupName="yourResourceGroupName"
$LocationName="westcentralus"
$keyVaultName="yourKeyVaultName"
$keyName="yourKeyName"
$keyDestination="Software"
$diskEncryptionSetName="yourDiskEncryptionSetName"
NOTE
It may take few minutes for Azure to create the identity of your DiskEncryptionSet in your Azure Active Directory. If
you get an error like "Cannot find the Active Directory object" when running the following command, wait a few
minutes and try again.
$identity = Get-AzADServicePrincipal -DisplayName myDiskEncryptionSet1
Create a VM using a Marketplace image, encrypting the OS and data disks with customer-managed keys
$VMLocalAdminUser = "yourVMLocalAdminUserName"
$VMLocalAdminSecurePassword = ConvertTo-SecureString <password> -AsPlainText -Force
$LocationName = "westcentralus"
$ResourceGroupName = "yourResourceGroupName"
$ComputerName = "yourComputerName"
$VMName = "yourVMName"
$VMSize = "Standard_DS3_v2"
$diskEncryptionSetName="yourdiskEncryptionSetName"
$NetworkName = "yourNetworkName"
$NICName = "yourNICName"
$SubnetName = "yourSubnetName"
$SubnetAddressPrefix = "10.0.0.0/24"
$VnetAddressPrefix = "10.0.0.0/16"
Create an empty disk encrypted using server-side encryption with customer-managed keys and attach it to a VM
$vmName = "yourVMName"
$LocationName = "westcentralus"
$ResourceGroupName = "yourResourceGroupName"
$diskName = "yourDiskName"
$diskSKU = "Premium_LRS"
$diskSizeinGiB = 30
$diskLUN = 1
$diskEncryptionSetName="yourDiskEncryptionSetName"
$vm = Add-AzVMDataDisk -VM $vm -Name $diskName -CreateOption Empty -DiskSizeInGB $diskSizeinGiB -
StorageAccountType $diskSKU -Lun $diskLUN -DiskEncryptionSetId $diskEncryptionSet.Id
$rgName = "yourResourceGroupName"
$diskName = "yourDiskName"
$diskEncryptionSetName = "yourDiskEncryptionSetName"
Create a virtual machine scale set using a Marketplace image, encrypting the OS and data disks with customer-managed keys
$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "westcentralus"
$ResourceGroupName = "yourResourceGroupName"
$ComputerNamePrefix = "yourComputerNamePrefix"
$VMScaleSetName = "yourVMSSName"
$VMSize = "Standard_DS3_v2"
$diskEncryptionSetName="yourDiskEncryptionSetName"
$NetworkName = "yourVNETName"
$SubnetName = "yourSubnetName"
$SubnetAddressPrefix = "10.0.0.0/24"
$VnetAddressPrefix = "10.0.0.0/16"
# Enable encryption at rest with customer managed keys for OS disk by setting DiskEncryptionSetId property
# Add a data disk encrypted at rest with customer managed keys by setting DiskEncryptionSetId property
IMPORTANT
Customer-managed keys rely on managed identities for Azure resources, a feature of Azure Active Directory (Azure AD).
When you configure customer-managed keys, a managed identity is automatically assigned to your resources under the
covers. If you subsequently move the subscription, resource group, or managed disk from one Azure AD directory to another,
the managed identity associated with managed disks is not transferred to the new tenant, so customer-managed keys may
no longer work. For more information, see Transferring a subscription between Azure AD directories.
Portal
Setting up customer-managed keys for your disks will require you to create resources in a particular order, if you're
doing it for the first time. First, you will need to create and set up an Azure Key Vault.
Setting up your Azure Key Vault
1. Sign into the Azure portal and search for Key Vault
2. Search for and select Key Vaults.
IMPORTANT
Your Azure key vault, disk encryption set, VM, disks, and snapshots must all be in the same region and subscription
for deployment to succeed.
3. Select your resource group, name your encryption set, and select the same region as your key vault.
4. Select Key vault and key.
5. Select the key vault and key you created previously, as well as the version.
6. Press Select.
7. Select Review + Create and then Create.
8. Open the disk encryption set once it finishes creating and select the alert that pops up.
Two notifications should pop up and succeed. Doing this will allow you to use the disk encryption set with your key
vault.
Deploy a VM
Now that you've created and set up your key vault and the disk encryption set, you can deploy a VM using the
encryption. The VM deployment process is similar to the standard deployment process, the only differences are
that you need to deploy the VM in the same region as your other resources and you opt to use a customer
managed key.
1. Open the disk encryption sets link.
2. Search for Virtual Machines and select + Add to create a VM.
3. On the Basic tab, select the same region as your disk encryption set and Azure Key Vault.
4. Fill in the other values on the Basic tab as you like.
5. On the Disks tab, select Encryption at rest with a customer-managed key.
6. Select your disk encryption set in the Disk encryption set drop-down.
7. Make the remaining selections as you like.
Enable on an existing disk
To manage and configure disk encryption on your existing disks, you must use the following link:
https://aka.ms/diskencryptionsets. Enabling customer-managed keys on existing disks is not yet available in the
global Azure portal.
Cau t i on
Enabling disk encryption on any disks attached to a VM will require that you stop the VM.
1. Open the disk encryption sets link.
2. Navigate to a VM which is in the same region as one of your disk encryption sets.
3. Open the VM and select Stop.
4. After the VM has finished stopping, select Disks and then select the disk you want to encrypt.
5. Select Encryption and select Encryption at rest with a customer-managed key and then select your
disk encryption set in the drop-down list.
6. Select Save.
7. Repeat this process for any other disks attached to the VM you'd like to encrypt.
8. When your disks finish switching over to customer-managed keys, if there are no there no other attached
disks you'd like to encrypt, you may start your VM.
IMPORTANT
Customer-managed keys rely on managed identities for Azure resources, a feature of Azure Active Directory (Azure AD).
When you configure customer-managed keys, a managed identity is automatically assigned to your resources under the
covers. If you subsequently move the subscription, resource group, or managed disk from one Azure AD directory to another,
the managed identity associated with managed disks is not transferred to the new tenant, so customer-managed keys may
no longer work. For more information, see Transferring a subscription between Azure AD directories.
Next steps
Explore the Azure Resource Manager templates for creating encrypted disks with customer-managed keys
What is Azure Key Vault?
Replicate machines with customer-managed keys enabled disks
Set up disaster recovery of VMware VMs to Azure with PowerShell
Set up disaster recovery to Azure for Hyper-V VMs using PowerShell and Azure Resource Manager
Understand how your reservation discount is applied
to Azure disk storage
2/24/2020 • 2 minutes to read • Edit Online
After you purchase Azure disk reserved capacity, a reservation discount is automatically applied to disk resources
that match the terms of your reservation. The reservation discount applies to disk SKUs only. Disk snapshots are
charged at pay-as-you-go rates.
For more information about Azure disk reservation, see Save costs with Azure disk reservation. For information
about pricing for Azure disk reservation, see Azure Managed Disks pricing.
Discount examples
The following examples show how the Azure disk reservation discount applies depending on your deployment.
Suppose you purchase and reserve 100 P30 disks in the US West 2 region for a one-year term. Each disk has
approximately 1 TiB of storage. Assume the cost of this sample reservation is $140,100. You can choose to pay
either the full amount up front or fixed monthly installments of $11,675 for the next 12 months.
The following scenarios describe what happens if you underuse, overuse, or tier your reserved capacity. For these
examples, assume you've signed up for a monthly reservation-payment plan.
Underusing your capacity
Suppose you deploy only 99 of your 100 reserved Azure premium solid-state drive (SSD ) P30 disks for an hour
within the reservation period. The remaining P30 disk isn't applied during that hour. It also doesn't carry over.
Overusing your capacity
Suppose that for an hour within the reservation period, you use 101 premium SSD P30 disks. The reservation
discount applies only to 100 P30 disks. The remaining P30 disk is charged at pay-as-you-go rates for that hour. For
the next hour, if your usage goes down to 100 P30 disks, all usage is covered by the reservation.
Tiering your capacity
Suppose that in a given hour within your reservation period, you want to use a total of 200 P30 premium SSDs.
Also suppose you use only 100 for the first 30 minutes. During this period, your use is fully covered because you
made a reservation for 100 P30 disks. If you then discontinue the use of the first 100 (so that you're using zero)
and then begin to use the other 100 for the remaining 30 minutes, that usage is also covered under your
reservation.
Need help? Contact us
If you have questions or need help, create a support request.
Next steps
Reduce costs with Azure Disks Reservation (Linux)
Reduce costs with Azure Disks Reservation (Windows)
What are Azure Reservations?
Azure premium storage: design for high performance
12/23/2019 • 37 minutes to read • Edit Online
This article provides guidelines for building high performance applications using Azure Premium Storage. You can
use the instructions provided in this document combined with performance best practices applicable to
technologies used by your application. To illustrate the guidelines, we have used SQL Server running on Premium
Storage as an example throughout this document.
While we address performance scenarios for the Storage layer in this article, you will need to optimize the
application layer. For example, if you are hosting a SharePoint Farm on Azure Premium Storage, you can use the
SQL Server examples from this article to optimize the database server. Additionally, optimize the SharePoint
Farm's Web server and Application server to get the most performance.
This article will help answer following common questions about optimizing application performance on Azure
Premium Storage,
How to measure your application performance?
Why are you not seeing expected high performance?
Which factors influence your application performance on Premium Storage?
How do these factors influence performance of your application on Premium Storage?
How can you optimize for IOPS, Bandwidth and Latency?
We have provided these guidelines specifically for Premium Storage because workloads running on Premium
Storage are highly performance sensitive. We have provided examples where appropriate. You can also apply
some of these guidelines to applications running on IaaS VMs with Standard Storage disks.
NOTE
Sometimes, what appears to be a disk performance issue is actually a network bottleneck. In these situations, you should
optimize your network performance.
If you are looking to benchmark your disk, see our article on Benchmarking a disk.
If your VM supports accelerated networking, you should make sure it is enabled. If it is not enabled, you can enable it on
already deployed VMs on both Windows and Linux.
Before you begin, if you are new to Premium Storage, first read the Select an Azure disk type for IaaS VMs and
Scalability targets for premium page blob storage accounts.
Throughput
Throughput, or bandwidth is the amount of data that your application is sending to the storage disks in a specified
interval. If your application is performing input/output operations with large IO unit sizes, it requires high
throughput. Data warehouse applications tend to issue scan intensive operations that access large portions of data
at a time and commonly perform bulk operations. In other words, such applications require higher throughput. If
you have such an application, you must design its infrastructure to optimize for throughput. In the next section, we
discuss in detail the factors you must tune to achieve this.
When you attach a premium storage disk to a high scale VM, Azure provisions throughput as per that disk
specification. For example, a P50 disk provisions 250 MB per second disk throughput. Each high scale VM size also
has as specific throughput limit that it can sustain. For example, Standard GS5 VM has a maximum throughput of
2,000 MB per second.
There is a relation between throughput and IOPS as shown in the formula below.
Therefore, it is important to determine the optimal throughput and IOPS values that your application requires. As
you try to optimize one, the other also gets affected. In a later section, Optimizing Application Performance, we
will discuss in more details about optimizing IOPS and Throughput.
Latency
Latency is the time it takes an application to receive a single request, send it to the storage disks and send the
response to the client. This is a critical measure of an application's performance in addition to IOPS and
Throughput. The Latency of a premium storage disk is the time it takes to retrieve the information for a request
and communicate it back to your application. Premium Storage provides consistent low latencies. Premium Disks
are designed to provide single-digit millisecond latencies for most IO operations. If you enable ReadOnly host
caching on premium storage disks, you can get much lower read latency. We will discuss Disk Caching in more
detail in later section on Optimizing Application Performance.
When you are optimizing your application to get higher IOPS and Throughput, it will affect the latency of your
application. After tuning the application performance, always evaluate the latency of the application to avoid
unexpected high latency behavior.
The following control plane operations on Managed Disks may involve movement of the Disk from one Storage
location to another. This is orchestrated via background copy of data that can take several hours to complete,
typically less than 24 hours depending on the amount of data in the disks. During that time your application can
experience higher than usual read latency as some reads can get redirected to the original location and can take
longer to complete. There is no impact on write latency during this period.
Update the storage type.
Detach and attach a disk from one VM to another.
Create a managed disk from a VHD.
Create a managed disk from a snapshot.
Convert unmanaged disks to managed disks.
% Read operations
% Write operations
% Random operations
% Sequential operations
IO request size
Average Throughput
Max. Throughput
PERFORMANCE
REQUIREMENTS 50 PERCENTILE 90 PERCENTILE 99 PERCENTILE
Min. Latency
Average Latency
Max. CPU
Average CPU
Max. Memory
Average Memory
Queue Depth
NOTE
You should consider scaling these numbers based on expected future growth of your application. It is a good idea to plan for
growth ahead of time, because it could be harder to change the infrastructure for improving performance later.
If you have an existing application and want to move to Premium Storage, first build the checklist above for the
existing application. Then, build a prototype of your application on Premium Storage and design the application
based on guidelines described in Optimizing Application Performance in a later section of this document. The next
article describes the tools you can use to gather the performance measurements.
Counters to measure application performance requirements
The best way to measure performance requirements of your application, is to use performance-monitoring tools
provided by the operating system of the server. You can use PerfMon for Windows and iostat for Linux. These
tools capture counters corresponding to each measure explained in the above section. You must capture the values
of these counters when your application is running its normal, peak, and off-hours workloads.
The PerfMon counters are available for processor, memory and, each logical disk and physical disk of your server.
When you use premium storage disks with a VM, the physical disk counters are for each premium storage disk,
and logical disk counters are for each volume created on the premium storage disks. You must capture the values
for the disks that host your application workload. If there is a one to one mapping between logical and physical
disks, you can refer to physical disk counters; otherwise refer to the logical disk counters. On Linux, the iostat
command generates a CPU and disk utilization report. The disk utilization report provides statistics per physical
device or partition. If you have a database server with its data and logs on separate disks, collect this data for both
disks. Below table describes counters for disks, processors, and memory:
Disk Reads and Writes % of Reads and Write % Disk Read Time r/s
operations performed on the % Disk Write Time w/s
disk.
COUNTER DESCRIPTION PERFMON IOSTAT
Queue Depth Number of outstanding I/O Current Disk Queue Length avgqu-sz
requests waiting to be read
from or written to the
storage disk.
Max. Memory Amount of memory required % Committed Bytes in Use Use vmstat
to run application smoothly
Example Scenario Enterprise OLTP application Enterprise Data warehousing Near real-time applications
requiring very high application processing large requiring instant responses
transactions per second rate. amounts of data. to user requests, like online
gaming.
IOPS THROUGHPUT LATENCY
Performance factors
VM size Use a VM size that offers Use a VM size with Use a VM size that offers
IOPS greater than your throughput limit greater scale limits greater than your
application requirement. than your application application requirement.
requirement.
Disk size Use a disk size that offers Use a disk size with Use a disk size that offers
IOPS greater than your Throughput limit greater scale limits greater than your
application requirement. than your application application requirement.
requirement.
VM and Disk Scale Limits IOPS limit of the VM size Throughput limit of the VM Scale limits of the VM size
chosen should be greater size chosen should be chosen must be greater than
than total IOPS driven by greater than total total scale limits of attached
storage disks attached to it. Throughput driven by premium storage disks.
premium storage disks
attached to it.
Stripe Size Smaller stripe size for Larger stripe size for
random small IO pattern sequential large IO pattern
seen in OLTP applications. seen in Data Warehouse
For example, use stripe size applications. For example,
of 64 KB for SQL Server use 256 KB stripe size for
OLTP application. SQL Server Data warehouse
application.
Queue Depth Larger Queue Depth yields Larger Queue Depth yields Smaller Queue Depth yields
higher IOPS. higher Throughput. lower latencies.
Nature of IO requests
An IO request is a unit of input/output operation that your application will be performing. Identifying the nature of
IO requests, random or sequential, read or write, small or large, will help you determine the performance
requirements of your application. It is important to understand the nature of IO requests, to make the right
decisions when designing your application infrastructure. IOs must be distributed evenly to achieve the best
performance possible.
IO size is one of the more important factors. The IO size is the size of the input/output operation request
generated by your application. The IO size has a significant impact on performance especially on the IOPS and
Bandwidth that the application is able to achieve. The following formula shows the relationship between IOPS, IO
size, and Bandwidth/Throughput.
Some applications allow you to alter their IO size, while some applications do not. For example, SQL Server
determines the optimal IO size itself, and does not provide users with any knobs to change it. On the other hand,
Oracle provides a parameter called DB_BLOCK_SIZE using which you can configure the I/O request size of the
database.
If you are using an application, which does not allow you to change the IO size, use the guidelines in this article to
optimize the performance KPI that is most relevant to your application. For example,
An OLTP application generates millions of small and random IO requests. To handle these types of IO requests,
you must design your application infrastructure to get higher IOPS.
A data warehousing application generates large and sequential IO requests. To handle these types of IO
requests, you must design your application infrastructure to get higher Bandwidth or Throughput.
If you are using an application, which allows you to change the IO size, use this rule of thumb for the IO size in
addition to other performance guidelines,
Smaller IO size to get higher IOPS. For example, 8 KB for an OLTP application.
Larger IO size to get higher Bandwidth/Throughput. For example, 1024 KB for a data warehouse application.
Here is an example on how you can calculate the IOPS and Throughput/Bandwidth for your application. Consider
an application using a P30 disk. The maximum IOPS and Throughput/Bandwidth a P30 disk can achieve is 5000
IOPS and 200 MB per second respectively. Now, if your application requires the maximum IOPS from the P30
disk and you use a smaller IO size like 8 KB, the resulting Bandwidth you will be able to get is 40 MB per second.
However, if your application requires the maximum Throughput/Bandwidth from P30 disk, and you use a larger
IO size like 1024 KB, the resulting IOPS will be less, 200 IOPS. Therefore, tune the IO size such that it meets both
your application's IOPS and Throughput/Bandwidth requirement. The following table summarizes the different IO
sizes and their corresponding IOPS and Throughput for a P30 disk.
NOTE
As you increase either IOPS or Throughput the other also increases, make sure you do not hit throughput or IOPS limits of
the disk or VM when increasing either one.
To witness the effects of IO size on application performance, you can run benchmarking tools on your VM and
disks. Create multiple test runs and use different IO size for each run to see the impact. Refer to the Benchmarking
article, linked at the end, for more details.
BANDWIDTH
VM DISK MAX. DATA CACHE IO
VM SIZE CPU CORES MEMORY SIZES DISKS CACHE SIZE IOPS LIMITS
To view a complete list of all available Azure VM sizes, refer to Windows VM sizes or Linux VM sizes. Choose a
VM size that can meet and scale to your desired application performance requirements. In addition to this, take
into account following important considerations when choosing VM sizes.
Scale Limits
The maximum IOPS limits per VM and per disk are different and independent of each other. Make sure that the
application is driving IOPS within the limits of the VM as well as the premium disks attached to it. Otherwise,
application performance will experience throttling.
As an example, suppose an application requirement is a maximum of 4,000 IOPS. To achieve this, you provision a
P30 disk on a DS1 VM. The P30 disk can deliver up to 5,000 IOPS. However, the DS1 VM is limited to 3,200
IOPS. Consequently, the application performance will be constrained by the VM limit at 3,200 IOPS and there will
be degraded performance. To prevent this situation, choose a VM and disk size that will both meet application
requirements.
Cost of Operation
In many cases, it is possible that your overall cost of operation using Premium Storage is lower than using
Standard Storage.
For example, consider an application requiring 16,000 IOPS. To achieve this performance, you will need a
Standard_D14 Azure IaaS VM, which can give a maximum IOPS of 16,000 using 32 standard storage 1 TB disks.
Each 1-TB standard storage disk can achieve a maximum of 500 IOPS. The estimated cost of this VM per month
will be $1,570. The monthly cost of 32 standard storage disks will be $1,638. The estimated total monthly cost will
be $3,208.
However, if you hosted the same application on Premium Storage, you will need a smaller VM size and fewer
premium storage disks, thus reducing the overall cost. A Standard_DS13 VM can meet the 16,000 IOPS
requirement using four P30 disks. The DS13 VM has a maximum IOPS of 25,600 and each P30 disk has a
maximum IOPS of 5,000. Overall, this configuration can achieve 5,000 x 4 = 20,000 IOPS. The estimated cost of
this VM per month will be $1,003. The monthly cost of four P30 premium storage disks will be $544.34. The
estimated total monthly cost will be $1,544.
Table below summarizes the cost breakdown of this scenario for Standard and Premium Storage.
STANDARD PREMIUM
Cost of Disks per month $1,638.40 (32 x 1-TB disks) $544.34 (4 x P30 disks)
Linux Distros
With Azure Premium Storage, you get the same level of Performance for VMs running Windows and Linux. We
support many flavors of Linux distros, and you can see the complete list here. It is important to note that different
distros are better suited for different types of workloads. You will see different levels of performance depending on
the distro your workload is running on. Test the Linux distros with your application and choose the one that works
best.
When running Linux with Premium Storage, check the latest updates about required drivers to ensure high
performance.
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
IOP 120 120 120 120 240 500 1,10 2,30 5,00 7,50 7,50 16,0 18,0 20,0
S 0 0 0 0 0 00 00 00
per
disk
Thr 25 25 25 25 50 100 125 150 200 250 250 500 750 900
oug MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
hpu /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
t
per
disk
Max 30 30 30 30 30 30 30 30
bur min min min min min min min min
st
dur
atio
n**
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
**Denotes a feature that is currently in preview, see Disk bursting for more information.
How many disks you choose depends on the disk size chosen. You could use a single P50 disk or multiple P10
disks to meet your application requirement. Take into account considerations listed below when making the choice.
Scale Limits (IOPS and Throughput)
The IOPS and Throughput limits of each Premium disk size is different and independent from the VM scale limits.
Make sure that the total IOPS and Throughput from the disks are within scale limits of the chosen VM size.
For example, if an application requirement is a maximum of 250 MB/sec Throughput and you are using a DS4 VM
with a single P30 disk. The DS4 VM can give up to 256 MB/sec Throughput. However, a single P30 disk has
Throughput limit of 200 MB/sec. Consequently, the application will be constrained at 200 MB/sec due to the disk
limit. To overcome this limit, provision more than one data disks to the VM or resize your disks to P40 or P50.
NOTE
Reads served by the cache are not included in the disk IOPS and Throughput, hence not subject to disk limits. Cache has its
separate IOPS and Throughput limit per VM.
For example, initially your reads and writes are 60MB/sec and 40MB/sec respectively. Over time, the cache warms up and
serves more and more of the reads from the cache. Then, you can get higher write Throughput from the disk.
Number of Disks
Determine the number of disks you will need by assessing application requirements. Each VM size also has a limit
on the number of disks that you can attach to the VM. Typically, this is twice the number of cores. Ensure that the
VM size you choose can support the number of disks needed.
Remember, the Premium Storage disks have higher performance capabilities compared to Standard Storage disks.
Therefore, if you are migrating your application from Azure IaaS VM using Standard Storage to Premium Storage,
you will likely need fewer premium disks to achieve the same or higher performance for your application.
Disk caching
High Scale VMs that leverage Azure Premium Storage have a multi-tier caching technology called BlobCache.
BlobCache uses a combination of the Virtual Machine RAM and local SSD for caching. This cache is available for
the Premium Storage persistent disks and the VM local disks. By default, this cache setting is set to Read/Write for
OS disks and ReadOnly for data disks hosted on Premium Storage. With disk caching enabled on the Premium
Storage disks, the high scale VMs can achieve extremely high levels of performance that exceed the underlying
disk performance.
WARNING
Disk Caching is not supported for disks 4 TiB and larger. If multiple disks are attached to your VM, each disk that is smaller
than 4 TiB will support caching.
Changing the cache setting of an Azure disk detaches and re-attaches the target disk. If it is the operating system disk, the
VM is restarted. Stop all applications/services that might be affected by this disruption before changing the disk cache
setting.
To learn more about how BlobCache works, refer to the Inside Azure Premium Storage blog post.
It is important to enable cache on the right set of disks. Whether you should enable disk caching on a premium
disk or not will depend on the workload pattern that disk will be handling. Table below shows the default cache
settings for OS and Data disks.
OS disk ReadWrite
Following are the recommended disk cache settings for data disks,
DISK CACHING SETTING RECOMMENDATION ON WHEN TO USE THIS SETTING
ReadOnly
By configuring ReadOnly caching on Premium Storage data disks, you can achieve low Read latency and get very
high Read IOPS and Throughput for your application. This is due two reasons,
1. Reads performed from cache, which is on the VM memory and local SSD, are much faster than reads from the
data disk, which is on the Azure blob storage.
2. Premium Storage does not count the Reads served from cache, towards the disk IOPS and Throughput.
Therefore, your application is able to achieve higher total IOPS and Throughput.
ReadWrite
By default, the OS disks have ReadWrite caching enabled. We have recently added support for ReadWrite caching
on data disks as well. If you are using ReadWrite caching, you must have a proper way to write the data from cache
to persistent disks. For example, SQL Server handles writing cached data to the persistent storage disks on its own.
Using ReadWrite cache with an application that does not handle persisting the required data can lead to data loss,
if the VM crashes.
None
Currently, None is only supported on data disks. It is not supported on OS disks. If you set None on an OS disk it
will override this internally and set it to ReadOnly.
As an example, you can apply these guidelines to SQL Server running on Premium Storage by doing the
following,
1. Configure "ReadOnly" cache on premium storage disks hosting data files.
a. The fast reads from cache lower the SQL Server query time since data pages are retrieved much faster from
the cache compared to directly from the data disks.
b. Serving reads from cache, means there is additional Throughput available from premium data disks. SQL
Server can use this additional Throughput towards retrieving more data pages and other operations like
backup/restore, batch loads, and index rebuilds.
2. Configure "None" cache on premium storage disks hosting the log files.
a. Log files have primarily write-heavy operations. Therefore, they do not benefit from the ReadOnly cache.
sudo yum remove hypervkvpd ## (Might return an error if not installed. That's OK.)
sudo yum install microsoft-hyper-v
sudo reboot
In some cases the command above will upgrade the kernel as well. If a kernel update is required then you may
need to run the above commands again after rebooting to fully install the microsoft-hyper-v package.
Disk striping
When a high scale VM is attached with several premium storage persistent disks, the disks can be striped together
to aggregate their IOPs, bandwidth, and storage capacity.
On Windows, you can use Storage Spaces to stripe disks together. You must configure one column for each disk in
a pool. Otherwise, the overall performance of striped volume can be lower than expected, due to uneven
distribution of traffic across the disks.
Important: Using Server Manager UI, you can set the total number of columns up to 8 for a striped volume. When
attaching more than eight disks, use PowerShell to create the volume. Using PowerShell, you can set the number
of columns equal to the number of disks. For example, if there are 16 disks in a single stripe set; specify 16
columns in the NumberOfColumns parameter of the New -VirtualDisk PowerShell cmdlet.
On Linux, use the MDADM utility to stripe disks together. For detailed steps on striping disks on Linux refer to
Configure Software RAID on Linux.
Stripe Size
An important configuration in disk striping is the stripe size. The stripe size or block size is the smallest chunk of
data that application can address on a striped volume. The stripe size you configure depends on the type of
application and its request pattern. If you choose the wrong stripe size, it could lead to IO misalignment, which
leads to degraded performance of your application.
For example, if an IO request generated by your application is bigger than the disk stripe size, the storage system
writes it across stripe unit boundaries on more than one disk. When it is time to access that data, it will have to
seek across more than one stripe units to complete the request. The cumulative effect of such behavior can lead to
substantial performance degradation. On the other hand, if the IO request size is smaller than stripe size, and if it is
random in nature, the IO requests may add up on the same disk causing a bottleneck and ultimately degrading the
IO performance.
Depending on the type of workload your application is running, choose an appropriate stripe size. For random
small IO requests, use a smaller stripe size. Whereas for large sequential IO requests use a larger stripe size. Find
out the stripe size recommendations for the application you will be running on Premium Storage. For SQL Server,
configure stripe size of 64 KB for OLTP workloads and 256 KB for data warehousing workloads. See Performance
best practices for SQL Server on Azure VMs to learn more.
NOTE
You can stripe together a maximum of 32 premium storage disks on a DS series VM and 64 premium storage disks on a GS
series VM.
Multi-threading
Azure has designed Premium Storage platform to be massively parallel. Therefore, a multi-threaded application
achieves much higher performance than a single-threaded application. A multi-threaded application splits up its
tasks across multiple threads and increases efficiency of its execution by utilizing the VM and disk resources to the
maximum.
For example, if your application is running on a single core VM using two threads, the CPU can switch between the
two threads to achieve efficiency. While one thread is waiting on a disk IO to complete, the CPU can switch to the
other thread. In this way, two threads can accomplish more than a single thread would. If the VM has more than
one core, it further decreases running time since each core can execute tasks in parallel.
You may not be able to change the way an off-the-shelf application implements single threading or multi-
threading. For example, SQL Server is capable of handling multi-CPU and multi-core. However, SQL Server
decides under what conditions it will leverage one or more threads to process a query. It can run queries and build
indexes using multi-threading. For a query that involves joining large tables and sorting data before returning to
the user, SQL Server will likely use multiple threads. However, a user cannot control whether SQL Server executes
a query using a single thread or multiple threads.
There are configuration settings that you can alter to influence this multi-threading or parallel processing of an
application. For example, in case of SQL Server it is the maximum Degree of Parallelism configuration. This setting
called MAXDOP, allows you to configure the maximum number of processors SQL Server can use when parallel
processing. You can configure MAXDOP for individual queries or index operations. This is beneficial when you
want to balance resources of your system for a performance critical application.
For example, say your application using SQL Server is executing a large query and an index operation at the same
time. Let us assume that you wanted the index operation to be more performant compared to the large query. In
such a case, you can set MAXDOP value of the index operation to be higher than the MAXDOP value for the
query. This way, SQL Server has more number of processors that it can leverage for the index operation compared
to the number of processors it can dedicate to the large query. Remember, you do not control the number of
threads SQL Server will use for each operation. You can control the maximum number of processors being
dedicated for multi-threading.
Learn more about Degrees of Parallelism in SQL Server. Find out such settings that influence multi-threading in
your application and their configurations to optimize performance.
Queue depth
The queue depth or queue length or queue size is the number of pending IO requests in the system. The value of
queue depth determines how many IO operations your application can line up, which the storage disks will be
processing. It affects all the three application performance indicators that we discussed in this article viz., IOPS,
throughput, and latency.
Queue Depth and multi-threading are closely related. The Queue Depth value indicates how much multi-threading
can be achieved by the application. If the Queue Depth is large, application can execute more operations
concurrently, in other words, more multi-threading. If the Queue Depth is small, even though application is multi-
threaded, it will not have enough requests lined up for concurrent execution.
Typically, off the shelf applications do not allow you to change the queue depth, because if set incorrectly it will do
more harm than good. Applications will set the right value of queue depth to get the optimal performance.
However, it is important to understand this concept so that you can troubleshoot performance issues with your
application. You can also observe the effects of queue depth by running benchmarking tools on your system.
Some applications provide settings to influence the Queue Depth. For example, the MAXDOP (maximum degree
of parallelism) setting in SQL Server explained in previous section. MAXDOP is a way to influence Queue Depth
and multi-threading, although it does not directly change the Queue Depth value of SQL Server.
High queue depth
A high queue depth lines up more operations on the disk. The disk knows the next request in its queue ahead of
time. Consequently, the disk can schedule operations ahead of time and process them in an optimal sequence.
Since the application is sending more requests to the disk, the disk can process more parallel IOs. Ultimately, the
application will be able to achieve higher IOPS. Since application is processing more requests, the total
Throughput of the application also increases.
Typically, an application can achieve maximum Throughput with 8-16+ outstanding IOs per attached disk. If a
queue depth is one, application is not pushing enough IOs to the system, and it will process less amount of in a
given period. In other words, less Throughput.
For example, in SQL Server, setting the MAXDOP value for a query to "4" informs SQL Server that it can use up
to four cores to execute the query. SQL Server will determine what is best queue depth value and the number of
cores for the query execution.
Optimal queue depth
Very high queue depth value also has its drawbacks. If queue depth value is too high, the application will try to
drive very high IOPS. Unless application has persistent disks with sufficient provisioned IOPS, this can negatively
affect application latencies. Following formula shows the relationship between IOPS, latency, and queue depth.
You should not configure Queue Depth to any high value, but to an optimal value, which can deliver enough IOPS
for the application without affecting latencies. For example, if the application latency needs to be 1 millisecond, the
Queue Depth required to achieve 5,000 IOPS is, QD = 5000 x 0.001 = 5.
Queue Depth for Striped Volume
For a striped volume, maintain a high enough queue depth such that, every disk has a peak queue depth
individually. For example, consider an application that pushes a queue depth of 2 and there are four disks in the
stripe. The two IO requests will go to two disks and remaining two disks will be idle. Therefore, configure the
queue depth such that all the disks can be busy. Formula below shows how to determine the queue depth of
striped volumes.
Throttling
Azure Premium Storage provisions specified number of IOPS and Throughput depending on the VM sizes and
disk sizes you choose. Anytime your application tries to drive IOPS or Throughput above these limits of what the
VM or disk can handle, Premium Storage will throttle it. This manifests in the form of degraded performance in
your application. This can mean higher latency, lower Throughput, or lower IOPS. If Premium Storage does not
throttle, your application could completely fail by exceeding what its resources are capable of achieving. So, to
avoid performance issues due to throttling, always provision sufficient resources for your application. Take into
consideration what we discussed in the VM sizes and Disk sizes sections above. Benchmarking is the best way to
figure out what resources you will need to host your application.
Next steps
If you are looking to benchmark your disk, see our article on Benchmarking a disk.
Learn more about the available disk types: Select a disk type
For SQL Server users, read articles on Performance Best Practices for SQL Server:
Performance Best Practices for SQL Server in Azure Virtual Machines
Azure Premium Storage provides highest performance for SQL Server in Azure VM
Premium SSD bursting (preview)
12/2/2019 • 4 minutes to read • Edit Online
Disk bursting is currently a preview feature for premium SSDs. Bursting is supported on any premium SSD disk
sizes <= 512 GiB (P20 or below ). These disk sizes support bursting on a best effort basis and utilize a credit system
to manage bursting. Credits accumulate in a burst bucket whenever disk traffic is below the provisioned
performance target for their disk size, and consume credits when traffic bursts beyond the target. Disk traffic is
tracked against both IOPS and bandwidth in the provisioned target.
Disk bursting is enabled by default on new deployments of the disk sizes that support it. Existing disk sizes, if they
support disk bursting, can enable bursting through either of the following methods:
Detach and reattach the disk.
Stop and start the VM.
Burst states
All burst applicable disk sizes will start with a full burst credit bucket when the disk is attached to a Virtual Machine.
The max duration of bursting is determined by the size of the burst credit bucket. You can only accumulate unused
credits up to the size of the credit bucket. At any point of time, your disk burst credit bucket can be in one of the
following three states:
Accruing, when the disk traffic is using less than the provisioned performance target. You can accumulate
credit if disk traffic is beyond IOPS or bandwidth targets or both. You can still accumulate IO credits when
you are consuming full disk bandwidth, vice versa.
Declining, when the disk traffic is using more than the provisioned performance target. The burst traffic will
independently consume credits from IOPS or bandwidth.
Remaining constant, when the disk traffic is exactly at the provisioned performance target.
The disk sizes that provide bursting support along with the burst specifications are summarized in the table below.
Regional availability
Currently, disk bursting is only available in the West Central US region.
Disk sizes
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
IOP 120 120 120 120 240 500 1,10 2,30 5,00 7,50 7,50 16,0 18,0 20,0
S 0 0 0 0 0 00 00 00
per
disk
Thr 25 25 25 25 50 100 125 150 200 250 250 500 750 900
oug MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
hpu /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
t
per
disk
Max 30 30 30 30 30 30 30 30
bur min min min min min min min min
st
dur
atio
n**
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
**Denotes a feature that is currently in preview, see Disk bursting for more information.
Example scenarios
To give you a better idea of how this works, here's a few example scenarios:
One common scenario that can benefit from disk bursting is faster VM boot and application launch on OS
disks. Take a Linux VM with an 8 GiB OS image as an example. If we use a P2 disk as the OS disk, the
provisioned target is 120 IOPS and 25 MBps. When VM starts, there will be a read spike to the OS disk
loading the boot files. With the introduction of bursting, you can read at the max burst speed of 3500 IOPS
and 170 MBps, accelerating the load time by at least 6x. After VM boot, the traffic level on the OS disk is
usually low, since most data operations by the application will be against the attached data disks. If the traffic
is below the provisioned target, you will accumulate credits.
If you are hosting a Remote Virtual Desktop environment, whenever an active user launches an application
like AutoCAD, read traffic to the OS disk significantly increases. In this case, burst traffic will consume
accumulated credits, allowing you to go beyond the provisioned target, and launching the application much
faster.
A P1 disk has a provisioned target of 120 IOPS and 25 MBps. If the actual traffic on the disk was 100 IOPS
and 20 MBps in the past 1 second interval, then the unused 20 IOs and 5 MB are credited to the burst
bucket of the disk. Credits in the burst bucket can later be used when the traffic exceeds the provisioned
target, up to the max burst limit. The max burst limit defines the ceiling of disk traffic even if you have burst
credits to consume from. In this case, even if you have 10,000 IOs in the credit bucket, a P1 disk cannot issue
more than the max burst of 3,500 IO per sec.
Next steps
Attach a managed data disk to a Windows VM by using the Azure portal
Scalability and performance targets for VM disks on
Windows
1/3/2020 • 5 minutes to read • Edit Online
You can attach a number of data disks to an Azure virtual machine. Based on the scalability and performance
targets for a VM's data disks, you can determine the number and type of disk that you need to meet your
performance and capacity requirements.
IMPORTANT
For optimal performance, limit the number of highly utilized disks attached to the virtual machine to avoid possible throttling.
If all attached disks aren't highly utilized at the same time, the virtual machine can support a larger number of disks.
For Standard storage accounts: A Standard storage account has a maximum total request rate of 20,000
IOPS. The total IOPS across all of your virtual machine disks in a Standard storage account should not
exceed this limit.
You can roughly calculate the number of highly utilized disks supported by a single Standard storage
account based on the request rate limit. For example, for a Basic tier VM, the maximum number of highly
utilized disks is about 66, which is 20,000/300 IOPS per disk. The maximum number of highly utilized disks
for a Standard tier VM is about 40, which is 20,000/500 IOPS per disk.
For Premium storage accounts: A Premium storage account has a maximum total throughput rate of 50
Gbps. The total throughput across all of your VM disks should not exceed this limit.
See Windows VM sizes for additional details.
STAND
ARD
DISK
TYPE S4 S6 S10 S15 S20 S30 S40 S50 S60 S70 S80
Disk 32 64 128 256 512 1,024 2,048 4,096 8,192 16,38 32,76
size in 4 7
GiB
IOPS Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to
per 500 500 500 500 500 500 500 500 1,300 2,000 2,000
disk
Throu Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to Up to
ghput 60 60 60 60 60 60 60 60 300 500 500
per MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s MiB/s
disk ec ec ec ec ec ec ec ec ec ec ec
STA
NDA
RD
SSD
SIZE
S E1* E2* E3* E4 E6 E10 E15 E20 E30 E40 E50 E60 E70 E80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
IOP Up Up Up Up Up Up Up Up Up Up Up Up Up Up
S to to to to to to to to to to to to to to
per 120 120 120 120 240 500 500 500 500 500 500 2,00 4,00 6,00
disk 0 0 0
Thr Up Up Up Up Up Up Up Up Up Up Up Up Up Up
oug to to to to to to to to to to to to to to
hpu 25 25 25 25 50 60 60 60 60 60 60 400 600 750
t MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
per /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
disk
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
Premium SSD managed disks: Per-disk limits
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
Disk 4 8 16 32 64 128 256 512 1,02 2,04 4,09 8,19 16,3 32,7
size 4 8 6 2 84 67
in
GiB
PRE
MIU
M
SSD
SIZE
S P1* P2* P3* P4 P6 P10 P15 P20 P30 P40 P50 P60 P70 P80
IOP 120 120 120 120 240 500 1,10 2,30 5,00 7,50 7,50 16,0 18,0 20,0
S 0 0 0 0 0 00 00 00
per
disk
Thr 25 25 25 25 50 100 125 150 200 250 250 500 750 900
oug MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB MiB
hpu /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec /sec
t
per
disk
Max 30 30 30 30 30 30 30 30
bur min min min min min min min min
st
dur
atio
n**
*Denotes a disk size that is currently in preview, for regional availability information see New disk sizes: Managed
and unmanaged.
**Denotes a feature that is currently in preview, see Disk bursting for more information.
Premium SSD managed disks: Per-VM limits
PREMIUM
STORAGE DISK
TYPE P10 P20 P30 P40 P50
Disk size 128 GiB 512 GiB 1,024 GiB (1 TB) 2,048 GiB (2 TB) 4,095 GiB (4 TB)
Maximum 100 MB/sec 150 MB/sec 200 MB/sec 250 MB/sec 250 MB/sec
throughput per
disk
Maximum 280 70 35 17 8
number of disks
per storage
account
See also
Azure subscription and service limits, quotas, and constraints
Backup and disaster recovery for Azure IaaS disks
12/10/2019 • 21 minutes to read • Edit Online
This article explains how to plan for backup and disaster recovery (DR ) of IaaS virtual machines (VMs) and disks in
Azure. This document covers both managed and unmanaged disks.
First, we cover the built-in fault tolerance capabilities in the Azure platform that helps guard against local failures.
We then discuss the disaster scenarios not fully covered by the built-in capabilities. We also show several examples
of workload scenarios where different backup and DR considerations can apply. We then review possible solutions
for the DR of IaaS disks.
Introduction
The Azure platform uses various methods for redundancy and fault tolerance to help protect customers from
localized hardware failures. Local failures can include problems with an Azure Storage server machine that stores
part of the data for a virtual disk or failures of an SSD or HDD on that server. Such isolated hardware component
failures can happen during normal operations.
The Azure platform is designed to be resilient to these failures. Major disasters can result in failures or the
inaccessibility of many storage servers or even a whole datacenter. Although your VMs and disks are normally
protected from localized failures, additional steps are necessary to protect your workload from region-wide
catastrophic failures, such as a major disaster, that can affect your VM and disks.
In addition to the possibility of platform failures, problems with a customer application or data can occur. For
example, a new version of your application might inadvertently make a change to the data that causes it to break.
In that case, you might want to revert the application and the data to a prior version that contains the last known
good state. This requires maintaining regular backups.
For regional disaster recovery, you must back up your IaaS VM disks to a different region.
Before we look at backup and DR options, let’s recap a few methods available for handling localized failures.
Azure IaaS resiliency
Resiliency refers to the tolerance for normal failures that occur in hardware components. Resiliency is the ability to
recover from failures and continue to function. It's not about avoiding failures, but responding to failures in a way
that avoids downtime or data loss. The goal of resiliency is to return the application to a fully functioning state
following a failure. Azure virtual machines and disks are designed to be resilient to common hardware faults. Let's
look at how the Azure IaaS platform provides this resiliency.
A virtual machine consists mainly of two parts: a compute server and the persistent disks. Both affect the fault
tolerance of a virtual machine.
If the Azure compute host server that houses your VM experiences a hardware failure, which is rare, Azure is
designed to automatically restore the VM on another server. If this scenario, your computer reboots, and the VM
comes back up after some time. Azure automatically detects such hardware failures and executes recoveries to help
ensure the customer VM is available as soon as possible.
Regarding IaaS disks, the durability of data is critical for a persistent storage platform. Azure customers have
important business applications running on IaaS, and they depend on the persistence of the data. Azure designs
protection for these IaaS disks, with three redundant copies of the data that is stored locally. These copies provide
for high durability against local failures. If one of the hardware components that holds your disk fails, your VM is
not affected, because there are two additional copies to support disk requests. It works fine, even if two different
hardware components that support a disk fail at the same time (which is rare).
To ensure that you always maintain three replicas, Azure Storage automatically spawns a new copy of the data in
the background if one of the three copies becomes unavailable. Therefore, it should not be necessary to use RAID
with Azure disks for fault tolerance. A simple RAID 0 configuration should be sufficient for striping the disks, if
necessary, to create larger volumes.
Because of this architecture, Azure has consistently delivered enterprise-grade durability for IaaS disks, with an
industry-leading zero percent annualized failure rate.
Localized hardware faults on the compute host or in the Storage platform can sometimes result in of the
temporary unavailability of the VM that is covered by the Azure SLA for VM availability. Azure also provides an
industry-leading SLA for single VM instances that use Azure premium SSDs.
To safeguard application workloads from downtime due to the temporary unavailability of a disk or VM, customers
can use availability sets. Two or more virtual machines in an availability set provide redundancy for the application.
Azure then creates these VMs and disks in separate fault domains with different power, network, and server
components.
Because of these separate fault domains, localized hardware failures typically do not affect multiple VMs in the set
at the same time. Having separate fault domains provides high availability for your application. It's considered a
good practice to use availability sets when high availability is required. The next section covers the disaster
recovery aspect.
Backup and disaster recovery
Disaster recovery is the ability to recover from rare, but major, incidents. These incidents include non-transient,
wide-scale failures, such as service disruption that affects an entire region. Disaster recovery includes data backup
and archiving, and might include manual intervention, such as restoring a database from a backup.
The Azure platform’s built-in protection against localized failures might not fully protect the VMs/disks if a major
disaster causes large-scale outages. These large-scale outages include catastrophic events, such as if a datacenter is
hit by a hurricane, earthquake, fire, or if there is a large-scale hardware unit failure. In addition, you might
encounter failures due to application or data issues.
To help protect your IaaS workloads from outages, you should plan for redundancy and have backups to enable
recovery. For disaster recovery, you should back up in a different geographic location away from the primary site.
This approach helps ensure your backup is not affected by the same event that originally affected the VM or disks.
For more information, see Disaster recovery for Azure applications.
Your DR considerations might include the following aspects:
High availability: The ability of the application to continue running in a healthy state, without significant
downtime. By healthy state, this state means that the application is responsive, and users can connect to the
application and interact with it. Certain mission-critical applications and databases might be required to
always be available, even when there are failures in the platform. For these workloads, you might need to
plan redundancy for the application, as well as the data.
Data durability: In some cases, the main consideration is ensuring that the data is preserved if a disaster
happens. Therefore, you might need a backup of your data in a different site. For such workloads, you might
not need full redundancy for the application, but only a regular backup of the disks.
Unmanaged locally redundant storage Local (locally redundant storage) Azure Backup
disks
High availability is best met by using managed disks in an availability set along with Azure Backup. If you use
unmanaged disks, you can still use Azure Backup for DR. If you are unable to use Azure Backup, then taking
consistent snapshots, as described in a later section, is an alternative solution for backup and DR.
Your choices for high availability, backup, and DR at application or infrastructure levels can be represented as
follows:
NOTE
Only having the disks in a geo-redundant storage or read-access geo-redundant storage account does not protect the VM
from disasters. You must also create coordinated snapshots or use Azure Backup. This is required to recover a VM to a
consistent state.
If you use locally redundant storage, you must copy the snapshots to a different storage account immediately after
creating the snapshot. The copy target might be a locally redundant storage account in a different region, resulting
in the copy being in a remote region. You can also copy the snapshot to a read-access geo-redundant storage
account in the same region. In this case, the snapshot is lazily replicated to the remote secondary region. Your
backup is protected from disasters at the primary site after the copying and replication is complete.
To copy your incremental snapshots for DR efficiently, review the instructions in Back up Azure unmanaged VM
disks with incremental snapshots.
Other options
SQL Server
SQL Server running in a VM has its own built-in capabilities to back up your SQL Server database to Azure Blob
storage or a file share. If the storage account is geo-redundant storage or read-access geo-redundant storage, you
can access those backups in the storage account’s secondary datacenter in the event of a disaster, with the same
restrictions as previously discussed. For more information, see Back up and restore for SQL Server in Azure virtual
machines. In addition to back up and restore, SQL Server AlwaysOn availability groups can maintain secondary
replicas of databases. This ability greatly reduces the disaster recovery time.
Other considerations
This article has discussed how to back up or take snapshots of your VMs and their disks to support disaster
recovery and how to use those backups or snapshots to recover your data. With the Azure Resource Manager
model, many people use templates to create their VMs and other infrastructures in Azure. You can use a template
to create a VM that has the same configuration every time. If you use custom images for creating your VMs, you
must also make sure that your images are protected by using a read-access geo-redundant storage account to
store them.
Consequently, your backup process can be a combination of two things:
Back up the data (disks).
Back up the configuration (templates and custom images).
Depending on the backup option you choose, you might have to handle the backup of both the data and the
configuration, or the backup service might handle all of that for you.
NOTE
Microsoft controls whether a failover occurs. Failover is not controlled per storage account, so it's not decided by individual
customers. To implement disaster recovery for specific storage accounts or virtual machine disks, you must use the
techniques described previously in this article.
Azure shared disks
2/19/2020 • 4 minutes to read • Edit Online
Azure shared disks (preview ) is a new feature for Azure managed disks that enables attaching an Azure managed
disk to multiple virtual machines (VMs) simultaneously. Attaching a managed disk to multiple VMs allows you to
either deploy new or migrate existing clustered applications to Azure.
How it works
VMs in the cluster can read or write to your attached disk based on the reservation chosen by the clustered
application using SCSI Persistent Reservations (SCSI PR ). SCSI PR is a well-known industry standard leveraged
by applications running on Storage Area Network (SAN ) on-premises. Enabling SCSI PR on a managed disk
allows you to migrate these applications to Azure as-is.
Managed disks with shared disks enabled offer shared block storage that can be accessed by multiple VMs, this is
exposed as logical unit numbers (LUNs). LUNs are then presented to an initiator (VM ) from a target (disk). These
LUNs look like direct-attached-storage (DAS ) or a local drive to the VM.
Managed disks with shared disks enabled do not natively offer a fully-managed file system that can be accessed
using SMB/NFS. You will need to use a cluster manager, like Windows Server Failover Cluster (WSFC ) or
Pacemaker, that handles cluster node communication as well as write locking.
Limitations
While in preview, managed disks that have shared disks enabled are subject to the following limitations:
Currently only available with premium SSDs.
Currently only supported in the West Central US region.
All virtual machines sharing a disk must be deployed in the same proximity placement groups.
Can only be enabled on data disks, not OS disks.
Only basic disks can be used with some versions of Windows Server Failover Cluster, for details see Failover
clustering hardware requirements and storage options.
ReadOnly host caching is not available for premium SSDs with maxShares>1 .
Availability sets and virtual machine scale sets can only be used with FaultDomainCount set to 1.
Azure Backup and Azure Site Recovery support is not yet available.
If you're interested in trying shared disks then sign up for our preview.
Disk sizes
For now, only premium SSDs can enable shared disks. The disk sizes that support this feature are P15 and greater.
Different disk sizes may have a different maxShares limit, which you cannot exceed when setting the maxShares
value.
For each disk, you can define a maxShares value that represents the maximum number of nodes that can
simultaneously share the disk. For example, if you plan to set up a 2-node failover cluster, you would set
maxShares=2 . The maximum value is an upper bound. Nodes can join or leave the cluster (mount or unmount the
disk) as long as the number of nodes is lower than the specified maxShares value.
NOTE
The maxShares value can only be set or edited when the disk is detached from all nodes.
The following table illustrates the allowed maximum values for maxShares by disk size:
P15, P20 2
The IOPS and bandwidth limits for a disk are not affected by the maxShares value. For example, the max IOPS of a
P15 disk are 1100 whether maxShares = 1 or maxShares > 1.
Sample workloads
Windows
Most Windows-based clustering build on WSFC, which handles all core infrastructure for cluster node
communication, allowing your applications to take advantage of parallel access patterns. WSFC enables both CSV
and non-CSV -based options depending on your version of Windows Server. For details, refer to Create a failover
cluster.
Some popular applications running on WSFC include:
SQL Server Failover Cluster Instances (FCI)
Scale-out File Server (SoFS )
File Server for General Use (IW workload)
Remote Desktop Server User Profile Disk (RDS UPD )
SAP ASCS/SCS
Linux
Linux clusters can leverage cluster managers such as Pacemaker. Pacemaker builds on Corosync, enabling cluster
communications for applications deployed in highly available environments. Some common clustered filesystems
include ocfs2 and gfs2. You can manipulate reservations and registrations using utilities such as fence_scsi and
sg_persist.
Next steps
If you're interested in enabling and using shared disks for your managed disks, proceed to our article Enable
shared disk.
Ephemeral OS disks for Azure VMs
11/13/2019 • 6 minutes to read • Edit Online
Ephemeral OS disks are created on the local virtual machine (VM ) storage and not saved to the remote Azure
Storage. Ephemeral OS disks work well for stateless workloads, where applications are tolerant of individual VM
failures, but are more affected by VM deployment time or reimaging the individual VM instances. With Ephemeral
OS disk, you get lower read/write latency to the OS disk and faster VM reimage.
The key features of ephemeral disks are:
Ideal for stateless applications.
They can be used with both Marketplace and custom images.
Ability to fast reset or reimage VMs and scale set instances to the original boot state.
Lower latency, similar to a temporary disk.
Ephemeral OS disks are free, you incur no storage cost for OS disk.
They are available in all Azure regions.
Ephemeral OS Disk is supported by Shared Image Gallery.
Key differences between persistent and ephemeral OS disks:
Size limit for OS disk 2 TiB Cache size for the VM size or
2TiB, whichever is smaller.
For the cache size in GiB,
see DS, ES, M, FS, and GS
Stop-deallocated state VMs and scale set instances VMs and scale set instances
can be stop-deallocated and cannot be stop-deallocated
restarted from the stop-
deallocated state
Size requirements
You can deploy VM and instance images up to the size of the VM cache. For example, Standard Windows Server
images from the marketplace are about 127 GiB, which means that you need a VM size that has a cache larger than
127 GiB. In this case, the Standard_DS2_v2 has a cache size of 86 GiB, which is not large enough. The
Standard_DS3_v2 has a cache size of 172 GiB, which is large enough. In this case, the Standard_DS3_v2 is the
smallest size in the DSv2 series that you can use with this image. Basic Linux images in the Marketplace and
Windows Server images that are denoted by [smallsize] tend to be around 30 GiB and can use most of the
available VM sizes.
Ephemeral disks also require that the VM size supports Premium storage. The sizes usually (but not always) have
an s in the name, like DSv2 and EsV3. For more information, see Azure VM sizes for details around which sizes
support Premium storage.
PowerShell
To use an ephemeral disk for a PowerShell VM deployment, use Set-AzVMOSDisk in your VM configuration. Set
the -DiffDiskSetting to Local and -Caching to ReadOnly .
For scale set deployments, use the Set-AzVmssStorageProfile cmdlet in your configuration. Set the
-DiffDiskSetting to Local and -Caching to ReadOnly .
CLI
To use an ephemeral disk for a CLI VM deployment, set the --ephemeral-os-disk parameter in az vm create to
true and the --os-disk-caching parameter to ReadOnly .
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image UbuntuLTS \
--ephemeral-os-disk true \
--os-disk-caching ReadOnly \
--admin-username azureuser \
--generate-ssh-keys
For scale sets, you use the same --ephemeral-os-disk true parameter for az-vmss-create and set the
--os-disk-caching parameter to ReadOnly .
Portal
In the Azure portal, you can choose to use ephemeral disks when deploying a VM by opening the Advanced
section of the Disks tab. For Use ephemeral OS disk select Yes.
If the option for using an ephemeral disk is greyed out, you might have selected a VM size that does not have a
cache size larger than the OS image or that doesn't support Premium storage. Go back to the Basics page and try
choosing another VM size.
You can also create scale-sets with ephemeral OS disks using the portal. Just make sure you select a VM size with a
large enough cache size and then in Use ephemeral OS disk select Yes.
VM template deployment
You can deploy a VM with an ephemeral OS disk using a template. The process to create a VM that uses
ephemeral OS disks is to add the diffDiskSettings property to the Microsoft.Compute/virtualMachines resource
type in the template. Also, the caching policy must be set to ReadOnly for the ephemeral OS disk.
{
"type": "Microsoft.Compute/virtualMachines",
"name": "myVirtualMachine",
"location": "East US 2",
"apiVersion": "2018-06-01",
"properties": {
"storageProfile": {
"osDisk": {
"diffDiskSettings": {
"option": "Local"
},
"caching": "ReadOnly",
"createOption": "FromImage"
},
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2016-Datacenter-smalldisk",
"version": "latest"
},
"hardwareProfile": {
"vmSize": "Standard_DS2_v2"
}
},
"osProfile": {
"computerNamePrefix": "myvirtualmachine",
"adminUsername": "azureuser",
"adminPassword": "P@ssw0rd!"
}
}
}
POST https://management.azure.com/subscriptions/{sub-
id}/resourceGroups/{rgName}/providers/Microsoft.Compute/VirtualMachines/{vmName}/reimage?a pi-version=2018-06-
01"
Next steps
You can create a VM with an ephemeral OS disk using Azure PowerShell.
Virtual networks and virtual machines in Azure
11/13/2019 • 13 minutes to read • Edit Online
When you create an Azure virtual machine (VM ), you must create a virtual network (VNet) or use an existing VNet.
You also need to decide how your VMs are intended to be accessed on the VNet. It is important to plan before
creating resources and make sure that you understand the limits of networking resources.
In the following figure, VMs are represented as web servers and database servers. Each set of VMs are assigned to
separate subnets in the VNet.
You can create a VNet before you create a VM or you can as you create a VM. You create these resources to
support communication with a VM:
Network interfaces
IP addresses
Virtual network and subnets
In addition to those basic resources, you should also consider these optional resources:
Network security groups
Load balancers
Network interfaces
A network interface (NIC ) is the interconnection between a VM and a virtual network (VNet). A VM must have at
least one NIC, but can have more than one, depending on the size of the VM you create. Learn about how many
NICs each VM size supports for Windows or Linux.
You can create a VM with multiple NICs, and add or remove NICs through the lifecycle of a VM. Multiple NICs
allow a VM to connect to different subnets and send or receive traffic over the most appropriate interface. VMs
with any number of network interfaces can exist in the same availability set, up to the number supported by the
VM size.
Each NIC attached to a VM must exist in the same location and subscription as the VM. Each NIC must be
connected to a VNet that exists in the same Azure location and subscription as the NIC. You can change the subnet
a VM is connected to after it's created, but you cannot change the VNet. Each NIC attached to a VM is assigned a
MAC address that doesn’t change until the VM is deleted.
This table lists the methods that you can use to create a network interface.
METHOD DESCRIPTION
Azure CLI To provide the identifier of the public IP address that you
previously created, use az network nic create with the --
public-ip-address parameter.
IP addresses
You can assign these types of IP addresses to a NIC in Azure:
Public IP addresses - Used to communicate inbound and outbound (without network address translation
(NAT)) with the Internet and other Azure resources not connected to a VNet. Assigning a public IP address to a
NIC is optional. Public IP addresses have a nominal charge, and there's a maximum number that can be used
per subscription.
Private IP addresses - Used for communication within a VNet, your on-premises network, and the Internet
(with NAT). You must assign at least one private IP address to a VM. To learn more about NAT in Azure, read
Understanding outbound connections in Azure.
You can assign public IP addresses to VMs or internet-facing load balancers. You can assign private IP addresses to
VMs and internal load balancers. You assign IP addresses to a VM using a network interface.
There are two methods in which an IP address is allocated to a resource - dynamic or static. The default allocation
method is dynamic, where an IP address is not allocated when it's created. Instead, the IP address is allocated when
you create a VM or start a stopped VM. The IP address is released when you stop or delete the VM.
To ensure the IP address for the VM remains the same, you can set the allocation method explicitly to static. In this
case, an IP address is assigned immediately. It is released only when you delete the VM or change its allocation
method to dynamic.
This table lists the methods that you can use to create an IP address.
METHOD DESCRIPTION
Azure portal By default, public IP addresses are dynamic and the address
associated to them may change when the VM is stopped or
deleted. To guarantee that the VM always uses the same
public IP address, create a static public IP address. By default,
the portal assigns a dynamic private IP address to a NIC when
creating a VM. You can change this IP address to static after
the VM is created.
Azure CLI You use az network public-ip create with the --allocation-
method parameter as Dynamic or Static.
After you create a public IP address, you can associate it with a VM by assigning it to a NIC.
Azure portal If you let Azure create a VNet when you create a VM, the
name is a combination of the resource group name that
contains the VNet and -vnet. The address space is
10.0.0.0/24, the required subnet name is default, and the
subnet address range is 10.0.0.0/24.
Azure CLI The subnet and the VNet are created at the same time.
Provide a --subnet-name parameter to az network vnet
create with the subnet name.
METHOD DESCRIPTION
Azure CLI Use az network nsg create to initially create the NSG. Use az
network nsg rule create to add rules to the NSG. Use az
network vnet subnet update to add the NSG to the subnet.
Load balancers
Azure Load Balancer delivers high availability and network performance to your applications. A load balancer can
be configured to balance incoming Internet traffic to VMs or balance traffic between VMs in a VNet. A load
balancer can also balance traffic between on-premises computers and VMs in a cross-premises network, or
forward external traffic to a specific VM.
The load balancer maps incoming and outgoing traffic between the public IP address and port on the load balancer
and the private IP address and port of the VM.
When you create a load balancer, you must also consider these configuration elements:
Front-end IP configuration – A load balancer can include one or more front-end IP addresses, otherwise
known as virtual IPs (VIPs). These IP addresses serve as ingress for the traffic.
Back-end address pool – IP addresses that are associated with the NIC to which load is distributed.
NAT rules - Defines how inbound traffic flows through the front-end IP and distributed to the back-end IP.
Load balancer rules - Maps a given front-end IP and port combination to a set of back-end IP addresses and
port combination. A single load balancer can have multiple load balancing rules. Each rule is a combination of a
front-end IP and port and back-end IP and port associated with VMs.
Probes - Monitors the health of VMs. When a probe fails to respond, the load balancer stops sending new
connections to the unhealthy VM. The existing connections are not affected, and new connections are sent to
healthy VMs.
This table lists the methods that you can use to create an internet-facing load balancer.
METHOD DESCRIPTION
Azure portal You can load balance internet traffic to VMs using the Azure
portal.
Azure PowerShell To provide the identifier of the public IP address that you
previously created, use New-AzLoadBalancerFrontendIpConfig
with the -PublicIpAddress parameter. Use New-
AzLoadBalancerBackendAddressPoolConfig to create the
configuration of the back-end address pool. Use New-
AzLoadBalancerInboundNatRuleConfig to create inbound NAT
rules associated with the front-end IP configuration that you
created. Use New-AzLoadBalancerProbeConfig to create the
probes that you need. Use New-AzLoadBalancerRuleConfig to
create the load balancer configuration. Use New-
AzLoadBalancer to create the load balancer.
METHOD DESCRIPTION
Azure CLI Use az network lb create to create the initial load balancer
configuration. Use az network lb frontend-ip create to add the
public IP address that you previously created. Use az network
lb address-pool create to add the configuration of the back-
end address pool. Use az network lb inbound-nat-rule create
to add NAT rules. Use az network lb rule create to add the
load balancer rules. Use az network lb probe create to add the
probes.
Template Use 2 VMs in a Load Balancer and configure NAT rules on the
LB as a guide for deploying a load balancer using a template.
This table lists the methods that you can use to create an internal load balancer.
METHOD DESCRIPTION
Azure portal You can balance internal traffic load with a Basic load balancer
in the Azure portal.
Azure CLI Use the az network lb create command to create the initial
load balancer configuration. To define the private IP address,
use az network lb frontend-ip create with the --private-ip-
address parameter. Use az network lb address-pool create to
add the configuration of the back-end address pool. Use az
network lb inbound-nat-rule create to add NAT rules. Use az
network lb rule create to add the load balancer rules. Use az
network lb probe create to add the probes.
Template Use 2 VMs in a Load Balancer and configure NAT rules on the
LB as a guide for deploying a load balancer using a template.
VMs
VMs can be created in the same VNet and they can connect to each other using private IP addresses. They can
connect even if they are in different subnets without the need to configure a gateway or use public IP addresses. To
put VMs into a VNet, you create the VNet and then as you create each VM, you assign it to the VNet and subnet.
VMs acquire their network settings during deployment or startup.
VMs are assigned an IP address when they are deployed. If you deploy multiple VMs into a VNet or subnet, they
are assigned IP addresses as they boot up. You can also allocate a static IP to a VM. If you allocate a static IP, you
should consider using a specific subnet to avoid accidentally reusing a static IP for another VM.
If you create a VM and later want to migrate it into a VNet, it is not a simple configuration change. You must
redeploy the VM into the VNet. The easiest way to redeploy is to delete the VM, but not any disks attached to it,
and then re-create the VM using the original disks in the VNet.
This table lists the methods that you can use to create a VM in a VNet.
METHOD DESCRIPTION
Azure portal Uses the default network settings that were previously
mentioned to create a VM with a single NIC. To create a VM
with multiple NICs, you must use a different method.
Azure CLI Create and connect a VM to a Vnet, subnet, and NIC that
build as individual steps.
Next steps
For VM -specific steps on how to manage Azure virtual networks for VMs, see the Windows or Linux tutorials.
There are also tutorials on how to load balance VMs and create highly available applications for Windows or Linux.
Learn how to configure user-defined routes and IP forwarding.
Learn how to configure VNet to VNet connections.
Learn how to Troubleshoot routes.
Learn more about Virtual machine network bandwidth.
What are virtual machine scale sets?
1/19/2020 • 4 minutes to read • Edit Online
Azure virtual machine scale sets let you create and manage a group of identical, load balanced VMs. The number of
VM instances can automatically increase or decrease in response to demand or a defined schedule. Scale sets
provide high availability to your applications, and allow you to centrally manage, configure, and update a large
number of VMs. With virtual machine scale sets, you can build large-scale services for areas such as compute, big
data, and container workloads.
Add additional VM instances Manual process to create, configure, Automatically create from central
and ensure compliance configuration
Traffic balancing and distribution Manual process to create and configure Can automatically create and integrate
Azure load balancer or Application with Azure load balancer or Application
Gateway Gateway
High availability and redundancy Manually create Availability Set or Automatic distribution of VM instances
distribute and track VMs across across Availability Zones or Availability
Availability Zones Sets
Scaling of VMs Manual monitoring and Azure Autoscale based on host metrics, in-
Automation guest metrics, Application Insights, or
schedule
There is no additional cost to scale sets. You only pay for the underlying compute resources such as the VM
instances, load balancer, or Managed Disk storage. The management and automation features, such as autoscale
and redundancy, incur no additional charges over the use of VMs.
Next steps
To get started, create your first virtual machine scale set in the Azure portal.
Create a scale set in the Azure portal
Use infrastructure automation tools with virtual
machines in Azure
11/13/2019 • 6 minutes to read • Edit Online
To create and manage Azure virtual machines (VMs) in a consistent manner at scale, some form of automation is
typically desired. There are many tools and solutions that allow you to automate the complete Azure infrastructure
deployment and management lifecycle. This article introduces some of the infrastructure automation tools that you
can use in Azure. These tools commonly fit in to one of the following approaches:
Automate the configuration of VMs
Tools include Ansible, Chef, and Puppet.
Tools specific to VM customization include cloud-init for Linux VMs, PowerShell Desired State
Configuration (DSC ), and the Azure Custom Script Extension for all Azure VMs.
Automate infrastructure management
Tools include Packer to automate custom VM image builds, and Terraform to automate the infrastructure
build process.
Azure Automation can perform actions across your Azure and on-premises infrastructure.
Automate application deployment and delivery
Examples include Azure DevOps Services and Jenkins.
Ansible
Ansible is an automation engine for configuration management, VM creation, or application deployment. Ansible
uses an agent-less model, typically with SSH keys, to authenticate and manage target machines. Configuration
tasks are defined in playbooks, with a number of Ansible modules available to carry out specific tasks. For more
information, see How Ansible works.
Learn how to:
Install and configure Ansible on Linux for use with Azure.
Create a Linux virtual machine.
Manage a Linux virtual machine.
Chef
Chef is an automation platform that helps define how your infrastructure is configured, deployed, and managed.
Additional components included Chef Habitat for application lifecycle automation rather than the infrastructure,
and Chef InSpec that helps automate compliance with security and policy requirements. Chef Clients are installed
on target machines, with one or more central Chef Servers that store and manage the configurations. For more
information, see An Overview of Chef.
Learn how to:
Deploy Chef Automate from the Azure Marketplace.
Install Chef on Windows and create Azure VMs.
Puppet
Puppet is an enterprise-ready automation platform that handles the application delivery and deployment process.
Agents are installed on target machines to allow Puppet Master to run manifests that define the desired
configuration of the Azure infrastructure and VMs. Puppet can integrate with other solutions such as Jenkins and
GitHub for an improved devops workflow. For more information, see How Puppet works.
Learn how to:
Deploy Puppet from the Azure Marketplace.
Cloud-init
Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. You can use cloud-init to
install packages and write files, or to configure users and security. Because cloud-init is called during the initial boot
process, there are no additional steps or required agents to apply your configuration. For more information on how
to properly format your #cloud-config files, see the cloud-init documentation site. #cloud-config files are text files
encoded in base64.
Cloud-init also works across distributions. For example, you don't use apt-get install or yum install to install a
package. Instead you can define a list of packages to install. Cloud-init automatically uses the native package
management tool for the distro you select.
We are actively working with our endorsed Linux distro partners in order to have cloud-init enabled images
available in the Azure marketplace. These images make your cloud-init deployments and configurations work
seamlessly with VMs and virtual machine scale sets. Learn more details about cloud-init on Azure:
Cloud-init support for Linux virtual machines in Azure
Try a tutorial on automated VM configuration using cloud-init.
PowerShell DSC
PowerShell Desired State Configuration (DSC ) is a management platform to define the configuration of target
machines. DSC can also be used on Linux through the Open Management Infrastructure (OMI) server.
DSC configurations define what to install on a machine and how to configure the host. A Local Configuration
Manager (LCM ) engine runs on each target node that processes requested actions based on pushed configurations.
A pull server is a web service that runs on a central host to store the DSC configurations and associated resources.
The pull server communicates with the LCM engine on each target host to provide the required configurations and
report on compliance.
Learn how to:
Create a basic DSC configuration.
Configure a DSC pull server.
Use DSC for Linux.
Packer
Packer automates the build process when you create a custom VM image in Azure. You use Packer to define the
OS and run post-configuration scripts that customize the VM for your specific needs. Once configured, the VM is
then captured as a Managed Disk image. Packer automates the process to create the source VM, network and
storage resources, run configuration scripts, and then create the VM image.
Learn how to:
Use Packer to create a Linux VM image in Azure.
Use Packer to create a Windows VM image in Azure.
Terraform
Terraform is an automation tool that allows you to define and create an entire Azure infrastructure with a single
template format language - the HashiCorp Configuration Language (HCL ). With Terraform, you define templates
that automate the process to create network, storage, and VM resources for a given application solution. You can
use your existing Terraform templates for other platforms with Azure to ensure consistency and simplify the
infrastructure deployment without needing to convert to an Azure Resource Manager template.
Learn how to:
Install and configure Terraform with Azure.
Create an Azure infrastructure with Terraform.
Azure Automation
Azure Automation uses runbooks to process a set of tasks on the VMs you target. Azure Automation is used to
manage existing VMs rather than to create an infrastructure. Azure Automation can run across both Linux and
Windows VMs, as well as on-premises virtual or physical machines with a hybrid runbook worker. Runbooks can
be stored in a source control repository, such as GitHub. These runbooks can then run manually or on a defined
schedule.
Azure Automation also provides a Desired State Configuration (DSC ) service that allows you to create definitions
for how a given set of VMs should be configured. DSC then ensures that the required configuration is applied and
the VM stays consistent. Azure Automation DSC runs on both Windows and Linux machines.
Learn how to:
Create a PowerShell runbook.
Use Hybrid Runbook Worker to manage on-premises resources.
Use Azure Automation DSC.
Next steps
There are many different options to use infrastructure automation tools in Azure. You have the freedom to use the
solution that best fits your needs and environment. To get started and try some of the tools built-in to Azure, see
how to automate the customization of a Linux or Windows VM.
Secure and use policies on virtual machines in Azure
11/13/2019 • 4 minutes to read • Edit Online
It’s important to keep your virtual machine (VM ) secure for the applications that you run. Securing your VMs can
include one or more Azure services and features that cover secure access to your VMs and secure storage of your
data. This article provides information that enables you to keep your VM and applications secure.
Antimalware
The modern threat landscape for cloud environments is dynamic, increasing the pressure to maintain effective
protection in order to meet compliance and security requirements. Microsoft Antimalware for Azure is a free real-
time protection capability that helps identify and remove viruses, spyware, and other malicious software. Alerts can
be configured to notify you when known malicious or unwanted software attempts to install itself or run on your
VM. It is not supported on VMs running Linux or Windows Server 2008.
Encryption
For enhanced Windows VM and Linux VM security and compliance, virtual disks in Azure can be encrypted.
Virtual disks on Windows VMs are encrypted at rest using BitLocker. Virtual disks on Linux VMs are encrypted at
rest using dm-crypt.
There is no charge for encrypting virtual disks in Azure. Cryptographic keys are stored in Azure Key Vault using
software-protection, or you can import or generate your keys in Hardware Security Modules (HSMs) certified to
FIPS 140-2 level 2 standards. These cryptographic keys are used to encrypt and decrypt virtual disks attached to
your VM. You retain control of these cryptographic keys and can audit their use. An Azure Active Directory service
principal provides a secure mechanism for issuing these cryptographic keys as VMs are powered on and off.
Policies
Azure policies can be used to define the desired behavior for your organization's Windows VMs and Linux VMs. By
using policies, an organization can enforce various conventions and rules throughout the enterprise. Enforcement
of the desired behavior can help mitigate risk while contributing to the success of the organization.
Next steps
Walk through the steps to monitor virtual machine security by using Azure Security Center for Linux or
Windows.
Azure Disk Encryption for Windows VMs
10/16/2019 • 4 minutes to read • Edit Online
Azure Disk Encryption helps protect and safeguard your data to meet your organizational security and
compliance commitments. It uses the Bitlocker feature of Windows to provide volume encryption for the OS and
data disks of Azure virtual machines (VMs), and is integrated with Azure Key Vault to help you control and
manage the disk encryption keys and secrets.
If you use Azure Security Center, you're alerted if you have VMs that aren't encrypted. The alerts show as High
Severity and the recommendation is to encrypt these VMs.
WARNING
If you have previously used Azure Disk Encryption with Azure AD to encrypt a VM, you must continue use this option
to encrypt your VM. See Azure Disk Encryption with Azure AD (previous release) for details.
Certain recommendations might increase data, network, or compute resource usage, resulting in additional license or
subscription costs. You must have a valid active Azure subscription to create resources in Azure in the supported
regions.
You can learn the fundamentals of Azure Disk Encryption for Windows in just a few minutes with the Create and
encrypt a Windows VM with Azure CLI quickstart or the Create and encrypt a Windows VM with Azure
Powershell quickstart.
Networking requirements
To enable Azure Disk Encryption, the VMs must meet the following network endpoint configuration
requirements:
To get a token to connect to your key vault, the Windows VM must be able to connect to an Azure Active
Directory endpoint, [login.microsoftonline.com].
To write the encryption keys to your key vault, the Windows VM must be able to connect to the key vault
endpoint.
The Windows VM must be able to connect to an Azure storage endpoint that hosts the Azure extension
repository and an Azure storage account that hosts the VHD files.
If your security policy limits access from Azure VMs to the Internet, you can resolve the preceding URI and
configure a specific rule to allow outbound connectivity to the IPs. For more information, see Azure Key Vault
behind a firewall.
Terminology
The following table defines some of the common terms used in Azure disk encryption documentation:
TERMINOLOGY DEFINITION
TERMINOLOGY DEFINITION
Azure Key Vault Key Vault is a cryptographic, key management service that's
based on Federal Information Processing Standards (FIPS)
validated hardware security modules. These standards help to
safeguard your cryptographic keys and sensitive secrets. For
more information, see the Azure Key Vault documentation
and Creating and configuring a key vault for Azure Disk
Encryption.
Azure CLI The Azure CLI is optimized for managing and administering
Azure resources from the command line.
Key encryption key (KEK) The asymmetric key (RSA 2048) that you can use to protect
or wrap the secret. You can provide a hardware security
module (HSM)-protected key or software-protected key. For
more information, see the Azure Key Vault documentation
and Creating and configuring a key vault for Azure Disk
Encryption.
Next steps
Quickstart - Create and encrypt a Windows VM with Azure CLI
Quickstart - Create and encrypt a Windows VM with Azure Powershell
Azure Disk Encryption scenarios on Windows VMs
Azure Disk Encryption prerequisites CLI script
Azure Disk Encryption prerequisites PowerShell script
Creating and configuring a key vault for Azure Disk Encryption
Security controls for Windows Virtual Machines
2/12/2020 • 2 minutes to read • Edit Online
This article documents the security controls built into Windows Virtual Machines.
A security control is a quality or feature of an Azure service that contributes to the service's ability to prevent,
detect, and respond to security vulnerabilities.
For each control, we use "Yes" or "No" to indicate whether it is currently in place for the service, "N/A" for a control
that is not applicable to the service. We might also provide a note or links to more information about an attribute.
Network
SECURITY CONTROL YES/NO NOTES
Azure monitoring support (Log Yes Monitor and update a Windows virtual
analytics, App insights, etc.) machine in Azure.
Identity
SECURITY CONTROL YES/NO NOTES
Authentication Yes
Authorization Yes
Data protection
SECURITY CONTROL YES/NO NOTES
Configuration management
SECURITY CONTROL YES/NO NOTES
Next steps
Learn more about the built-in security controls across Azure services.
Virtual machines lifecycle and states
11/13/2019 • 3 minutes to read • Edit Online
Azure Virtual Machines (VMs) go through different states that can be categorized into provisioning and power
states. The purpose of this article is to describe these states and specifically highlight when customers are billed for
instance usage.
Power states
The power state represents the last known state of the VM.
The following table provides a description of each instance state and indicates whether it is billed for instance usage or
not.
STATE DESCRIPTION INSTANCE USAGE BILLING
*Some Azure resources, such as Disks and Networking, incur charges. Software licenses on the instance do not
incur charges.
Provisioning states
A provisioning state is the status of a user-initiated, control-plane operation on the VM. These states are separate
from the power state of a VM.
Create – VM creation.
Update – updates the model for an existing VM. Some non-model changes to VM such as Start/Restart
also fall under update.
Delete – VM deletion.
Deallocate – is where a VM is stopped and removed from the host. Deallocating a VM is considered an
update, so it will display provisioning states related to updating.
Here are the transitional operation states after the platform has accepted a user-initiated action:
States Description
Creating "statuses": [
{
"code": "ProvisioningState/creating",
"level": "Info",
"displayStatus": "Creating"
}
Updating "statuses": [
{
"code": "ProvisioningState/updating",
"level": "Info",
"displayStatus": "Updating"
}
]
Deleting "statuses": [
{
"code": "ProvisioningState/deleting",
"level": "Info",
"displayStatus": "Deleting"
}
]
OS provisioning states If a VM is created with an OS image and not with a specialized image, then following
substates can be observed:
1. OSProvisioningInprogress – The VM is running, and installation of guest OS is
in progress.
"statuses": [
{
"code": "ProvisioningState/creating/OSProvisioningInprogress",
"level": "Info",
"displayStatus": "OS Provisioning In progress"
}
]
Once the operation is complete, the VM will transition into one of the following states:
Succeeded – the user-initiated actions have completed.
"statuses": [
{
"code": "ProvisioningState/succeeded",
"level": "Info",
"displayStatus": "Provisioning succeeded",
"time": "time"
}
]
Failed – represents a failed operation. Refer to the error codes to get more information and possible
solutions.
"statuses": [
{
"code": "ProvisioningState/failed/InternalOperationError",
"level": "Error",
"displayStatus": "Provisioning failed",
"message": "Operation abandoned due to internal error. Please try again later.",
"time": "time"
}
]
VM instance view
The instance view API provides VM running-state information. For more information, see the Virtual Machines -
Instance View API documentation.
Azure Resources explorer provides a simple UI for viewing the VM running state: Resource Explorer.
Provisioning states are visible on VM properties and instance view. Power states are available in instance view of
VM.
Next steps
To learn more about monitoring your VM, see How to monitor virtual machines in Azure.
How to monitor virtual machines in Azure
11/13/2019 • 5 minutes to read • Edit Online
With the significant growth of VMs hosted in Azure, it's important to identify performance and health issues that
impact applications and infrastructure services they support. Basic monitoring is delivered by default with Azure by
the metric types CPU usage, disk utilization, memory utilization, and network traffic collected by the host
hypervisor. Additional metric and log data can be collected using extensions to configure diagnostics on your VMs
from the guest operating system.
To detect and help diagnose performance and health issues with the guest operating system, .NET based or Java
web application components running inside the VM, Azure Monitor delivers centralized monitoring with
comprehensive features such as Azure Monitor for VMs and Application Insights.
Alerts
You can create alerts based on specific performance metrics. Examples of the issues you can be alerted about
include when average CPU usage exceeds a certain threshold, or available free disk space drops below a certain
amount. Alerts can be configured in the Azure portal, using Azure Resource Manager templates, or Azure CLI.
Advanced monitoring
For visibility of the application or service supported by the Azure VM and virtual machine scale sets, identification
of issues with the guest OS or workload running in the VM to understand if it is impacting availability or
performance of the application, or is an issue with the application, enable both Azure Monitor for VMs and
Application Insights.
Azure Monitor for VMs monitors your Azure virtual machines (VM ) at scale by analyzing the performance and
health of your Windows and Linux VMs, including the different processes and interconnected dependencies on
other resources and external processes it discovers. It includes several trend performance charts to help during
investigation of problems and assess capacity of your VMs. The dependency map shows monitored and
unmonitored machines, failed and active network connections between processes and these machines, and shows
trend charts with standard network connection metrics. Combined with Application Insights, you monitor your
application and capture telemetry such as HTTP requests, exceptions, etc. so you can correlate issues between the
VMs and your application. Configure Azure Monitor alerts to alert you on important conditions detected from
monitoring data collected by Azure Monitor for VMs.
Next steps
Walk through the steps in Monitor a Windows Virtual Machine with Azure PowerShell or Monitor a Linux
Virtual Machine with the Azure CLI.
Learn more about the best practices around Monitoring and diagnostics.
Backup and restore options for virtual machines in
Azure
11/13/2019 • 2 minutes to read • Edit Online
You can protect your data by taking backups at regular intervals. There are several backup options available for
VMs, depending on your use-case.
Azure Backup
For backing up Azure VMs running production workloads, use Azure Backup. Azure Backup supports application-
consistent backups for both Windows and Linux VMs. Azure Backup creates recovery points that are stored in geo-
redundant recovery vaults. When you restore from a recovery point, you can restore the whole VM or just specific
files.
For a simple, hands-on introduction to Azure Backup for Azure VMs, see the "Back up Azure virtual machines"
tutorial for Linux or Windows.
For more information on how Azure Backup works, see Plan your VM backup infrastructure in Azure
Managed snapshots
In development and test environments, snapshots provide a quick and simple option for backing up VMs that use
Managed Disks. A managed snapshot is a read-only full copy of a managed disk. Snapshots exist independent of
the source disk and can be used to create new managed disks for rebuilding a VM. They are billed based on the
used portion of the disk. For example, if you create a snapshot of a managed disk with provisioned capacity of 64
GB and actual used data size of 10 GB, snapshot will be billed only for the used data size of 10 GB.
For more information on creating snapshots, see:
Create copy of VHD stored as a Managed Disk using Snapshots in Windows
Create copy of VHD stored as a Managed Disk using Snapshots in Linux
Next steps
You can try out Azure Backup by following the "Back up Windows virtual machines tutorial" for Linux or Windows.
Example Azure infrastructure walkthrough for
Windows VMs
11/13/2019 • 3 minutes to read • Edit Online
This article walks through building out an example application infrastructure. We detail designing an infrastructure
for a simple online store that brings together all the guidelines and decisions around naming conventions,
availability sets, virtual networks and load balancers, and actually deploying your virtual machines (VMs).
Example workload
Adventure Works Cycles wants to build an online store application in Azure that consists of:
Two IIS servers running the client front-end in a web tier
Two IIS servers processing data and orders in an application tier
Two Microsoft SQL Server instances with AlwaysOn availability groups (two SQL Servers and a majority node
witness) for storing product data and orders in a database tier
Two Active Directory domain controllers for customer accounts and suppliers in an authentication tier
All the servers are located in two subnets:
a front-end subnet for the web servers
a back-end subnet for the application servers, SQL cluster, and domain controllers
Incoming secure web traffic must be load-balanced among the web servers as customers browse the online store.
Order processing traffic in the form of HTTP requests from the web servers must be balanced among the
application servers. Additionally, the infrastructure must be designed for high availability.
The resulting design must incorporate:
An Azure subscription and account
A single resource group
Azure Managed Disks
A virtual network with two subnets
Availability sets for the VMs with a similar role
Virtual machines
All the above follow these naming conventions:
Adventure Works Cycles uses [IT workload]-[location]-[Azure resource] as a prefix
For this example, "azos" (Azure Online Store) is the IT workload name and "use" (East US 2) is the
location
Virtual networks use AZOS -USE -VN**[number]**
Availability sets use azos-use-as-[role]
Virtual machine names use azos-use-vm-[vmname]
Storage
Adventure Works Cycles determined that they should use Azure Managed Disks. When creating VMs, both
available storage tiers are used:
Standard storage for the web servers, application servers, and domain controllers and their data disks.
Premium storage for the SQL Server VMs and their data disks.
Availability sets
To maintain high availability of all four tiers of their online store, Adventure Works Cycles decided on four
availability sets:
azos-use-as-web for the web servers
azos-use-as-app for the application servers
azos-use-as-sql for the SQL Servers
azos-use-as-dc for the domain controllers
Virtual machines
Adventure Works Cycles decided on the following names for their Azure VMs:
azos-use-vm -web01 for the first web server
azos-use-vm -web02 for the second web server
azos-use-vm -app01 for the first application server
azos-use-vm -app02 for the second application server
azos-use-vm -sql01 for the first SQL Server server in the cluster
azos-use-vm -sql02 for the second SQL Server server in the cluster
azos-use-vm -dc01 for the first domain controller
azos-use-vm -dc02 for the second domain controller
Here is the resulting configuration.
This article guides you through how to create an Azure dedicated host to host your virtual machines (VMs).
Make sure that you have installed Azure PowerShell version 2.8.0 or later, and you are signed in to an Azure
account in with Connect-AzAccount .
Limitations
Virtual machine scale sets are not currently supported on dedicated hosts.
The following VM series are supported: DSv3, ESv3, and Fsv2.
$rgName = "myDHResourceGroup"
$location = "East US"
Create a host
Now let's create a dedicated host in the host group. In addition to a name for the host, you are required to provide
the SKU for the host. Host SKU captures the supported VM series as well as the hardware generation for your
dedicated host.
For more information about the host SKUs and pricing, see Azure Dedicated Host pricing.
If you set a fault domain count for your host group, you will be asked to specify the fault domain for your host. In
this example, we set the fault domain for the host to 1.
$dHost = New-AzHost `
-HostGroupName $hostGroup.Name `
-Location $location -Name myHost `
-ResourceGroupName $rgName `
-Sku DSv3-Type1 `
-AutoReplaceOnFailure 1 `
-PlatformFaultDomain 1
Create a VM
Create a virtual machine on the dedicated host.
If you specified an availability zone when creating your host group, you are required to use the same zone when
creating the virtual machine. For this example, because our host group is in zone 1, we need to create the VM in
zone 1.
$cred = Get-Credential
New-AzVM `
-Credential $cred `
-ResourceGroupName $rgName `
-Location $location `
-Name myVM `
-HostId $dhost.Id `
-Image Win2016Datacenter `
-Zone 1 `
-Size Standard_D4s_v3
WARNING
If you create a virtual machine on a host which does not have enough resources, the virtual machine will be created in a
FAILED state.
Get-AzHost `
-ResourceGroupName $rgName `
-Name myHost `
-HostGroupName $hostGroup.Name `
-InstanceView
Clean up
You are being charged for your dedicated hosts even when no virtual machines are deployed. You should delete
any hosts you are currently not using to save costs.
You can only delete a host when there are no any longer virtual machines using it. Delete the VMs using Remove-
AzVM.
Remove-AzVM -ResourceGroupName $rgName -Name myVM
After deleting the VMs, you can delete the host using Remove-AzHost.
Once you have deleted all of your hosts, you may delete the host group using Remove-AzHostGroup.
You can also delete the entire resource group in a single command using Remove-AzResourceGroup. This will
delete all resources created in the group, including all of the VMs, hosts and host groups.
Next steps
There is sample template, found here, that uses both zones and fault domains for maximum resiliency in a
region.
You can also deploy dedicated hosts using the Azure portal.
Deploy VMs to dedicated hosts using the portal
1/9/2020 • 3 minutes to read • Edit Online
This article guides you through how to create an Azure dedicated host to host your virtual machines (VMs).
Limitations
Virtual machine scale sets are not currently supported on dedicated hosts.
The initial release supports the following VM series: DSv3, ESv3, FSv2, LSv2, and MSv2.
12. Once you see the Validation passed message, select Create to create the host group.
It should only take a few moments to create the host group.
9. Once you see the Validation passed message, select Create to create the host.
Create a VM
1. Choose Create a resource in the upper left-hand corner of the Azure portal.
2. In the New page, under Popular, select Windows Server 2016 Datacenter.
3. In the Basics tab, under Project details, make sure the correct subscription is selected and then select
myDedicatedHostsRG as the Resource group.
4. Under Instance details, type myVM for the Virtual machine name and choose East US for your Location.
5. In Availability options select Availability zone, select 1 from the drop-down.
6. For the size, select Change size. In the list of available sizes, choose one from the Esv3 series, like Standard
E2s v3. You may need to clear the filter in order to see all of the available sizes.
7. Under Administrator account, provide a username, such as azureuser and a password. The password must
be at least 12 characters long and meet the defined complexity requirements.
8. Under Inbound port rules, choose Allow selected ports and then select RDP (3389) from the drop-down.
9. At the top of the page, select the Advanced tab and in the Host section, select myHostGroup for Host group
and myHost for the Host.
10. Leave the remaining defaults and then select the Review + create button at the bottom of the page.
11. When you see the message that validation has passed, select Create.
Next steps
For more information, see the Dedicated hosts overview.
There is sample template, found here, that uses both zones and fault domains for maximum resiliency in a
region.
You can also deploy a dedicated host using Azure PowerShell.
Preview: Deploy Spot VMs using the Azure portal
2/12/2020 • 2 minutes to read • Edit Online
Using Spot VMs allows you to take advantage of our unused capacity at a significant cost savings. At any point in
time when Azure needs the capacity back, the Azure infrastructure will evict Spot VMs. Therefore, Spot VMs are
great for workloads that can handle interruptions like batch processing jobs, dev/test environments, large compute
workloads, and more.
Pricing for Spot VMs is variable, based on region and SKU. For more information, see VM pricing for Linux and
Windows. For more information about setting the max price, see Spot VMs - Pricing.
You have option to set a max price you are willing to pay, per hour, for the VM. The max price for a Spot VM can be
set in US dollars (USD ), using up to 5 decimal places. For example, the value 0.05701 would be a max price of
$0.05701 USD per hour. If you set the max price to be -1 , the VM won't be evicted based on price. The price for
the VM will be the current price for spot or the price for a standard VM, which ever is less, as long as there is
capacity and quota available.
IMPORTANT
Spot instances are currently in public preview. This preview version is not recommended for production workloads. Certain
features might not be supported or might have constrained capabilities. For more information, see Supplemental Terms of
Use for Microsoft Azure Previews.
Create the VM
The process to create a VM that uses Spot VMs is the same as detailed in the quickstart. When you are deploying a
VM, you can choose to use an Azure spot instance.
On the Basics tab, in the Instance details section, No is the default for using an Azure spot instance.
It you select Yes, the section expands and you can choose your eviction type and eviction policy.
Next steps
You can also create Spot VMs using PowerShell.
Preview: Deploy Spot VMs using Azure PowerShell
2/12/2020 • 2 minutes to read • Edit Online
Using Spot VMs allows you to take advantage of our unused capacity at a significant cost savings. At any point in
time when Azure needs the capacity back, the Azure infrastructure will evict Spot VMs. Therefore, Spot VMs are
great for workloads that can handle interruptions like batch processing jobs, dev/test environments, large compute
workloads, and more.
Pricing for Spot VMs is variable, based on region and SKU. For more information, see VM pricing for Linux and
Windows. For more information about setting the max price, see Spot VMs - Pricing.
You have option to set a max price you are willing to pay, per hour, for the VM. The max price for a Spot VM can be
set in US dollars (USD ), using up to 5 decimal places. For example, the value 0.98765 would be a max price of
$0.98765 USD per hour. If you set the max price to be -1 , the VM won't be evicted based on price. The price for
the VM will be the current price for spot or the price for a standard VM, which ever is less, as long as there is
capacity and quota available.
IMPORTANT
Spot instances are currently in public preview. This preview version is not recommended for production workloads. Certain
features might not be supported or might have constrained capabilities. For more information, see Supplemental Terms of
Use for Microsoft Azure Previews.
Create the VM
Create a spotVM using New -AzVmConfig to create the configuration. Include -Priority Spot and set -MaxPrice
to either:
-1 so the VM is not evicted based on price.
a dollar amount, up to 5 digits. For example, -MaxPrice .98765 means that the VM will be deallocated once the
price for a spotVM goes about $.98765 per hour.
This example creates a spotVM that will not be deallocated based on pricing (only when Azure needs the capacity
back).
$resourceGroup = "mySpotRG"
$location = "eastus"
$vmName = "mySpotVM"
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
New-AzResourceGroup -Name $resourceGroup -Location $location
$subnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name mySubnet -AddressPrefix 192.168.1.0/24
$vnet = New-AzVirtualNetwork -ResourceGroupName $resourceGroup `
-Location $location -Name MYvNET -AddressPrefix 192.168.0.0/16 `
-Subnet $subnetConfig
$pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
-Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP -Protocol Tcp `
-Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
-DestinationPortRange 3389 -Access Allow
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup -Location $location `
-Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
$nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $resourceGroup -Location $location `
-SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1 -Priority "Spot" -MaxPrice -1| `
Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version
latest | `
Add-AzVMNetworkInterface -Id $nic.Id
After the VM is created, you can query to see the max price for all of the VMs in the resource group.
Next steps
You can also create a Spot VM using the Azure CLI or a template.
If you encounter an error, see Error codes.
Deploy Spot VMs using a Resource Manager
template
2/12/2020 • 2 minutes to read • Edit Online
Using Spot VMs allows you to take advantage of our unused capacity at a significant cost savings. At any point in
time when Azure needs the capacity back, the Azure infrastructure will evict Spot VMs. Therefore, Spot VMs are
great for workloads that can handle interruptions like batch processing jobs, dev/test environments, large compute
workloads, and more.
Pricing for Spot VMs is variable, based on region and SKU. For more information, see VM pricing for Linux and
Windows.
You have option to set a max price you are willing to pay, per hour, for the VM. The max price for a Spot VM can be
set in US dollars (USD ), using up to 5 decimal places. For example, the value 0.98765 would be a max price of
$0.98765 USD per hour. If you set the max price to be -1 , the VM won't be evicted based on price. The price for
the VM will be the current price for Spot or the price for a standard VM, which ever is less, as long as there is
capacity and quota available. For more information about setting the max price, see Spot VMs - Pricing.
IMPORTANT
Spot instances are currently in public preview. This preview version is not recommended for production workloads. Certain
features might not be supported or might have constrained capabilities. For more information, see Supplemental Terms of
Use for Microsoft Azure Previews.
Use a template
For Spot template deployments, use "apiVersion": "2019-03-01" or later. Add the priority , evictionPolicy and
billingProfile properties to in your template:
"priority": "Spot",
"evictionPolicy": "Deallocate",
"billingProfile": {
"maxPrice": -1
}
Here is a sample template with the added properties for a Spot VM. Replace the resource names with your own
and <password> with a password for the local administrator account on the VM.
{
"$schema": "http://schema.management.azure.com/schemas/2019-03-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
},
"variables": {
"vnetId": "/subscriptions/ec9fcd04-e188-48b9-abfc-
abcd515f1836/resourceGroups/spotVM/providers/Microsoft.Network/virtualNetworks/spotVM",
"subnetName": "default",
"networkInterfaceName": "spotVMNIC",
"publicIpAddressName": "spotVM-ip",
"publicIpAddressType": "Dynamic",
"publicIpAddressSku": "Basic",
"virtualMachineName": "spotVM",
"osDiskType": "Premium_LRS",
"osDiskType": "Premium_LRS",
"virtualMachineSize": "Standard_D2s_v3",
"adminUsername": "azureuser",
"adminPassword": "<password>",
"diagnosticsStorageAccountName": "diagstoragespot2019",
"diagnosticsStorageAccountId": "Microsoft.Storage/storageAccounts/diagstoragespot2019",
"diagnosticsStorageAccountType": "Standard_LRS",
"diagnosticsStorageAccountKind": "Storage",
"subnetRef": "[concat(variables('vnetId'), '/subnets/', variables('subnetName'))]"
},
"resources": [
{
"name": "spotVM",
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2019-03-01",
"location": "eastus",
"dependsOn": [
"[concat('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"subnet": {
"id": "[variables('subnetRef')]"
},
"privateIPAllocationMethod": "Dynamic",
"publicIpAddress": {
"id": "[resourceId(resourceGroup().name,
'Microsoft.Network/publicIpAddresses', variables('publicIpAddressName'))]"
}
}
}
]
}
},
{
"name": "[variables('publicIpAddressName')]",
"type": "Microsoft.Network/publicIpAddresses",
"apiVersion": "2019-02-01",
"location": "eastus",
"properties": {
"publicIpAllocationMethod": "[variables('publicIpAddressType')]"
},
"sku": {
"name": "[variables('publicIpAddressSku')]"
}
},
{
"name": "[variables('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2019-03-01",
"location": "eastus",
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]",
"[concat('Microsoft.Storage/storageAccounts/', variables('diagnosticsStorageAccountName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[variables('virtualMachineSize')]"
},
"storageProfile": {
"osDisk": {
"createOption": "fromImage",
"managedDisk": {
"storageAccountType": "[variables('osDiskType')]"
}
},
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "18.04-LTS",
"version": "latest"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces',
variables('networkInterfaceName'))]"
}
]
},
"osProfile": {
"computerName": "[variables('virtualMachineName')]",
"adminUsername": "[variables('adminUsername')]",
"adminPassword": "[variables('adminPassword')]"
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "[concat('https://', variables('diagnosticsStorageAccountName'),
'.blob.core.windows.net/')]"
}
},
"priority": "Spot",
"evictionPolicy": "Deallocate",
"billingProfile": {
"maxPrice": -1
}
}
},
{
"name": "[variables('diagnosticsStorageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-04-01",
"location": "eastus",
"properties": {},
"kind": "[variables('diagnosticsStorageAccountKind')]",
"sku": {
"name": "[variables('diagnosticsStorageAccountType')]"
}
}
],
"outputs": {
"adminUsername": {
"type": "string",
"value": "[variables('adminUsername')]"
}
}
}
Next steps
You can also create a Spot VM using Azure PowerShell or the Azure CLI.
If you encounter an error, see Error codes.
Preview: Error messages for Spot VMs and scale sets
2/10/2020 • 2 minutes to read • Edit Online
IMPORTANT
Spot VMs and virtual machine scale sets are currently in public preview. This preview version is provided without a service
level agreement, and it's not recommended for production workloads. Certain features might not be supported or might
have constrained capabilities. For more information, see Supplemental Terms of Use for Microsoft Azure Previews.
Here are some possible error codes you could receive when using Spot VMs and scale sets.
SkuNotAvailable The requested tier for resource There is not enough Azure Spot
'<resource>' is currently not available capacity in this location to create your
in location '<location>' for subscription VM or scale set instance.
'<subscriptionID>'. Please try another
tier or deploy to a different location.
EvictionPolicyCanBeSetOnlyOnAzureSp Eviction policy can be set only on Azure This VM is not a Spot VM, so you can't
otVirtualMachines Spot Virtual Machines. set the eviction policy.
AzureSpotVMNotSupportedInAvailabilit Azure Spot Virtual Machine is not You need to choose to either use a
ySet supported in Availability Set. Spot VM or use a VM in an availability
set, you can't choose both.
AzureSpotFeatureNotEnabledForSubscri Subscription not enabled with Azure You need to have a subscription that
ption Spot feature. supports Spot VMs.
VMPriorityCannotBeApplied The specified priority value '{0}' cannot You need to specify the priority when
be applied to the Virtual Machine '{1}' the VM is created.
since no priority was specified when the
Virtual Machine was created.
SpotPriceGreaterThanProvidedMaxPrice Unable to perform operation '{0}' since Select a higher max price. For more
the provided max price '{1} USD' is information, see pricing information for
lower than the current spot price '{2} Linux or Windows.
USD' for Azure Spot VM size '{3}'.
MaxPriceValueInvalid Invalid max price value. The only Enter a valid max price. For more
supported values for max price are -1 information, see pricing for Linux or
or a decimal greater than zero. Max Windows.
price value of -1 indicates the Azure
Spot virtual machine will not be evicted
for price reasons.
MaxPriceChangeNotAllowedForAllocate Max price change is not allowed when Stop\Deallocate the VM so that you
dVMs the VM '{0}' is currently allocated. can change the max price.
Please deallocate and try again.
MaxPriceChangeNotAllowed Max price change is not allowed. You cannot change the max price for
this VM.
KEY MESSAGE DESCRIPTION
AzureSpotIsNotSupportedForThisAPIVe Azure Spot is not supported for this The API version needs to be 2019-03-
rsion API version. 01.
AzureSpotIsNotSupportedForThisVMSiz Azure Spot is not supported for this Select another VM size. For more
e VM size {0}. information, see Spot Virtual Machines.
MaxPriceIsSupportedOnlyForAzureSpot Max price is supported only for Azure For more information, see Spot Virtual
VirtualMachines Spot Virtual Machines. Machines.
MoveResourcesWithAzureSpotVMNotS The Move resources request contains a You cannot move Spot VMs.
upported Azure Spot virtual machine. This is
currently not supported. Please check
the error details for virtual machine Ids.
MoveResourcesWithAzureSpotVmssNot The Move resources request contains a You cannot move Spot scale set
Supported Azure Spot virtual machine scale set. instances.
This is currently not supported. Please
check the error details for virtual
machine scale set Ids.
EphemeralOSDisksNotSupportedForSpo Ephemeral OS disks are not supported You need to be using a regular OS disk
tVMs for Spot VMs. for your Spot VM.
AzureSpotVMNotSupportedInVmssWit Azure Spot Virtual Machine is not Set the orchestration mode to virtual
hVMOrchestrationMode supported in Virtual Machine Scale Set machine scale set in order to use Spot
with VM Orchestration mode. instances.
An Azure Virtual Machine (VM ) needs several supporting Azure resources. This article covers creating, managing,
and deleting VM resources using C#. You learn how to:
Create a Visual Studio project
Install the package
Create credentials
Create resources
Perform management tasks
Delete resources
Run the application
It takes about 20 minutes to do these steps.
Install-Package Microsoft.Azure.Management.Fluent
Create credentials
Before you start this step, make sure that you have access to an Active Directory service principal. You should also
record the application ID, the authentication key, and the tenant ID that you need in a later step.
Create the authorization file
1. In Solution Explorer, right-click myDotnetProject > Add > New Item, and then select Text File in Visual
C# Items. Name the file azureauth.properties, and then click Add.
2. Add these authorization properties:
subscription=<subscription-id>
client=<application-id>
key=<authentication-key>
tenant=<tenant-id>
managementURI=https://management.core.windows.net/
baseURL=https://management.azure.com/
authURL=https://login.windows.net/
graphURL=https://graph.windows.net/
Replace <subscription-id> with your subscription identifier, <application-id> with the Active Directory
application identifier, <authentication-key> with the application key, and <tenant-id> with the tenant
identifier.
3. Save the azureauth.properties file.
4. Set an environment variable in Windows named AZURE_AUTH_LOCATION with the full path to
authorization file that you created. For example, the following PowerShell command can be used:
using Microsoft.Azure.Management.Compute.Fluent;
using Microsoft.Azure.Management.Compute.Fluent.Models;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;
2. To create the management client, add this code to the Main method:
Create resources
Create the resource group
All resources must be contained in a Resource group.
To specify values for the application and create the resource group, add this code to the Main method:
var groupName = "myResourceGroup";
var vmName = "myVM";
var location = Region.USWest;
NOTE
This tutorial creates a virtual machine running a version of the Windows Server operating system. To learn more about
selecting other images, see Navigate and select Azure virtual machine images with Windows PowerShell and the Azure CLI.
If you want to use an existing disk instead of a marketplace image, use this code:
azure.VirtualMachines.Define("myVM")
.WithRegion(location)
.WithExistingResourceGroup(groupName)
.WithExistingPrimaryNetworkInterface(networkInterface)
.WithSpecializedOSDisk(managedDisk, OperatingSystemTypes.Windows)
.WithExistingAvailabilitySet(availabilitySet)
.WithSize(VirtualMachineSizeTypes.StandardDS1)
.Create();
Stop the VM
You can stop a virtual machine and keep all its settings, but continue to be charged for it, or you can stop a virtual
machine and deallocate it. When a virtual machine is deallocated, all resources associated with it are also
deallocated and billing ends for it.
To stop the virtual machine without deallocating it, add this code to the Main method:
Console.WriteLine("Stopping vm...");
vm.PowerOff();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
If you want to deallocate the virtual machine, change the PowerOff call to this code:
vm.Deallocate();
Start the VM
To start the virtual machine, add this code to the Main method:
Console.WriteLine("Starting vm...");
vm.Start();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Resize the VM
Many aspects of deployment should be considered when deciding on a size for your virtual machine. For more
information, see VM sizes.
To change size of the virtual machine, add this code to the Main method:
Console.WriteLine("Resizing vm...");
vm.Update()
.WithSize(VirtualMachineSizeTypes.StandardDS2)
.Apply();
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
Delete resources
Because you are charged for resources used in Azure, it is always good practice to delete resources that are no
longer needed. If you want to delete the virtual machines and all the supporting resources, all you have to do is
delete the resource group.
To delete the resource group, add this code to the Main method:
azure.ResourceGroups.DeleteByName(groupName);
Next steps
Take advantage of using a template to create a virtual machine by using the information in Deploy an Azure
Virtual Machine using C# and a Resource Manager template.
Learn more about using the Azure libraries for .NET.
Create a VM from a VHD by using the Azure portal
11/13/2019 • 3 minutes to read • Edit Online
Copy a disk
Create a snapshot and then create a disk from the snapshot. This strategy allows you to keep the original VHD as a
fallback:
1. From the Azure portal, on the left menu, select All services.
2. In the All services search box, enter disks and then select Disks to display the list of available disks.
3. Select the disk that you would like to use. The Disk page for that disk appears.
4. From the menu at the top, select Create snapshot.
5. Enter a Name for the snapshot.
6. Choose a Resource group for the snapshot. You can use either an existing resource group or create a new one.
7. For Account type, choose either Standard (HDD ) or Premium (SSD ) storage.
8. When you're done, select Create to create the snapshot.
9. After the snapshot has been created, select Create a resource in the left menu.
10. In the search box, enter managed disk and then select Managed Disks from the list.
11. On the Managed Disks page, select Create.
12. Enter a Name for the disk.
13. Choose a Resource group for the disk. You can use either an existing resource group or create a new one. This
selection will also be used as the resource group where you create the VM from the disk.
14. For Account type, choose either Standard (HDD ) or Premium (SSD ) storage.
15. In Source type, ensure Snapshot is selected.
16. In the Source snapshot drop-down, select the snapshot you want to use.
17. Make any other adjustments as needed and then select Create to create the disk.
Create a VM from a disk
After you have the managed disk VHD that you want to use, you can create the VM in the portal:
1. From the Azure portal, on the left menu, select All services.
2. In the All services search box, enter disks and then select Disks to display the list of available disks.
3. Select the disk that you would like to use. The Disk page for that disk opens.
4. In the Overview page, ensure that DISK STATE is listed as Unattached. If it isn't, you might need to either
detach the disk from the VM or delete the VM to free up the disk.
5. In the menu at the top of the page, select Create VM.
6. On the Basics page for the new VM, enter a Virtual machine name and either select an existing Resource
group or create a new one.
7. For Size, select Change size to access the Size page.
8. Select a VM size row and then choose Select.
9. On the Networking page, you can either let the portal create all new resources or you can select an existing
Virtual network and Network security group. The portal always creates a new network interface and public
IP address for the new VM.
10. On the Management page, make any changes to the monitoring options.
11. On the Guest config page, add any extensions as needed.
12. When you're done, select Review + create.
13. If the VM configuration passes validation, select Create to start the deployment.
Next steps
You can also use PowerShell to upload a VHD to Azure and create a specialized VM.
Create a Windows VM from a specialized disk by
using PowerShell
12/18/2019 • 6 minutes to read • Edit Online
Create a new VM by attaching a specialized managed disk as the OS disk. A specialized disk is a copy of a virtual
hard disk (VHD ) from an existing VM that contains the user accounts, applications, and other state data from your
original VM.
When you use a specialized VHD to create a new VM, the new VM retains the computer name of the original VM.
Other computer-specific information is also kept and, in some cases, this duplicate information could cause issues.
When copying a VM, be aware of what types of computer-specific information your applications rely on.
You have several options:
Use an existing managed disk. This option is useful if you have a VM that isn't working correctly. You can delete
the VM and then reuse the managed disk to create a new VM.
Upload a VHD
Copy an existing Azure VM by using snapshots
You can also use the Azure portal to create a new VM from a specialized VHD.
This article shows you how to use managed disks. If you have a legacy deployment that requires using a storage
account, see Create a VM from a specialized VHD in a storage account.
We recommend that you limit the number of concurrent deployments to 20 VMs from a single VHD or snapshot.
$resourceGroupName = 'myResourceGroup'
$osDiskName = 'myOsDisk'
$osDisk = Get-AzDisk `
-ResourceGroupName $resourceGroupName `
-DiskName $osDiskName
You can now attach this disk as the OS disk to a new VM.
$resourceGroupName = 'myResourceGroup'
$vmName = 'myVM'
$location = 'westus'
$snapshotName = 'mySnapshot'
$snapshotConfig = New-AzSnapshotConfig `
-SourceUri $disk.Id `
-OsType Windows `
-CreateOption Copy `
-Location $location
$snapShot = New-AzSnapshot `
-Snapshot $snapshotConfig `
-SnapshotName $snapshotName `
-ResourceGroupName $resourceGroupName
To use this snapshot to create a VM that needs to be high-performing, add the parameter
-AccountType Premium_LRS to the New -AzSnapshotConfig command. This parameter creates the snapshot so that
it's stored as a Premium Managed Disk. Premium Managed Disks are more expensive than Standard, so be sure
you'll need Premium before using this parameter.
Create a new disk from the snapshot
Create a managed disk from the snapshot by using New -AzDisk. This example uses myOSDisk for the disk name.
Create a new resource group for the new VM.
$destinationResourceGroup = 'myDestinationResourceGroup'
New-AzResourceGroup -Location $location `
-Name $destinationResourceGroup
$osDiskName = 'myOsDisk'
$subnetName = 'mySubNet'
$singleSubnet = New-AzVirtualNetworkSubnetConfig `
-Name $subnetName `
-AddressPrefix 10.0.0.0/24
2. Create the virtual network. This example sets the virtual network name to myVnetName, the location to
West US, and the address prefix for the virtual network to 10.0.0.0/16.
$vnetName = "myVnetName"
$vnet = New-AzVirtualNetwork `
-Name $vnetName -ResourceGroupName $destinationResourceGroup `
-Location $location `
-AddressPrefix 10.0.0.0/16 `
-Subnet $singleSubnet
For more information about endpoints and NSG rules, see Opening ports to a VM in Azure by using PowerShell.
Create a public IP address and NIC
To enable communication with the virtual machine in the virtual network, you'll need a public IP address and a
network interface.
1. Create the public IP. In this example, the public IP address name is set to myIP.
$ipName = "myIP"
$pip = New-AzPublicIpAddress `
-Name $ipName -ResourceGroupName $destinationResourceGroup `
-Location $location `
-AllocationMethod Dynamic
2. Create the NIC. In this example, the NIC name is set to myNicName.
$nicName = "myNicName"
$nic = New-AzNetworkInterface -Name $nicName `
-ResourceGroupName $destinationResourceGroup `
-Location $location -SubnetId $vnet.Subnets[0].Id `
-PublicIpAddressId $pip.Id `
-NetworkSecurityGroupId $nsg.Id
$vmName = "myVM"
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize "Standard_A2"
Complete the VM
Create the VM by using New -AzVM with the configurations that we just created.
New-AzVM -ResourceGroupName $destinationResourceGroup -Location $location -VM $vm
Next steps
Sign in to your new virtual machine. For more information, see How to connect and log on to an Azure virtual
machine running Windows.
Deploy an Azure Virtual Machine using C# and a
Resource Manager template
11/13/2019 • 5 minutes to read • Edit Online
This article shows you how to deploy an Azure Resource Manager template using C#. The template that you create
deploys a single virtual machine running Windows Server in a new virtual network with a single subnet.
For a detailed description of the virtual machine resource, see Virtual machines in an Azure Resource Manager
template. For more information about all the resources in a template, see Azure Resource Manager template
walkthrough.
It takes about 10 minutes to do these steps.
Install-Package Microsoft.Azure.Management.Fluent
Install-Package WindowsAzure.Storage
{
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminUsername": { "type": "string" },
"adminPassword": { "type": "securestring" }
},
"variables": {
"vnetID": "[resourceId('Microsoft.Network/virtualNetworks','myVNet')]",
"subnetRef": "[concat(variables('vnetID'),'/subnets/mySubnet')]",
},
"resources": [
{
"apiVersion": "2016-03-30",
"type": "Microsoft.Network/publicIPAddresses",
"name": "myPublicIPAddress",
"location": "[resourceGroup().location]",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "myresourcegroupdns1"
}
}
},
{
"apiVersion": "2016-03-30",
"type": "Microsoft.Network/virtualNetworks",
"name": "myVNet",
"location": "[resourceGroup().location]",
"properties": {
"addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] },
"subnets": [
{
"name": "mySubnet",
"properties": { "addressPrefix": "10.0.0.0/24" }
}
]
}
},
{
"apiVersion": "2016-03-30",
"type": "Microsoft.Network/networkInterfaces",
"name": "myNic",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses/', 'myPublicIPAddress')]",
"[resourceId('Microsoft.Network/virtualNetworks/', 'myVNet')]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": { "id": "
[resourceId('Microsoft.Network/publicIPAddresses','myPublicIPAddress')]" },
"subnet": { "id": "[variables('subnetRef')]" }
}
}
]
}
},
{
"apiVersion": "2016-04-30-preview",
"type": "Microsoft.Compute/virtualMachines",
"name": "myVM",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.Network/networkInterfaces/', 'myNic')]"
],
"properties": {
"hardwareProfile": { "vmSize": "Standard_DS1" },
"osProfile": {
"computerName": "myVM",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter",
"version": "latest"
},
"osDisk": {
"name": "myManagedOSDisk",
"caching": "ReadWrite",
"createOption": "FromImage"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces','myNic')]"
}
]
}
}
}
]
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
"contentVersion": "1.0.0.0",
"parameters": {
"adminUserName": { "value": "azureuser" },
"adminPassword": { "value": "Azure12345678" }
}
}
Replace <subscription-id> with your subscription identifier, <application-id> with the Active Directory
application identifier, <authentication-key> with the application key, and <tenant-id> with the tenant
identifier.
3. Save the azureauth.properties file.
4. Set an environment variable in Windows named AZURE_AUTH_LOCATION with the full path to
authorization file that you created, for example you can use the following PowerShell command:
using Microsoft.Azure.Management.Compute.Fluent;
using Microsoft.Azure.Management.Compute.Fluent.Models;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
2. To create the management client, add this code to the Main method:
Console.WriteLine("Creating container...");
var container = serviceClient.GetContainerReference("templates");
container.CreateIfNotExistsAsync().Wait();
var containerPermissions = new BlobContainerPermissions()
{ PublicAccess = BlobContainerPublicAccessType.Container };
container.SetPermissionsAsync(containerPermissions).Wait();
azure.ResourceGroups.DeleteByName(groupName);
Next steps
If there were issues with the deployment, a next step would be to look at Troubleshoot common Azure
deployment errors with Azure Resource Manager.
Learn how to deploy a virtual machine and its supporting resources by reviewing Deploy an Azure Virtual
Machine Using C#.
Quickstart - Configure a Windows virtual machine in
Azure using Chef
2/24/2020 • 7 minutes to read • Edit Online
Chef basics
Before you begin with this article, review the basic concepts of Chef.
The following diagram shows the high-level Chef architecture.
Login-AzureRmAccount
Get-AzureRmSubscription
Select-AzureRmSubscription -SubscriptionName "<yourSubscriptionName>"
$myApplication = New-AzureRmADApplication -DisplayName "automation-app" -HomePage "https://chef-automation-
test.com" -IdentifierUris "https://chef-automation-test.com" -Password "#1234p$wdchef19"
New-AzureRmADServicePrincipal -ApplicationId $myApplication.ApplicationId
New-AzureRmRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $myApplication.ApplicationId
Take note of your SubscriptionID, TenantID, ClientID, and Client Secret (the password you set previously in this
tutorial) as you will need these values.
NOTE
If you receive a prompt warning you that your keys will be reset, it’s okay to proceed as we have no existing infrastructure
configured as yet.
This starter kit zip file contains your organization configuration files and user key in the .chef directory.
The organization-validator.pem must be downloaded separately, because it's a private key and private keys should
not be stored on the Chef Server. From Chef Manage, go into the Administration section, and select "Reset
Validation Key", which provides a file for you to download separately. Save the file to c:\chef.
Configuring your Chef workstation
Extract the content of the chef-starter.zip to c:\chef .
Copy all files under chef-starter\chef-repo\.chef to your c:\chef directory.
Copy the organization-validator.pem file to c:\chef , if it's saved in c:\Downloads .
Your directory should now look something like the following example.
Directory: C:\Users\username\chef
You should now have five files and four directories (including the empty chef-repo directory) in the root of c:\chef.
Edit knife.rb
The PEM files contain your organization and administrative private keys for communication and the knife.rb file
contains your knife configuration. We will need to edit the knife.rb file.
Open the knife.rb file in the editor of your choice. The unaltered file should look something like:
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name "mynode"
client_key "#{current_dir}/user.pem"
chef_server_url "https://api.chef.io/organizations/myorg"
cookbook_path ["#{current_dir}/cookbooks"]
Add the following information to your knife.rb, replacing the placeholders with your information:
validation_client_name "myorg-validator"
validation_key "#{current_dir}/myorg.pem"
knife[:azure_tenant_id] = "0000000-1111-aaaa-bbbb-222222222222"
knife[:azure_subscription_id] = "11111111-bbbbb-cccc-1111-222222222222"
knife[:azure_client_id] = "11111111-bbbbb-cccc-1111-2222222222222"
knife[:azure_client_secret] = "#1234p$wdchef19"
These lines will ensure that Knife references the cookbooks directory under c:\chef\cookbooks .
Your knife.rb file should now look similar to the following example:
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name "myorg"
client_key "#{current_dir}/myorg.pem"
validation_client_name "myorg-validator"
validation_key "#{current_dir}/myorg-validator.pem"
chef_server_url "https://api.chef.io/organizations/myorg"
cookbook_path ["#{current_dir}/../cookbooks"]
knife[:azure_tenant_id] = "0000000-1111-aaaa-bbbb-222222222222"
knife[:azure_subscription_id] = "11111111-bbbbb-cccc-1111-222222222222"
knife[:azure_client_id] = "11111111-bbbbb-cccc-1111-2222222222222"
knife[:azure_client_secret] = "#1234p$wdchef19"
NOTE
The order of the path is important! If your opscode paths are not in the correct order, problems will result.
NOTE
The –-pre argument ensures you are receiving the latest RC version of the Knife Azure Plugin which provides access to the
latest set of APIs.
It’s likely that a number of dependencies will also be installed at the same time.
If everything is configured correctly, you will see a list of available Azure images scroll through.
Congratulations. Your workstation is set up!
Creating a cookbook
A cookbook is used by Chef to define a set of commands that you wish to run on your managed client. Creating a
cookbook is straightforward, just use the chef generate cookbook command to generate the cookbook template.
This cookbook is for a web server that automatically deploys IIS.
Under your C:\Chef directory , run the following command.
This command generates a set of files under the directory C:\Chef\cookbooks\webserver. Next, define the set of
commands for the Chef client to run on the managed virtual machine.
The commands are stored in the file default.rb. In this file, define a set of commands that installs IIS, starts IIS, and
copies a template file to the wwwroot folder.
Modify the C:\chef\cookbooks\webserver\recipes\default.rb file and add the following lines.
service 'w3svc' do
action [ :enable, :start ]
end
template 'c:\inetpub\wwwroot\Default.htm' do
source 'Default.htm.erb'
rights :read, 'Everyone'
end
The knife command example creates a Standard_DS2_v2 virtual machine with Windows Server 2016 installed
within the West US region. Modify these values to per your app needs.
After running the command, browse to the Azure portal to see your machine begin to provision.
Don’t forget you can also connect through an RDP session from the Azure portal via port 3389.
Next steps
Chef on Azure
Create and manage Windows VMs in Azure using
Java
12/23/2019 • 7 minutes to read • Edit Online
An Azure Virtual Machine (VM ) needs several supporting Azure resources. This article covers creating, managing,
and deleting VM resources using Java. You learn how to:
Create a Maven project
Add dependencies
Create credentials
Create resources
Perform management tasks
Delete resources
Run the application
It takes about 20 minutes to do these steps.
mkdir java-azure-test
cd java-azure-test
Add dependencies
1. Under the testAzureApp folder, open the pom.xml file and add the build configuration to <project> to
enable the building of your application:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<mainClass>com.fabrikam.testAzureApp.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
2. Add the dependencies that are needed to access the Azure Java SDK.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-mgmt-compute</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-mgmt-resources</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-mgmt-network</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>1.0.6.3</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>
Create credentials
Before you start this step, make sure that you have access to an Active Directory service principal. You should also
record the application ID, the authentication key, and the tenant ID that you need in a later step.
Create the authorization file
1. Create a file named azureauth.properties and add these properties to it:
subscription=<subscription-id>
client=<application-id>
key=<authentication-key>
tenant=<tenant-id>
managementURI=https://management.core.windows.net/
baseURL=https://management.azure.com/
authURL=https://login.windows.net/
graphURL=https://graph.windows.net/
Replace <subscription-id> with your subscription identifier, <application-id> with the Active Directory
application identifier, <authentication-key> with the application key, and <tenant-id> with the tenant
identifier.
2. Save the file.
3. Set an environment variable named AZURE_AUTH_LOCATION in your shell with the full path to the
authentication file.
Create the management client
1. Open the App.java file under src\main\java\com\fabrikam and make sure this package statement is at the
top:
package com.fabrikam.testAzureApp;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.compute.AvailabilitySet;
import com.microsoft.azure.management.compute.AvailabilitySetSkuTypes;
import com.microsoft.azure.management.compute.CachingTypes;
import com.microsoft.azure.management.compute.InstanceViewStatus;
import com.microsoft.azure.management.compute.DiskInstanceView;
import com.microsoft.azure.management.compute.VirtualMachine;
import com.microsoft.azure.management.compute.VirtualMachineSizeTypes;
import com.microsoft.azure.management.network.PublicIPAddress;
import com.microsoft.azure.management.network.Network;
import com.microsoft.azure.management.network.NetworkInterface;
import com.microsoft.azure.management.resources.ResourceGroup;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.model.Creatable;
import com.microsoft.rest.LogLevel;
import java.io.File;
import java.util.Scanner;
3. To create the Active Directory credentials that you need to make requests, add this code to the main method
of the App class:
try {
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));
Azure azure = Azure.configure()
.withLogLevel(LogLevel.BASIC)
.authenticate(credFile)
.withDefaultSubscription();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
Create resources
Create the resource group
All resources must be contained in a Resource group.
To specify values for the application and create the resource group, add this code to the try block in the main
method:
System.out.println("Creating resource group...");
ResourceGroup resourceGroup = azure.resourceGroups()
.define("myResourceGroup")
.withRegion(Region.US_EAST)
.create();
NOTE
This tutorial creates a virtual machine running a version of the Windows Server operating system. To learn more about
selecting other images, see Navigate and select Azure virtual machine images with Windows PowerShell and the Azure CLI.
If you want to use an existing disk instead of a marketplace image, use this code:
azure.virtualMachines.define("myVM")
.withRegion(Region.US_EAST)
.withExistingResourceGroup("myResourceGroup")
.withExistingPrimaryNetworkInterface(networkInterface)
.withSpecializedOSDisk(managedDisk, OperatingSystemTypes.Windows)
.withExistingAvailabilitySet(availabilitySet)
.withSize(VirtualMachineSizeTypes.StandardDS1)
.create();
System.out.println("hardwareProfile");
System.out.println(" vmSize: " + vm.size());
System.out.println("storageProfile");
System.out.println(" imageReference");
System.out.println(" publisher: " + vm.storageProfile().imageReference().publisher());
System.out.println(" offer: " + vm.storageProfile().imageReference().offer());
System.out.println(" sku: " + vm.storageProfile().imageReference().sku());
System.out.println(" version: " + vm.storageProfile().imageReference().version());
System.out.println(" osDisk");
System.out.println(" osType: " + vm.storageProfile().osDisk().osType());
System.out.println(" name: " + vm.storageProfile().osDisk().name());
System.out.println(" createOption: " + vm.storageProfile().osDisk().createOption());
System.out.println(" caching: " + vm.storageProfile().osDisk().caching());
System.out.println("osProfile");
System.out.println(" computerName: " + vm.osProfile().computerName());
System.out.println(" adminUserName: " + vm.osProfile().adminUsername());
System.out.println(" provisionVMAgent: " + vm.osProfile().windowsConfiguration().provisionVMAgent());
System.out.println(" enableAutomaticUpdates: " +
vm.osProfile().windowsConfiguration().enableAutomaticUpdates());
System.out.println("networkProfile");
System.out.println(" networkInterface: " + vm.primaryNetworkInterfaceId());
System.out.println("vmAgent");
System.out.println(" vmAgentVersion: " + vm.instanceView().vmAgent().vmAgentVersion());
System.out.println(" statuses");
for(InstanceViewStatus status : vm.instanceView().vmAgent().statuses()) {
System.out.println(" code: " + status.code());
System.out.println(" displayStatus: " + status.displayStatus());
System.out.println(" message: " + status.message());
System.out.println(" time: " + status.time());
}
System.out.println("disks");
for(DiskInstanceView disk : vm.instanceView().disks()) {
System.out.println(" name: " + disk.name());
System.out.println(" statuses");
for(InstanceViewStatus status : disk.statuses()) {
System.out.println(" code: " + status.code());
System.out.println(" displayStatus: " + status.displayStatus());
System.out.println(" time: " + status.time());
}
}
System.out.println("VM general status");
System.out.println(" provisioningStatus: " + vm.provisioningState());
System.out.println(" id: " + vm.id());
System.out.println(" name: " + vm.name());
System.out.println(" type: " + vm.type());
System.out.println("VM instance status");
for(InstanceViewStatus status : vm.instanceView().statuses()) {
System.out.println(" code: " + status.code());
System.out.println(" displayStatus: " + status.displayStatus());
}
System.out.println("Press enter to continue...");
input.nextLine();
Stop the VM
You can stop a virtual machine and keep all its settings, but continue to be charged for it, or you can stop a virtual
machine and deallocate it. When a virtual machine is deallocated, all resources associated with it are also
deallocated and billing ends for it.
To stop the virtual machine without deallocating it, add this code to the try block in the main method:
System.out.println("Stopping vm...");
vm.powerOff();
System.out.println("Press enter to continue...");
input.nextLine();
If you want to deallocate the virtual machine, change the PowerOff call to this code:
vm.deallocate();
Start the VM
To start the virtual machine, add this code to the try block in the main method:
System.out.println("Starting vm...");
vm.start();
System.out.println("Press enter to continue...");
input.nextLine();
Resize the VM
Many aspects of deployment should be considered when deciding on a size for your virtual machine. For more
information, see VM sizes.
To change size of the virtual machine, add this code to the try block in the main method:
System.out.println("Resizing vm...");
vm.update()
.withSize(VirtualMachineSizeTypes.STANDARD_DS2)
.apply();
System.out.println("Press enter to continue...");
input.nextLine();
Delete resources
Because you are charged for resources used in Azure, it is always good practice to delete resources that are no
longer needed. If you want to delete the virtual machines and all the supporting resources, all you have to do is
delete the resource group.
1. To delete the resource group, add this code to the try block in the main method:
System.out.println("Deleting resources...");
azure.resourceGroups().deleteByName("myResourceGroup");
2. Before you press Enter to start deleting resources, you could take a few minutes to verify the creation of the
resources in the Azure portal. Click the deployment status to see information about the deployment.
Next steps
Learn more about using the Azure libraries for Java.
Create and manage Windows VMs in Azure using
Python
12/23/2019 • 10 minutes to read • Edit Online
An Azure Virtual Machine (VM ) needs several supporting Azure resources. This article covers creating, managing,
and deleting VM resources using Python. You learn how to:
Create a Visual Studio project
Install packages
Create credentials
Create resources
Perform management tasks
Delete resources
Run the application
It takes about 20 minutes to do these steps.
Install packages
1. In Solution Explorer, under myPythonProject, right-click Python Environments, and then select Add virtual
environment.
2. On the Add Virtual Environment screen, accept the default name of env, make sure that Python 3.6 (64 -bit) is
selected for the base interpreter, and then click Create.
3. Right-click the env environment that you created, click Install Python Package, enter azure in the search box,
and then press Enter.
You should see in the output windows that the azure packages were successfully installed.
Create credentials
Before you start this step, make sure that you have an Active Directory service principal. You should also record the
application ID, the authentication key, and the tenant ID that you need in a later step.
1. Open myPythonProject.py file that was created, and then add this code to enable your application to run:
if __name__ == "__main__":
2. To import the code that is needed, add these statements to the top of the .py file:
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.compute import ComputeManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.compute.models import DiskCreateOption
3. Next in the .py file, add variables after the import statements to specify common values used in the code:
SUBSCRIPTION_ID = 'subscription-id'
GROUP_NAME = 'myResourceGroup'
LOCATION = 'westus'
VM_NAME = 'myVM'
def get_credentials():
credentials = ServicePrincipalCredentials(
client_id = 'application-id',
secret = 'authentication-key',
tenant = 'tenant-id'
)
return credentials
Replace application-id, authentication-key, and tenant-id with the values that you previously collected
when you created your Azure Active Directory service principal.
5. To call the function that you previously added, add this code under the if statement at the end of the .py file:
credentials = get_credentials()
Create resources
Initialize management clients
Management clients are needed to create and manage resources using the Python SDK in Azure. To create the
management clients, add this code under the if statement at then end of the .py file:
resource_group_client = ResourceManagementClient(
credentials,
SUBSCRIPTION_ID
)
network_client = NetworkManagementClient(
credentials,
SUBSCRIPTION_ID
)
compute_client = ComputeManagementClient(
credentials,
SUBSCRIPTION_ID
)
def create_resource_group(resource_group_client):
resource_group_params = { 'location':LOCATION }
resource_group_result = resource_group_client.resource_groups.create_or_update(
GROUP_NAME,
resource_group_params
)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
create_resource_group(resource_group_client)
input('Resource group created. Press enter to continue...')
Availability sets make it easier for you to maintain the virtual machines used by your application.
1. To create an availability set, add this function after the variables in the .py file:
def create_availability_set(compute_client):
avset_params = {
'location': LOCATION,
'sku': { 'name': 'Aligned' },
'platform_fault_domain_count': 3
}
availability_set_result = compute_client.availability_sets.create_or_update(
GROUP_NAME,
'myAVSet',
avset_params
)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
create_availability_set(compute_client)
print("------------------------------------------------------")
input('Availability set created. Press enter to continue...')
def create_public_ip_address(network_client):
public_ip_addess_params = {
'location': LOCATION,
'public_ip_allocation_method': 'Dynamic'
}
creation_result = network_client.public_ip_addresses.create_or_update(
GROUP_NAME,
'myIPAddress',
public_ip_addess_params
)
return creation_result.result()
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
creation_result = create_public_ip_address(network_client)
print("------------------------------------------------------")
print(creation_result)
input('Press enter to continue...')
def create_vnet(network_client):
vnet_params = {
'location': LOCATION,
'address_space': {
'address_prefixes': ['10.0.0.0/16']
}
}
creation_result = network_client.virtual_networks.create_or_update(
GROUP_NAME,
'myVNet',
vnet_params
)
return creation_result.result()
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
creation_result = create_vnet(network_client)
print("------------------------------------------------------")
print(creation_result)
input('Press enter to continue...')
3. To add a subnet to the virtual network, add this function after the variables in the .py file:
def create_subnet(network_client):
subnet_params = {
'address_prefix': '10.0.0.0/24'
}
creation_result = network_client.subnets.create_or_update(
GROUP_NAME,
'myVNet',
'mySubnet',
subnet_params
)
return creation_result.result()
4. To call the function that you previously added, add this code under the if statement at the end of the .py file:
creation_result = create_subnet(network_client)
print("------------------------------------------------------")
print(creation_result)
input('Press enter to continue...')
return creation_result.result()
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
creation_result = create_nic(network_client)
print("------------------------------------------------------")
print(creation_result)
input('Press enter to continue...')
Now that you created all the supporting resources, you can create a virtual machine.
1. To create the virtual machine, add this function after the variables in the .py file:
def create_vm(network_client, compute_client):
nic = network_client.network_interfaces.get(
GROUP_NAME,
'myNic'
)
avset = compute_client.availability_sets.get(
GROUP_NAME,
'myAVSet'
)
vm_parameters = {
'location': LOCATION,
'os_profile': {
'computer_name': VM_NAME,
'admin_username': 'azureuser',
'admin_password': 'Azure12345678'
},
'hardware_profile': {
'vm_size': 'Standard_DS1'
},
'storage_profile': {
'image_reference': {
'publisher': 'MicrosoftWindowsServer',
'offer': 'WindowsServer',
'sku': '2012-R2-Datacenter',
'version': 'latest'
}
},
'network_profile': {
'network_interfaces': [{
'id': nic.id
}]
},
'availability_set': {
'id': avset.id
}
}
creation_result = compute_client.virtual_machines.create_or_update(
GROUP_NAME,
VM_NAME,
vm_parameters
)
return creation_result.result()
NOTE
This tutorial creates a virtual machine running a version of the Windows Server operating system. To learn more
about selecting other images, see Navigate and select Azure virtual machine images with Windows PowerShell and
the Azure CLI.
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
def get_vm(compute_client):
vm = compute_client.virtual_machines.get(GROUP_NAME, VM_NAME, expand='instanceView')
print("hardwareProfile")
print(" vmSize: ", vm.hardware_profile.vm_size)
print("\nstorageProfile")
print(" imageReference")
print(" publisher: ", vm.storage_profile.image_reference.publisher)
print(" offer: ", vm.storage_profile.image_reference.offer)
print(" sku: ", vm.storage_profile.image_reference.sku)
print(" version: ", vm.storage_profile.image_reference.version)
print(" osDisk")
print(" osType: ", vm.storage_profile.os_disk.os_type.value)
print(" name: ", vm.storage_profile.os_disk.name)
print(" createOption: ", vm.storage_profile.os_disk.create_option.value)
print(" caching: ", vm.storage_profile.os_disk.caching.value)
print("\nosProfile")
print(" computerName: ", vm.os_profile.computer_name)
print(" adminUsername: ", vm.os_profile.admin_username)
print(" provisionVMAgent: {0}".format(vm.os_profile.windows_configuration.provision_vm_agent))
print(" enableAutomaticUpdates:
{0}".format(vm.os_profile.windows_configuration.enable_automatic_updates))
print("\nnetworkProfile")
for nic in vm.network_profile.network_interfaces:
print(" networkInterface id: ", nic.id)
print("\nvmAgent")
print(" vmAgentVersion", vm.instance_view.vm_agent.vm_agent_version)
print(" statuses")
for stat in vm_result.instance_view.vm_agent.statuses:
print(" code: ", stat.code)
print(" displayStatus: ", stat.display_status)
print(" message: ", stat.message)
print(" time: ", stat.time)
print("\ndisks");
for disk in vm.instance_view.disks:
print(" name: ", disk.name)
print(" statuses")
for stat in disk.statuses:
print(" code: ", stat.code)
print(" displayStatus: ", stat.display_status)
print(" time: ", stat.time)
print("\nVM general status")
print(" provisioningStatus: ", vm.provisioning_state)
print(" id: ", vm.id)
print(" name: ", vm.name)
print(" type: ", vm.type)
print(" location: ", vm.location)
print("\nVM instance status")
for stat in vm.instance_view.statuses:
print(" code: ", stat.code)
print(" displayStatus: ", stat.display_status)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
get_vm(compute_client)
print("------------------------------------------------------")
input('Press enter to continue...')
Stop the VM
You can stop a virtual machine and keep all its settings, but continue to be charged for it, or you can stop a virtual
machine and deallocate it. When a virtual machine is deallocated, all resources associated with it are also
deallocated and billing ends for it.
1. To stop the virtual machine without deallocating it, add this function after the variables in the .py file:
def stop_vm(compute_client):
compute_client.virtual_machines.power_off(GROUP_NAME, VM_NAME)
If you want to deallocate the virtual machine, change the power_off call to this code:
compute_client.virtual_machines.deallocate(GROUP_NAME, VM_NAME)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
stop_vm(compute_client)
input('Press enter to continue...')
Start the VM
1. To start the virtual machine, add this function after the variables in the .py file:
def start_vm(compute_client):
compute_client.virtual_machines.start(GROUP_NAME, VM_NAME)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
start_vm(compute_client)
input('Press enter to continue...')
Resize the VM
Many aspects of deployment should be considered when deciding on a size for your virtual machine. For more
information, see VM sizes.
1. To change the size of the virtual machine, add this function after the variables in the .py file:
def update_vm(compute_client):
vm = compute_client.virtual_machines.get(GROUP_NAME, VM_NAME)
vm.hardware_profile.vm_size = 'Standard_DS3'
update_result = compute_client.virtual_machines.create_or_update(
GROUP_NAME,
VM_NAME,
vm
)
return update_result.result()
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
update_result = update_vm(compute_client)
print("------------------------------------------------------")
print(update_result)
input('Press enter to continue...')
def add_datadisk(compute_client):
disk_creation = compute_client.disks.create_or_update(
GROUP_NAME,
'myDataDisk1',
{
'location': LOCATION,
'disk_size_gb': 1,
'creation_data': {
'create_option': DiskCreateOption.empty
}
}
)
data_disk = disk_creation.result()
vm = compute_client.virtual_machines.get(GROUP_NAME, VM_NAME)
add_result = vm.storage_profile.data_disks.append({
'lun': 1,
'name': 'myDataDisk1',
'create_option': DiskCreateOption.attach,
'managed_disk': {
'id': data_disk.id
}
})
add_result = compute_client.virtual_machines.create_or_update(
GROUP_NAME,
VM_NAME,
vm)
return add_result.result()
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
add_result = add_datadisk(compute_client)
print("------------------------------------------------------")
print(add_result)
input('Press enter to continue...')
Delete resources
Because you are charged for resources used in Azure, it's always a good practice to delete resources that are no
longer needed. If you want to delete the virtual machines and all the supporting resources, all you have to do is
delete the resource group.
1. To delete the resource group and all resources, add this function after the variables in the .py file:
def delete_resources(resource_group_client):
resource_group_client.resource_groups.delete(GROUP_NAME)
2. To call the function that you previously added, add this code under the if statement at the end of the .py file:
delete_resources(resource_group_client)
3. Save myPythonProject.py.
Next steps
If there were issues with the deployment, a next step would be to look at Troubleshooting resource group
deployments with Azure portal
Learn more about the Azure Python Library
Create a Windows virtual machine from a Resource
Manager template
11/13/2019 • 4 minutes to read • Edit Online
Learn how to create a Windows virtual machine by using an Azure Resource Manager template and Azure
PowerShell from the Azure Cloud shell. The template used in this article deploys a single virtual machine running
Windows Server in a new virtual network with a single subnet. For creating a Linux virtual machine, see How to
create a Linux virtual machine with Azure Resource Manager templates.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Password for the Virtual Machine."
}
},
"dnsLabelPrefix": {
"type": "string",
"metadata": {
"description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
}
},
"windowsOSVersion": {
"type": "string",
"defaultValue": "2016-Datacenter",
"allowedValues": [
"2008-R2-SP1",
"2012-Datacenter",
"2012-R2-Datacenter",
"2016-Nano-Server",
"2016-Datacenter-with-Containers",
"2016-Datacenter",
"2019-Datacenter"
],
"metadata": {
"description": "The Windows version for the VM. This will pick a fully patched image of this given
Windows version."
}
},
},
"vmSize": {
"type": "string",
"defaultValue": "Standard_A2_v2",
"metadata": {
"description": "Size of the virtual machine."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for all resources."
}
}
},
"variables": {
"storageAccountName": "[concat(uniquestring(resourceGroup().id), 'sawinvm')]",
"nicName": "myVMNic",
"addressPrefix": "10.0.0.0/16",
"subnetName": "Subnet",
"subnetPrefix": "10.0.0.0/24",
"publicIPAddressName": "myPublicIP",
"vmName": "SimpleWinVM",
"virtualNetworkName": "MyVNET",
"subnetRef": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'),
variables('subnetName'))]",
"networkSecurityGroupName": "default-NSG"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2018-11-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2018-11-01",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('location')]",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
},
{
"comments": "Default Network Security Group for template",
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2019-08-01",
"name": "[variables('networkSecurityGroupName')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": [
{
"name": "default-allow-3389",
"properties": {
"priority": 1000,
"access": "Allow",
"direction": "Inbound",
"destinationPortRange": "3389",
"protocol": "Tcp",
"sourcePortRange": "*",
"sourcePortRange": "*",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*"
}
}
]
}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2018-11-01",
"name": "[variables('virtualNetworkName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
],
"properties": {
"addressSpace": {
"addressPrefixes": [
"[variables('addressPrefix')]"
]
},
"subnets": [
{
"name": "[variables('subnetName')]",
"properties": {
"addressPrefix": "[variables('subnetPrefix')]",
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups',
variables('networkSecurityGroupName'))]"
}
}
}
]
}
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2018-11-01",
"name": "[variables('nicName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
},
"subnet": {
"id": "[variables('subnetRef')]"
}
}
}
]
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2018-10-01",
"name": "[variables('vmName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
"[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
"[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSize')]"
},
"osProfile": {
"computerName": "[variables('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "[parameters('windowsOSVersion')]",
"version": "latest"
},
"osDisk": {
"createOption": "FromImage"
},
"dataDisks": [
{
"diskSizeGB": 1023,
"lun": 0,
"createOption": "Empty"
}
]
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
}
]
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/',
variables('storageAccountName'))).primaryEndpoints.blob]"
}
}
}
}
],
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
}
}
}
To run the PowerShell script, Select Try it to open the Azure Cloud shell. To paste the script, right-click the shell,
and then select Paste:
$resourceGroupName = Read-Host -Prompt "Enter the Resource Group name"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$adminUsername = Read-Host -Prompt "Enter the administrator username"
$adminPassword = Read-Host -Prompt "Enter the administrator password" -AsSecureString
$dnsLabelPrefix = Read-Host -Prompt "Enter an unique DNS name for the public IP"
If you choose to install and use the PowerShell locally instead of from the Azure Cloud shell, this tutorial requires
the Azure PowerShell module. Run Get-Module -ListAvailable Az to find the version. If you need to upgrade, see
Install Azure PowerShell module. If you're running PowerShell locally, you also need to run Connect-AzAccount to
create a connection with Azure.
In the previous example, you specified a template stored in GitHub. You can also download or create a template
and specify the local path with the --template-file parameter.
Here are some additional resources:
To learn how to develop Resource Manager templates, see Azure Resource Manager documentation.
To see the Azure virtual machine schemas, see Azure template reference.
To see more virtual machine template samples, see Azure Quickstart templates.
Next Steps
If there were issues with the deployment, you might take a look at Troubleshoot common Azure deployment
errors with Azure Resource Manager.
Learn how to create and manage a virtual machine in Create and manage Windows VMs with the Azure
PowerShell module.
To learn more about creating templates, view the JSON syntax and properties for the resources types you
deployed:
Microsoft.Network/publicIPAddresses
Microsoft.Network/virtualNetworks
Microsoft.Network/networkInterfaces
Microsoft.Compute/virtualMachines
How to connect and sign on to an Azure virtual
machine running Windows
12/4/2019 • 2 minutes to read • Edit Online
You'll use the Connect button in the Azure portal to start a Remote Desktop (RDP ) session from a Windows
desktop. First you connect to the virtual machine, and then you sign on.
To connect to a Windows VM from a Mac, you will need to install an RDP client for Mac such as Microsoft
Remote Desktop.
6. In the Windows Security window, select More choices and then Use a different account. Enter the
credentials for an account on the virtual machine and then select OK.
Local account: This is usually the local account user name and password that you specified when you
created the virtual machine. In this case, the domain is the name of the virtual machine and it is entered as
vmname\username.
Domain joined VM: If the VM belongs to a domain, enter the user name in the format
Domain\Username. The account also needs to either be in the Administrators group or have been granted
remote access privileges to the VM.
Domain controller: If the VM is a domain controller, enter the user name and password of a domain
administrator account for that domain.
7. Select Yes to verify the identity of the virtual machine and finish logging on.
TIP
If the Connect button in the portal is grayed-out and you are not connected to Azure via an Express Route or Site-
to-Site VPN connection, you will need to create and assign your VM a public IP address before you can use RDP. For
more information, see Public IP addresses in Azure.
This example will immediately launch the RDP connection, taking you through similar prompts as above.
You may also save the RDP file for future use.
Next steps
If you have difficulty connecting, see Troubleshoot Remote Desktop connections.
Azure Hybrid Benefit for Windows Server
12/23/2019 • 5 minutes to read • Edit Online
For customers with Software Assurance, Azure Hybrid Benefit for Windows Server allows you to use your on-
premises Windows Server licenses and run Windows virtual machines on Azure at a reduced cost. You can use
Azure Hybrid Benefit for Windows Server to deploy new virtual machines with Windows OS. This article goes
over the steps on how to deploy new VMs with Azure Hybrid Benefit for Windows Server and how you can update
existing running VMs. For more information about Azure Hybrid Benefit for Windows Server licensing and cost
savings, see the Azure Hybrid Benefit for Windows Server licensing page.
IMPORTANT
Each 2-processor license or each set of 16-core licenses are entitled to two instances of up to 8 cores, or one instance of up
to 16 cores. The Azure Hybrid Benefit for Standard Edition licenses can only be used once either on-premises or in Azure.
Datacenter Edition benefits allow for simultaneous usage both on-premises and in Azure.
IMPORTANT
Using Azure Hybrid Benefit for Windows Server with any VMs running Windows Server OS are now supported in all regions,
including VMs with additional software such as SQL Server or third-party marketplace software.
NOTE
For classic VMs, only deploying new VM from on premises custom images is supported. To take advantage of the capabilities
supported in this article, you must first migrate classic VMs to Resource Manager model.
CLI
az vm create \
--resource-group myResourceGroup \
--name myVM \
--location eastus \
--license-type Windows_Server
Template
Within your Resource Manager templates, an additional parameter licenseType must be specified. You can read
more about authoring Azure Resource Manager templates
"properties": {
"licenseType": "Windows_Server",
"hardwareProfile": {
"vmSize": "[variables('vmSize')]"
}
NOTE
Changing the license type on the VM does not cause the system to reboot or cause a service interuption. It is simply an
update to a metadata flag.
Portal
From portal VM blade, you can update the VM to use Azure Hybrid Benefit by selecting "Configuration" option
and toggle the "Azure hybrid benefit" option
PowerShell
Convert existing Windows Server VMs to Azure Hybrid Benefit for Windows Server
CLI
Convert existing Windows Server VMs to Azure Hybrid Benefit for Windows Server
Output:
Type : Microsoft.Compute/virtualMachines
Location : westus
LicenseType : Windows_Server
This output contrasts with the following VM deployed without Azure Hybrid Benefit for Windows Server licensing:
Type : Microsoft.Compute/virtualMachines
Location : westus
LicenseType :
CLI
NOTE
Changing the license type on the VM does not cause the system to reboot or cause a service interuption. It is a metadata
licensing flag only.
List all VMs with Azure Hybrid Benefit for Windows Server in a
subscription
To see and count all virtual machines deployed with Azure Hybrid Benefit for Windows Server, you can run the
following command from your subscription:
Portal
From the Virtual Machine or Virtual machine scale sets resource blade, you can view a list of all your VM (s) and
licensing type by configuring the table column to include "Azure Hybrid Benefit". The VM setting can either be in
"Enabled", "Not enabled" or "Not supported" state.
PowerShell
$vms = Get-AzVM
$vms | ?{$_.LicenseType -like "Windows_Server"} | select ResourceGroupName, Name, LicenseType
CLI
Deploy a Virtual Machine Scale Set with Azure Hybrid Benefit for
Windows Server
Within your virtual machine scale set Resource Manager templates, an additional parameter licenseType must be
specified within your VirtualMachineProfile property. You can do this during create or update for your scale set
through ARM template, PowerShell, Azure CLI or REST.
The following example uses ARM template with a Windows Server 2016 Datacenter image:
"virtualMachineProfile": {
"storageProfile": {
"osDisk": {
"createOption": "FromImage"
},
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2016-Datacenter",
"version": "latest"
}
},
"licenseType": "Windows_Server",
"osProfile": {
"computerNamePrefix": "[parameters('vmssName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
}
You can also learn more about how to Modify a virtual machine scale set for more ways to update your scale set.
Next steps
Read more about How to save money with the Azure Hybrid Benefit
Read more about Frequently asked questions for Azure Hybrid Benefit
Learn more about Azure Hybrid Benefit for Windows Server licensing detailed guidance
Learn more about Azure Hybrid Benefit for Windows Server and Azure Site Recovery make migrating
applications to Azure even more cost-effective
Learn more about Windows 10 on Azure with Multitenant Hosting Right
Learn more about Using Resource Manager templates
How to deploy Windows 10 on Azure with
Multitenant Hosting Rights
8/28/2019 • 3 minutes to read • Edit Online
For customers with Windows 10 Enterprise E3/E5 per user or Windows Virtual Desktop Access per user (User
Subscription Licenses or Add-on User Subscription Licenses), Multitenant Hosting Rights for Windows 10 allows
you to bring your Windows 10 Licenses to the cloud and run Windows 10 Virtual Machines on Azure without
paying for another license. For more information, please see Multitenant Hosting for Windows 10.
NOTE
This article shows you to implement the licensing benefit for Windows 10 Pro Desktop images on Azure Marketplace.
For Windows 7, 8.1, 10 Enterprise (x64) images on Azure Marketplace for MSDN Subscriptions, please refer to Windows
client in Azure for dev/test scenarios
For Windows Server licensing benefits, please refer to Azure Hybrid use benefits for Windows Server images.
The following powershell snippet is to mark all administrator accounts as active, including the built-in
administrator. This example is useful if the built-in administrator username is unknown.
$adminAccount = Get-WmiObject Win32_UserAccount -filter "LocalAccount=True" | ? {$_.SID -Like "S-1-5-21-*-500"}
if($adminAccount.Disabled)
{
$adminAccount.Disabled = $false
$adminAccount.Put()
}
Deploy using Azure Resource Manager Template Deployment Within your Resource Manager templates, an
additional parameter for licenseType can be specified. You can read more about authoring Azure Resource
Manager templates. Once you have your VHD uploaded to Azure, edit you Resource Manager template to include
the license type as part of the compute provider and deploy your template as normal:
"properties": {
"licenseType": "Windows_Client",
"hardwareProfile": {
"vmSize": "[variables('vmSize')]"
}
Deploy via PowerShell When deploying your Windows Server VM via PowerShell, you have an additional
parameter for -LicenseType . Once you have your VHD uploaded to Azure, you create a VM using New-AzVM and
specify the licensing type as follows:
New-AzVM -ResourceGroupName "myResourceGroup" -Location "West US" -VM $vm -LicenseType "Windows_Client"
The output is similar to the following example for Windows 10 with correct license type:
Type : Microsoft.Compute/virtualMachines
Location : westus
LicenseType : Windows_Client
This output contrasts with the following VM deployed without Azure Hybrid Use Benefit licensing, such as a VM
deployed straight from the Azure Gallery:
Type : Microsoft.Compute/virtualMachines
Location : westus
LicenseType :
Next Steps
Learn more about Configuring VDA for Windows 10
Learn more about Multitenant Hosting for Windows 10
Security recommendations for Windows virtual
machines in Azure
11/13/2019 • 3 minutes to read • Edit Online
This article contains security recommendations for Azure Virtual Machines. Follow these recommendations to help
fulfill the security obligations described in our model for shared responsibility. The recommendations will also help
you improve overall security for your web app solutions. For more information about what Microsoft does to fulfill
service-provider responsibilities, see Shared responsibilities for cloud computing.
Some of this article's recommendations can be automatically addressed by Azure Security Center. Azure Security
Center is the first line of defense for your resources in Azure. It periodically analyzes the security state of your
Azure resources to identify potential security vulnerabilities. It then recommends how to address the vulnerabilities.
For more information, see Security recommendations in Azure Security Center.
For general information about Azure Security Center, see What is Azure Security Center?.
General
RECOMMENDATION COMMENTS SECURITY CENTER
When you build custom VM images, Before you create images, install the -
apply the latest updates. latest updates for the operating system
and for all applications that will be part
of your image.
Keep your VMs current. You can use the Update Management Yes
solution in Azure Automation to
manage operating system updates for
your Windows and Linux computers in
Azure.
Use multiple VMs for greater resilience If your VM runs applications that must -
and availability. be highly available, use multiple VMs or
availability sets.
Data security
RECOMMENDATION COMMENTS SECURITY CENTER
Encrypt operating system disks. Azure Disk Encryption helps you Yes
encrypt your Windows and Linux IaaS
VM disks. Without the necessary keys,
the contents of encrypted disks are
unreadable. Disk encryption protects
stored data from unauthorized access
that would otherwise be possible if the
disk were copied.
Monitor your VMs. You can use Azure Monitor for VMs to -
monitor the state of your Azure VMs
and virtual machine scale sets.
Performance issues with a VM can lead
to service disruption, which violates the
security principle of availability.
Networking
RECOMMENDATION COMMENTS SECURITY CENTER
Next steps
Check with your application provider to learn about additional security requirements. For more information about
developing secure applications, see Secure-development documentation.
Secure your management ports with just-in-time access
2/25/2020 • 11 minutes to read • Edit Online
If you're on Security Center's standard pricing tier (see pricing), you can lock down inbound traffic to your Azure VMs with
just-in-time (JIT) virtual machine (VM ) access. This reduces exposure to attacks while providing easy access to connect to
VMs when needed.
NOTE
Security Center just-in-time VM access currently supports only VMs deployed through Azure Resource Manager. To learn more about
the classic and Resource Manager deployment models see Azure Resource Manager vs. classic deployment.
Attack scenario
Brute force attacks commonly target management ports as a means to gain access to a VM. If successful, an attacker can take
control over the VM and establish a foothold into your environment.
One way to reduce exposure to a brute force attack is to limit the amount of time that a port is open. Management ports don't
need to be open at all times. They only need to be open while you're connected to the VM, for example to perform
management or maintenance tasks. When just-in-time is enabled, Security Center uses network security group (NSG ) and
Azure Firewall rules, which restrict access to management ports so they cannot be targeted by attackers.
NOTE
If a JIT access request is approved for a VM behind an Azure Firewall, then Security Center automatically changes both the NSG and
firewall policy rules. For the amount of time that was specified, the rules allow inbound traffic to the selected ports and requested source
IP addresses or ranges. After the time is over, Security Center restores the firewall and NSG rules to their previous states.
Configure or edit a JIT policy for a VM Assign these actions to the role:
On the scope of a subscription or resource group that is
associated with the VM:
Microsoft.Security/locations/jitNetworkAccessPolicies/write
On the scope of a subscription or resource group of VM:
Microsoft.Compute/virtualMachines/write
Configure JIT on a VM
There are three ways to configure a JIT policy on a VM:
Configure JIT access in Azure Security Center
Configure JIT access in an Azure VM page
Configure a JIT policy on a VM programmatically
NOTE
When JIT VM Access is enabled for a VM, Azure Security Center creates "deny all inbound traffic" rules for the selected ports in the
network security groups associated and Azure Firewall with it. If other rules had been created for the selected ports, then the existing
rules take priority over the new “deny all inbound traffic” rules. If there are no existing rules on the selected ports, then the new “deny all
inbound traffic” rules take top priority in the Network Security Groups and Azure Firewall.
4. Under Request access, for each VM, configure the ports that you want to open and the source IP addresses that the
port is opened on and the time window for which the port will be open. It will only be possible to request access to the
ports that are configured in the just-in-time policy. Each port has a maximum allowed time derived from the just-in-
time policy.
5. Click Open ports.
NOTE
If a user who is requesting access is behind a proxy, the option My IP may not work. You may need to define the full IP address range of
the organization.
NOTE
After a request is approved for a VM protected by Azure Firewall, Security Center provides the user with the proper
connection details (the port mapping from the DNAT table) to use to connect to the VM.
If you do not have JIT configured on a VM, you will be prompted to configure a JIT policy on it.
Configure a JIT policy on a VM programmatically
You can set up and use just-in-time via REST APIs and via PowerShell.
JIT VM access via REST APIs
The just-in-time VM access feature can be used via the Azure Security Center API. You can get information about configured
VMs, add new ones, request access to a VM, and more, via this API. See Jit Network Access Policies, to learn more about the
just-in-time REST API.
JIT VM access via PowerShell
To use the just-in-time VM access solution via PowerShell, use the official Azure Security Center PowerShell cmdlets, and
specifically Set-AzJitNetworkAccessPolicy .
The following example sets a just-in-time VM access policy on a specific VM, and sets the following:
1. Close ports 22 and 3389.
2. Set a maximum time window of 3 hours for each so they can be opened per approved request.
3. Allows the user who is requesting access to control the source IP addresses and allows the user to establish a
successful session upon an approved just-in-time access request.
Run the following in PowerShell to accomplish this:
1. Assign a variable that holds the just-in-time VM access policy for a VM:
$JitPolicy = (@{
id="/subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUP/providers/Microsoft.Compute/virtualMachines/VMNAME
"
ports=(@{
number=22;
protocol="*";
allowedSourceAddressPrefix=@("*");
maxRequestAccessDuration="PT3H"},
@{
number=3389;
protocol="*";
allowedSourceAddressPrefix=@("*");
maxRequestAccessDuration="PT3H"})})
$JitPolicyArr=@($JitPolicy)
$JitPolicyVm1 = (@{
id="/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUP/providers/Microsoft.Compute/virtualMachines/VMNAME"
ports=(@{
number=22;
endTimeUtc="2018-09-17T17:00:00.3658798Z";
allowedSourceAddressPrefix=@("IPV4ADDRESS")})})
$JitPolicyArr=@($JitPolicyVm1)
3. Send the request access (use the resource ID you got in step 1)
Start-AzJitNetworkAccessPolicy -ResourceId
"/subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUP/providers/Microsoft.Security/locations/LOCATION/jitNet
workAccessPolicies/default" -VirtualMachine $JitPolicyArr
Next steps
In this article, you learned how just-in-time VM access in Security Center helps you control access to your Azure virtual
machines.
To learn more about Security Center, see the following:
Setting security policies — Learn how to configure security policies for your Azure subscriptions and resource groups.
Managing security recommendations — Learn how recommendations help you protect your Azure resources.
Security health monitoring — Learn how to monitor the health of your Azure resources.
Azure Disk Encryption scenarios on Windows VMs
10/29/2019 • 11 minutes to read • Edit Online
Azure Disk Encryption uses the BitLocker external key protector to provide volume encryption for the OS and data
disks of Azure virtual machines (VMs), and is integrated with Azure Key Vault to help you control and manage the
disk encryption keys and secrets. For an overview of the service, see Azure Disk Encryption for Windows VMs.
There are many disk encryption scenarios, and the steps may vary according to the scenario. The following
sections cover the scenarios in greater detail for Windows VMs.
You can only apply disk encryption to virtual machines of supported VM sizes and operating systems. You must
also meet the following prerequisites:
Networking requirements
Group Policy requirements
Encryption key storage requirements
IMPORTANT
If you have previously used Azure Disk Encryption with Azure AD to encrypt a VM, you must continue use this option
to encrypt your VM. See Azure Disk Encryption with Azure AD (previous release) for details.
You should take a snapshot and/or create a backup before disks are encrypted. Backups ensure that a recovery
option is possible if an unexpected failure occurs during encryption. VMs with managed disks require a backup before
encryption occurs. Once a backup is made, you can use the Set-AzVMDiskEncryptionExtension cmdlet to encrypt
managed disks by specifying the -skipVmBackup parameter. For more information about how to back up and restore
encrypted VMs, see Back up and restore encrypted Azure VM.
Encrypting or disabling encryption may cause a VM to reboot.
az login
If you have multiple subscriptions and want to specify a specific one, get your subscription list with az account list
and specify with az account set.
az account list
az account set --subscription "<subscription name or ID>"
For more information, see Get started with Azure CLI 2.0.
Azure PowerShell
The Azure PowerShell az module provides a set of cmdlets that uses the Azure Resource Manager model for
managing your Azure resources. You can use it in your browser with Azure Cloud Shell, or you can install it on
your local machine using the instructions in Install the Azure PowerShell module.
If you already have it installed locally, make sure you use the latest version of Azure PowerShell SDK version to
configure Azure Disk Encryption. Download the latest version of Azure PowerShell release.
To Sign in to your Azure account with Azure PowerShell, use the Connect-AzAccount cmdlet.
Connect-AzAccount
If you have multiple subscriptions and want to specify one, use the Get-AzSubscription cmdlet to list them,
followed by the Set-AzContext cmdlet:
Running the Get-AzContext cmdlet will verify that the correct subscription has been selected.
To confirm the Azure Disk Encryption cmdlets are installed, use the Get-command cmdlet:
Get-command *diskencryption*
$KVRGname = 'MyKeyVaultResourceGroup';
$VMRGName = 'MyVirtualMachineResourceGroup';
$vmName = 'MyExtraSecureVM';
$KeyVaultName = 'MySecureVault';
$keyEncryptionKeyName = 'MyKeyEncryptionKey';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid;
NOTE
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-
name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-
name].vault.azure.net/keys/[kekname]/[kek-unique-id]
Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the Get-
AzVmDiskEncryptionStatus cmdlet.
Disable disk encryption: To disable the encryption, use the Disable-AzVMDiskEncryption cmdlet.
Disabling data disk encryption on Windows VM when both OS and data disks have been encrypted doesn't
work as expected. Disable encryption on all disks instead.
NOTE
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-
name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-
name].vault.azure.net/keys/[kekname]/[kek-unique-id]
Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the az vm
encryption show command.
Disable encryption: To disable encryption, use the az vm encryption disable command. Disabling data
disk encryption on Windows VM when both OS and data disks have been encrypted doesn't work as
expected. Disable encryption on all disks instead.
PARAMETER DESCRIPTION
keyVaultName Name of the key vault that the BitLocker key should be
uploaded to. You can get it by using the cmdlet
(Get-AzKeyVault -ResourceGroupName
<MyKeyVaultResourceGroupName>). Vaultname
or the Azure CLI command
az keyvault list --resource-group
"MyKeyVaultResourceGroup"
keyVaultResourceGroup Name of the resource group that contains the key vault
forceUpdateTag Pass in a unique value like a GUID every time the operation
needs to be force run.
Encrypt a running VM using KEK: This example uses "All" for the -VolumeType parameter, which
includes both OS and Data volumes. If you only want to encrypt the OS volume, use "OS" for the -
VolumeType parameter.
$KVRGname = 'MyKeyVaultResourceGroup';
$VMRGName = 'MyVirtualMachineResourceGroup';
$vmName = 'MyExtraSecureVM';
$KeyVaultName = 'MySecureVault';
$keyEncryptionKeyName = 'MyKeyEncryptionKey';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid;
$sequenceVersion = [Guid]::NewGuid();
NOTE
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-
name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-
name].vault.azure.net/keys/[kekname]/[kek-unique-id]
Disable encryption
You can disable encryption using Azure PowerShell, the Azure CLI, or with a Resource Manager template.
Disabling data disk encryption on Windows VM when both OS and data disks have been encrypted doesn't work
as expected. Disable encryption on all disks instead.
Disable disk encryption with Azure PowerShell: To disable the encryption, use the Disable-
AzVMDiskEncryption cmdlet.
Disable encryption with the Azure CLI: To disable encryption, use the az vm encryption disable
command.
Unsupported scenarios
Azure Disk Encryption does not work for the following scenarios, features, and technology:
Encrypting basic tier VM or VMs created through the classic VM creation method.
Encrypting VMs configured with software-based RAID systems.
Encrypting VMs configured with Storage Spaces Direct (S2D ), or Windows Server versions before 2016
configured with Windows Storage Spaces.
Integration with an on-premises key management system.
Azure Files (shared file system).
Network File System (NFS ).
Dynamic volumes.
Windows Server containers, which create dynamic volumes for each container.
Ephemeral OS disks.
Encryption of shared/distributed file systems like (but not limited to) DFS, GFS, DRDB, and CephFS.
Next steps
Azure Disk Encryption overview
Azure Disk Encryption sample scripts
Azure Disk Encryption troubleshooting
Quickstart: Create and encrypt a Windows VM with
the Azure CLI
10/9/2019 • 3 minutes to read • Edit Online
The Azure CLI is used to create and manage Azure resources from the command line or in scripts. This quickstart
shows you how to use the Azure CLI to create and encrypt a Windows Server 2016 virtual machine (VM ).
If you don't have an Azure subscription, create a free account before you begin.
OPTION EXAMPLE/LINK
Select the Cloud Shell button on the menu bar at the upper
right in the Azure portal.
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image win2016datacenter \
--admin-username azureuser \
--admin-password myPassword12
It takes a few minutes to create the VM and supporting resources. The following example output shows the VM
create operation was successful.
{
"fqdns": "",
"id":
"/subscriptions/<guid>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
"location": "eastus",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "52.174.34.95",
"resourceGroup": "myResourceGroup"
}
IMPORTANT
Each Key Vault must have a unique name. The following example creates a Key Vault named myKV, but you must name yours
something different.
Clean up resources
When no longer needed, you can use the az group delete command to remove the resource group, VM, and Key
Vault.
Next steps
In this quickstart, you created a virtual machine, created a Key Vault that was enable for encryption keys, and
encrypted the VM. Advance to the next article to learn more about Azure Disk Encryption prerequisites for IaaS
VMs.
Azure Disk Encryption overview
Quickstart: Create and encrypt a Windows virtual
machine in Azure with PowerShell
10/9/2019 • 2 minutes to read • Edit Online
The Azure PowerShell module is used to create and manage Azure resources from the PowerShell command line
or in scripts. This quickstart shows you how to use the Azure PowerShell module to create a Windows virtual
machine (VM ), create a Key Vault for the storage of encryption keys, and encrypt the VM.
If you don't have an Azure subscription, create a free account before you begin.
$cred = Get-Credential
New-AzVM -Name MyVm -Credential $cred -ResourceGroupName MyResourceGroup -Image win2016datacenter -Size
Standard_D2S_V3
IMPORTANT
Each Key Vault must have a unique name. The following example creates a Key Vault named myKV, but you must name yours
something different.
When encryption is enabled, you will see the following in the returned output:
OsVolumeEncrypted : Encrypted
DataVolumesEncrypted : NoDiskFound
OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
ProgressMessage : Provisioning succeeded
Clean up resources
When no longer needed, you can use the Remove-AzResourceGroup cmdlet to remove the resource group, VM,
and all related resources:
Next steps
In this quickstart, you created a virtual machine, created a Key Vault that was enable for encryption keys, and
encrypted the VM. Advance to the next article to learn more about Azure Disk Encryption prerequisites for IaaS
VMs.
Azure Disk Encryption overview
Quickstart: Create and encrypt a Windows virtual
machine with the Azure portal
11/17/2019 • 2 minutes to read • Edit Online
Azure virtual machines (VMs) can be created through the Azure portal. The Azure portal is a browser-based user
interface to create VMs and their associated resources. In this quickstart you will use the Azure portal to deploy a
Windows virtual machine (VM ) running Ubuntu 18.04 LTS, create a key vault for the storage of encryption keys,
and encrypt the VM.
If you don't have an Azure subscription, create a free account before you begin.
Sign in to Azure
Sign in to the Azure portal.
4. On the encryption screen, under Disks to encrypt, choose OS and data disks.
5. Under Encryption settings, choose Select a key vault and key for encryption.
6. On the Select key from Azure Key Vault screen, select Create New.
7. On the Create key vault screen, ensure that the Resource Group is the same as the one you used to create
the VM.
8. Give your key vault a name. Every key vault across Azure must have an unique name.
9. On the Access Policies tab, check the Azure Disk Encryption for volume encryption box.
Clean up resources
When no longer needed, you can delete the resource group, virtual machine, and all related resources. To do so,
select the resource group for the virtual machine, select Delete, then confirm the name of the resource group to
delete.
Next steps
In this quickstart, you created a Key Vault that was enable for encryption keys, created a virtual machine, and
enabled the virtual machine for encryption.
Azure Disk Encryption overview
Creating and configuring a key vault for Azure Disk
Encryption
10/9/2019 • 6 minutes to read • Edit Online
Azure Disk Encryption uses Azure Key Vault to control and manage disk encryption keys and secrets. For more
information about key vaults, see Get started with Azure Key Vault and Secure your key vault.
WARNING
If you have previously used Azure Disk Encryption with Azure AD to encrypt a VM, you must continue use this option to
encrypt your VM. See Creating and configuring a key vault for Azure Disk Encryption with Azure AD (previous release) for
details.
Creating and configuring a key vault for use with Azure Disk Encryption involves three steps:
1. Creating a resource group, if needed.
2. Creating a key vault.
3. Setting key vault advanced access policies.
These steps are illustrated in the following quickstarts:
Create and encrypt a Windows VM with Azure CLI
Create and encrypt a Windows VM with Azure PowerShell
You may also, if you wish, generate or import a key encryption key (KEK).
NOTE
The steps in this article are automated in the Azure Disk Encryption prerequisites CLI script and Azure Disk Encryption
prerequisites PowerShell script.
az login
Connect-AzAccount
Create a resource group
If you already have a resource group, you can skip to Create a key vault.
A resource group is a logical container into which Azure resources are deployed and managed.
Create a resource group using the az group create Azure CLI command, the New -AzResourceGroup Azure
PowerShell command, or from the Azure portal.
Azure CLI
Azure PowerShell
WARNING
To ensure that encryption secrets don't cross regional boundaries, Azure Disk Encryption requires the Key Vault and the VMs
to be co-located in the same region. Create and use a Key Vault that is in the same region as the VMs to be encrypted.
Each Key Vault must have a unique name. Replace with the name of your key vault in the following examples.
Azure CLI
When creating a key vault using Azure CLI, add the "--enabled-for-disk-encryption" flag.
Azure PowerShell
When creating a key vault using Azure PowerShell, add the "-EnabledForDiskEncryption" flag.
Enable Key Vault for deployment, if needed: Enables the Microsoft.Compute resource provider to
retrieve secrets from this key vault when this key vault is referenced in resource creation, for example when
creating a virtual machine.
Enable Key Vault for template deployment, if needed: Allow Resource Manager to retrieve secrets
from the vault.
Azure PowerShell
Use the key vault PowerShell cmdlet Set-AzKeyVaultAccessPolicy to enable disk encryption for the key vault.
Enable Key Vault for disk encryption: EnabledForDiskEncryption is required for Azure Disk encryption.
Enable Key Vault for deployment, if needed: Enables the Microsoft.Compute resource provider to
retrieve secrets from this key vault when this key vault is referenced in resource creation, for example when
creating a virtual machine.
Enable Key Vault for template deployment, if needed: Enables Azure Resource Manager to get secrets
from this key vault when this key vault is referenced in a template deployment.
Azure portal
1. Select your key vault, go to Access Policies, and Click to show advanced access policies.
2. Select the box labeled Enable access to Azure Disk Encryption for volume encryption.
3. Select Enable access to Azure Virtual Machines for deployment and/or Enable Access to Azure
Resource Manager for template deployment, if needed.
4. Click Save.
You may instead import a private key using the Azure CLI az keyvault key import command:
In either case, you will supply the name of your KEK to the Azure CLI az vm encryption enable --key-encryption-
key parameter.
Azure PowerShell
Use the Azure PowerShell Add-AzKeyVaultKey cmdlet to generate a new KEK and store it in your key vault.
You may instead import a private key using the Azure PowerShell az keyvault key import command.
In either case, you will supply the ID of your KEK key Vault and the URL of your KEK to the Azure PowerShell Set-
AzVMDiskEncryptionExtension -KeyEncryptionKeyVaultId and -KeyEncryptionKeyUrl parameters. Note that this
example assumes that you are using the same key vault for both the disk encryption key and the KEK.
Next steps
Azure Disk Encryption prerequisites CLI script
Azure Disk Encryption prerequisites PowerShell script
Learn Azure Disk Encryption scenarios on Windows VMs
Learn how to troubleshoot Azure Disk Encryption
Read the Azure Disk Encryption sample scripts
Azure Disk Encryption sample scripts
11/7/2019 • 7 minutes to read • Edit Online
This article provides sample scripts for preparing pre-encrypted VHDs and other tasks.
List all disk encryption secrets used for encrypting VMs in a key vault:
To compress the OS partition and prepare the machine for BitLocker, execute the bdehdcfg if needed:
NOTE
Prepare the VM with a separate data/resource VHD for getting the external key by using BitLocker.
Upload encrypted VHD to an Azure storage account
After DM -Crypt encryption is enabled, the local encrypted VHD needs to be uploaded to your storage account.
# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "[email protected]"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -
PermissionsToSecrets set
# When running as a service principal, retrieve the service principal ID from the account ID, and set access
policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys
wrapKey -PermissionsToSecrets set
# This is the passphrase that was provided for encryption during the distribution installation
$passphrase = "contoso-password"
Use the $secretUrl in the next step for attaching the OS disk without using KEK.
Disk encryption secret encrypted with a KEK
Before you upload the secret to the key vault, you can optionally encrypt it by using a key encryption key. Use the
wrap API to first encrypt the secret using the key encryption key. The output of this wrap operation is a base64
URL encoded string, which you can then upload as a secret by using the Set-AzKeyVaultSecret cmdlet.
# This is the passphrase that was provided for encryption during the distribution installation
$passphrase = "contoso-password"
Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
$KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"
$apiversion = "2015-06-01"
##############################
# Get Auth URI
##############################
$response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch {
$_.Exception.Response }
$authHeader = $response.Headers["www-authenticate"]
$authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value
##############################
# Get Auth Token
##############################
$response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body
$access_token = $response.access_token
##############################
# Get KEK info
##############################
$keyid = $response.key.kid
##############################
# Encrypt passphrase using KEK
##############################
$passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
$uri = $keyid + "/encrypt?api-version=" + $apiversion
$headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
$bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
$body = $bodyObj | ConvertTo-Json
$response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body
$wrappedSecret = $response.value
##############################
# Store secret
# Store secret
##############################
$secretName = [guid]::NewGuid().ToString()
$uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
$secretAttributes = @{"enabled" = $true}
$secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" =
"LinuxPassPhraseFileName"}
$headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
$bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
$body = $bodyObj | ConvertTo-Json
$response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body
$secretUrl = $response.id
Use $KeyEncryptionKey and $secretUrl in the next step for attaching the OS disk using KEK.
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
Using a KEK
When you attach the OS disk, pass $KeyEncryptionKey and $secretUrl . The URL was generated in the "Disk
encryption secret encrypted with a KEK" section.
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $CopiedTemplateBlobUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl `
-KeyEncryptionKeyVaultId $KeyVault.ResourceId `
-KeyEncryptionKeyURL $KeyEncryptionKey.Id
Azure Disk Encryption troubleshooting guide
11/7/2019 • 3 minutes to read • Edit Online
This guide is for IT professionals, information security analysts, and cloud administrators whose organizations use
Azure Disk Encryption. This article is to help with troubleshooting disk-encryption-related problems.
Before taking any of the steps below, first ensure that the VMs you are attempting to encrypt are among the
supported VM sizes and operating systems, and that you have met all the prerequisites:
Networking requirements
Group policy requirements
Encryption key storage requirements
\windows\system32\bdehdcfg.exe
\windows\system32\bdehdcfglib.dll
\windows\system32\en-US\bdehdcfglib.dll.mui
\windows\system32\en-US\bdehdcfg.exe.mui
Next steps
In this document, you learned more about some common problems in Azure Disk Encryption and how to
troubleshoot those problems. For more information about this service and its capabilities, see the following
articles:
Apply disk encryption in Azure Security Center
Azure data encryption at rest
Azure Disk Encryption for Windows VMs FAQ
11/22/2019 • 6 minutes to read • Edit Online
This article provides answers to frequently asked questions (FAQ ) about Azure Disk Encryption for Windows VMs.
For more information about this service, see Azure Disk Encryption overview.
Can I encrypt both boot and data volumes with Azure Disk Encryption?
You can encrypt both boot and data volumes, but you can't encrypt the data without first encrypting the OS
volume.
After you've encrypted the OS volume, disabling encryption on the OS volume isn't supported.
Does Azure Disk Encryption allow you to bring your own key (BYOK)?
Yes, you can supply your own key encryption keys. These keys are safeguarded in Azure Key Vault, which is the key
store for Azure Disk Encryption. For more information on the key encryption keys support scenarios, see Creating
and configuring a key vault for Azure Disk Encryption.
NOTE
Do not delete or edit any contents in this disk. Do not unmount the disk since the encryption key presence is needed for any
encryption operations on the IaaS VM.
Windows Server 2012, Windows 8, 8.1, < 1511 AES 256 bit *
10
* AES 256 bit with Diffuser isn't supported in Windows 2012 and later.
To determine Windows OS version, run the 'winver' tool in your virtual machine.
If I use EncryptFormatAll and specify all volume types, will it erase the
data on the data drives that we already encrypted?
No, data won't be erased from data drives that are already encrypted using Azure Disk Encryption. Similar to how
EncryptFormatAll didn't re-encrypt the OS drive, it won't re-encrypt the already encrypted data drive.
Next steps
In this document, you learned more about the most frequent questions related to Azure Disk Encryption. For more
information about this service, see the following articles:
Azure Disk Encryption Overview
Apply disk encryption in Azure Security Center
Azure data encryption at rest
Azure Disk Encryption with Azure AD (previous
release)
10/9/2019 • 2 minutes to read • Edit Online
The new release of Azure Disk Encryption eliminates the requirement for providing an Azure AD
application parameter to enable VM disk encryption. With the new release, you are no longer required
to provide Azure AD credentials during the enable encryption step. All new VMs must be encrypted
without the Azure AD application parameters using the new release. To view instructions to enable VM
disk encryption using the new release, see Azure Disk Encryption for Windows VMs. VMs that were
already encrypted with Azure AD application parameters are still supported and should continue to be
maintained with the AAD syntax.
This article supplements Azure Disk Encryption for Windows VMs with additional requirements and prerequisites
for Azure Disk Encryption with Azure AD (previous release). The Supported VMs and operating systems section
remains the same.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001`
Group Policy:
The Azure Disk Encryption solution uses the BitLocker external key protector for Windows IaaS VMs. For
domain joined VMs, don't push any group policies that enforce TPM protectors. For information about the
group policy for “Allow BitLocker without a compatible TPM,” see BitLocker Group Policy Reference.
BitLocker policy on domain joined virtual machines with custom group policy must include the following
setting: Configure user storage of BitLocker recovery information -> Allow 256-bit recovery key . Azure
Disk Encryption will fail when custom group policy settings for BitLocker are incompatible. On machines
that didn't have the correct policy setting, apply the new policy, force the new policy to update (gpupdate.exe
/force), and then restarting may be required.
Next steps
Creating and configuring a key vault for Azure Disk Encryption with Azure AD (previous release)
Enable Azure Disk Encryption with Azure AD on Windows VMs (previous release)
Azure Disk Encryption prerequisites CLI script
Azure Disk Encryption prerequisites PowerShell script
Creating and configuring a key vault for Azure Disk
Encryption with Azure AD (previous release)
10/9/2019 • 15 minutes to read • Edit Online
The new release of Azure Disk Encryption eliminates the requirement for providing an Azure AD
application parameter to enable VM disk encryption. With the new release, you are no longer required
to provide Azure AD credentials during the enable encryption step. All new VMs must be encrypted
without the Azure AD application parameters using the new release. To view instructions to enable VM
disk encryption using the new release, see Azure Disk Encryption. VMs that were already encrypted
with Azure AD application parameters are still supported and should continue to be maintained with
the AAD syntax.
Azure Disk Encryption uses Azure Key Vault to control and manage disk encryption keys and secrets. For more
information about key vaults, see Get started with Azure Key Vault and Secure your key vault.
Creating and configuring a key vault for use with Azure Disk Encryption with Azure AD (previous release) involves
three steps:
1. Create a key vault.
2. Set up an Azure AD application and service principal.
3. Set the key vault access policy for the Azure AD app.
4. Set key vault advanced access policies.
You may also, if you wish, generate or import a key encryption key (KEK).
See the main Creating and configuring a key vault for Azure Disk Encryption article for steps on how to Install
tools and connect to Azure.
NOTE
The steps in this article are automated in the Azure Disk Encryption prerequisites CLI script and Azure Disk Encryption
prerequisites PowerShell script.
WARNING
In order to make sure the encryption secrets don’t cross regional boundaries, Azure Disk Encryption needs the Key Vault
and the VMs to be co-located in the same region. Create and use a Key Vault that is in the same region as the VM to be
encrypted.
# Get-AzLocation
New-AzResourceGroup –Name 'MyKeyVaultResourceGroup' –Location 'East US'
3. Note the Vault Name, Resource Group Name, Resource ID, Vault URI, and the Object ID that are
returned for later use when you encrypt the disks.
Create a key vault with Azure CLI
You can manage your key vault with Azure CLI using the az keyvault commands. To create a key vault, use az
keyvault create.
1. Create a new resource group, if needed, with az group create. To list locations, use az account list-locations
3. Note the Vault Name (name), Resource Group Name, Resource ID (ID ), Vault URI, and the Object ID
that are returned for use later.
Create a key vault with a Resource Manager template
You can create a key vault by using the Resource Manager template.
1. On the Azure quickstart template, click Deploy to Azure.
2. Select the subscription, resource group, resource group location, Key Vault name, Object ID, legal terms, and
agreement, and then click Purchase.
2. The $azureAdApplication.ApplicationId is the Azure AD ClientID and the $aadClientSecret is the client
secret that you will use later to enable Azure Disk Encryption. Safeguard the Azure AD client secret
appropriately. Running $azureAdApplication.ApplicationId will show you the ApplicationID.
Set up an Azure AD app and service principal with Azure CLI
You can manage your service principals with Azure CLI using the az ad sp commands. For more information, see
Create an Azure service principal.
1. Create a new service principal.
2. The appId returned is the Azure AD ClientID used in other commands. It's also the SPN you'll use for az
keyvault set-policy. The password is the client secret that you should use later to enable Azure Disk
Encryption. Safeguard the Azure AD client secret appropriately.
Set up an Azure AD app and service principal though the Azure portal
Use the steps from the Use portal to create an Azure Active Directory application and service principal that can
access resources article to create an Azure AD application. Each step listed below will take you directly to the
article section to complete.
1. Verify required permissions
2. Create an Azure Active Directory application
You can use any name and sign-on URL you would like when creating the application.
3. Get the application ID and the authentication key.
The authentication key is the client secret and is used as the AadClientSecret for Set-
AzVMDiskEncryptionExtension.
The authentication key is used by the application as a credential to sign in to Azure AD. In the
Azure portal, this secret is called keys, but has no relation to key vaults. Secure this secret
appropriately.
The application ID will be used later as the AadClientId for Set-AzVMDiskEncryptionExtension and as
the ServicePrincipalName for Set-AzKeyVaultAccessPolicy.
Set the key vault access policy for the Azure AD app
To write encryption secrets to a specified Key Vault, Azure Disk Encryption needs the Client ID and the Client
Secret of the Azure Active Directory application that has permissions to write secrets to the Key Vault.
NOTE
Azure Disk Encryption requires you to configure the following access policies to your Azure AD client application: WrapKey
and Set permissions.
Set the key vault access policy for the Azure AD app with Azure PowerShell
Your Azure AD application needs rights to access the keys or secrets in the vault. Use the Set-
AzKeyVaultAccessPolicy cmdlet to grant permissions to the application, using the client ID (which was generated
when the application was registered) as the –ServicePrincipalName parameter value. To learn more, see the blog
post Azure Key Vault - Step by Step.
1. Set the key vault access policy for the AD application with PowerShell.
$keyVaultName = 'MySecureVault'
$aadClientID = 'MyAadAppClientID'
$KVRGname = 'MyKeyVaultResourceGroup'
Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName -ServicePrincipalName $aadClientID -
PermissionsToKeys 'WrapKey' -PermissionsToSecrets 'Set' -ResourceGroupName $KVRGname
Set the key vault access policy for the Azure AD app with Azure CLI
Use az keyvault set-policy to set the access policy. For more information, see Manage Key Vault using CLI 2.0.
Give the service principal you created via the Azure CLI access to get secrets and wrap keys with the following
command:
```azurecli-interactive
az keyvault set-policy --name "MySecureVault" --spn "<spn created with CLI/the Azure AD ClientID>" --key-
permissions wrapKey --secret-permissions set
```
Set the key vault access policy for the Azure AD app with the portal
1. Open the resource group with your key vault.
2. Select your key vault, go to Access Policies, then click Add new.
3. Under Select principal, search for the Azure AD application you created and select it.
4. For Key permissions, check Wrap Key under Cryptographic Operations.
5. For Secret permissions, check Set under Secret Management Operations.
6. Click OK to save the access policy.
Set key vault advanced access policies
The Azure platform needs access to the encryption keys or secrets in your key vault to make them available to the
VM for booting and decrypting the volumes. Enable disk encryption on the key vault or deployments will fail.
Set key vault advanced access policies with Azure PowerShell
Use the key vault PowerShell cmdlet Set-AzKeyVaultAccessPolicy to enable disk encryption for the key vault.
Enable Key Vault for disk encryption: EnabledForDiskEncryption is required for Azure Disk encryption.
Enable Key Vault for deployment, if needed: Enables the Microsoft.Compute resource provider to
retrieve secrets from this key vault when this key vault is referenced in resource creation, for example when
creating a virtual machine.
Enable Key Vault for template deployment, if needed: Enables Azure Resource Manager to get secrets
from this key vault when this key vault is referenced in a template deployment.
Set key vault advanced access policies using the Azure CLI
Use az keyvault update to enable disk encryption for the key vault.
Enable Key Vault for disk encryption: Enabled-for-disk-encryption is required.
Enable Key Vault for deployment, if needed: Allow Virtual Machines to retrieve certificates stored as
secrets from the vault.
Enable Key Vault for template deployment, if needed: Allow Resource Manager to retrieve secrets
from the vault.
Set key vault advanced access policies through the Azure portal
1. Select your keyvault, go to Access Policies, and Click to show advanced access policies.
2. Select the box labeled Enable access to Azure Disk Encryption for volume encryption.
3. Select Enable access to Azure Virtual Machines for deployment and/or Enable Access to Azure
Resource Manager for template deployment, if needed.
4. Click Save.
$Loc = 'MyLocation';
$KVRGname = 'MyKeyVaultResourceGroup';
$KeyVaultName = 'MySecureVault';
New-AzResourceGroup –Name $KVRGname –Location $Loc;
New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname -Location $Loc;
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$KeyVaultResourceId = (Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname).ResourceId;
$diskEncryptionKeyVaultUrl = (Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName
$KVRGname).VaultUri;
$aadClientSecret = 'MyAADClientSecret';
$aadClientSecretSec = ConvertTo-SecureString -String $aadClientSecret -AsPlainText -Force;
$azureAdApplication = New-AzADApplication -DisplayName "<My Application Display Name>" -HomePage "
<https://MyApplicationHomePage>" -IdentifierUris "<https://MyApplicationUri>" -Password $aadClientSecretSec
$servicePrincipal = New-AzADServicePrincipal –ApplicationId $azureAdApplication.ApplicationId;
$aadClientID = $azureAdApplication.ApplicationId;
#Step 3: Enable the vault for disk encryption and set the access policy for the Azure AD application.
#Step 4: Create a new key in the key vault with the Add-AzKeyVaultKey cmdlet.
# Fill in 'MyKeyEncryptionKey' with your value.
$keyEncryptionKeyName = 'MyKeyEncryptionKey';
Add-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName -Destination 'Software';
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid;
$VMName = 'MySecureVM';
$VMRGName = 'MyVirtualMachineResourceGroup';
Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGName -VMName $vmName -AadClientID $aadClientID -
AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -
DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -
KeyEncryptionKeyVaultId $KeyVaultResourceId;
$KVRGname = 'MyKeyVaultResourceGroup'
$KeyVaultName= 'MySecureVault'
$Loc = 'MyLocation'
New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname -Location $Loc
Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $KVRGname -EnabledForDiskEncryption
# Create the Azure AD application and associate the certificate with it.
# Fill in "C:\certificates\mycert.pfx", "Password", "<My Application Display Name>", "
<https://MyApplicationHomePage>", and "<https://MyApplicationUri>" with your values.
# MyApplicationHomePage and the MyApplicationUri can be any values you wish
$CertPath = "C:\certificates\mycert.pfx"
$CertPassword = "Password"
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertPath, $CertPassword)
$CertValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
$AADClientID = $AzureAdApplication.ApplicationId
$aadClientCertThumbprint= $cert.Thumbprint
$KeyVaultSecretName = "MyAADCert"
$FileContentBytes = get-content $CertPath -Encoding Byte
$FileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$JSONObject = @"
{
"data" : "$filecontentencoded",
"dataType" : "pfx",
"password" : "$CertPassword"
}
"@
$JSONObjectBytes = [System.Text.Encoding]::UTF8.GetBytes($jsonObject)
$JSONEncoded = [System.Convert]::ToBase64String($jsonObjectBytes)
#Set the secret and set the key vault policy for -EnabledForDeployment
$VMName = 'MySecureVM'
$VMRGName = 'MyVirtualMachineResourceGroup'
$CertUrl = (Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $KeyVaultSecretName).Id
$SourceVaultId = (Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGName).ResourceId
$VM = Get-AzVM -ResourceGroupName $VMRGName -Name $VMName
$VM = Add-AzVMSecret -VM $VM -SourceVaultId $SourceVaultId -CertificateStore "My" -CertificateUrl $CertUrl
Update-AzVM -VM $VM -ResourceGroupName $VMRGName
#Enable encryption on the VM using Azure AD client ID and the client certificate thumbprint
$KVRGname = 'MyKeyVaultResourceGroup'
$KeyVaultName= 'MySecureVault'
$Loc = 'MyLocation'
New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname -Location $Loc
Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $KVRGname -EnabledForDiskEncryption
# Create the Azure AD application and associate the certificate with it.
# Fill in "C:\certificates\mycert.pfx", "Password", "<My Application Display Name>", "
<https://MyApplicationHomePage>", and "<https://MyApplicationUri>" with your values.
# MyApplicationHomePage and the MyApplicationUri can be any values you wish
$CertPath = "C:\certificates\mycert.pfx"
$CertPassword = "Password"
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertPath, $CertPassword)
$CertValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
$AADClientID = $AzureAdApplication.ApplicationId
$aadClientCertThumbprint= $cert.Thumbprint
$KeyVaultSecretName = "MyAADCert"
$FileContentBytes = get-content $CertPath -Encoding Byte
$FileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$JSONObject = @"
{
"data" : "$filecontentencoded",
"dataType" : "pfx",
"password" : "$CertPassword"
}
"@
$JSONObjectBytes = [System.Text.Encoding]::UTF8.GetBytes($jsonObject)
$JSONEncoded = [System.Convert]::ToBase64String($jsonObjectBytes)
#Set the secret and set the key vault policy for deployment
#Setting some variables with the key vault information and generating a KEK
#Setting some variables with the key vault information and generating a KEK
# FIll in 'KEKName'
$KEKName ='KEKName'
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname
$DiskEncryptionKeyVaultUrl = $KeyVault.VaultUri
$KeyVaultResourceId = $KeyVault.ResourceId
$KEK = Add-AzKeyVaultKey -VaultName $KeyVaultName -Name $KEKName -Destination "Software"
$KeyEncryptionKeyUrl = $KEK.Key.kid
$VMName = 'MySecureVM';
$VMRGName = 'MyVirtualMachineResourceGroup';
$CertUrl = (Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $KeyVaultSecretName).Id
$SourceVaultId = (Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGName).ResourceId
$VM = Get-AzVM -ResourceGroupName $VMRGName -Name $VMName
$VM = Add-AzVMSecret -VM $VM -SourceVaultId $SourceVaultId -CertificateStore "My" -CertificateUrl $CertUrl
Update-AzVM -VM $VM -ResourceGroupName $VMRGName
#Enable encryption on the VM using Azure AD client ID and the client certificate thumbprint
Next steps
Enable Azure Disk Encryption with Azure AD on Windows VMs (previous release)
Azure Disk Encryption with Azure AD for Windows
VMs (previous release)
10/9/2019 • 13 minutes to read • Edit Online
The new release of Azure Disk Encryption eliminates the requirement for providing an Azure AD
application parameter to enable VM disk encryption. With the new release, you are no longer required
to provide Azure AD credentials during the enable encryption step. All new VMs must be encrypted
without the Azure AD application parameters using the new release. To view instructions to enable VM
disk encryption using the new release, see Azure Disk Encryption for Windows VMS. VMs that were
already encrypted with Azure AD application parameters are still supported and should continue to be
maintained with the AAD syntax.
You can enable many disk-encryption scenarios, and the steps may vary according to the scenario. The following
sections cover the scenarios in greater detail for Windows IaaS VMs. Before you can use disk encryption, the
Azure Disk Encryption prerequisites need to be completed.
IMPORTANT
You should take a snapshot and/or create a backup before disks are encrypted. Backups ensure that a recovery
option is possible if an unexpected failure occurs during encryption. VMs with managed disks require a backup before
encryption occurs. Once a backup is made, you can use the Set-AzVMDiskEncryptionExtension cmdlet to encrypt
managed disks by specifying the -skipVmBackup parameter. For more information about how to back up and restore
encrypted VMs, see Back up and restore encrypted Azure VM.
Encrypting or disabling encryption may cause a VM to reboot.
Select the VM, then click on Disks under the Settings heading to verify encryption status in the
portal. In the chart under Encryption, you'll see if it's enabled.
The following table lists the Resource Manager template parameters for new VMs from the Marketplace scenario
using Azure AD client ID:
PARAMETER DESCRIPTION
vmSize Size of the VM. Currently, only Standard A, D, and G series are
supported.
virtualNetworkName Name of the VNet that the VM NIC should belong to.
subnetName Name of the subnet in the VNet that the VM NIC should
belong to.
keyVaultURL URL of the key vault that the BitLocker key should be
uploaded to. You can get it by using the cmdlet
(Get-AzKeyVault -VaultName "MyKeyVault" -
ResourceGroupName
"MyKeyVaultResourceGroupName").VaultURI
or the Azure CLI
az keyvault show --name "MySecureVault" --query
properties.vaultUri
keyEncryptionKeyURL URL of the key encryption key that's used to encrypt the
generated BitLocker key (optional).
$KVRGname = 'MyKeyVaultResourceGroup';
$VMRGName = 'MyVirtualMachineResourceGroup';
$vmName = 'MySecureVM';
$aadClientID = 'My-AAD-client-ID';
$aadClientSecret = 'My-AAD-client-secret';
$KeyVaultName = 'MySecureVault';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
Encrypt a running VM using KEK to wrap the client secret: Azure Disk Encryption lets you specify an
existing key in your key vault to wrap disk encryption secrets that were generated while enabling
encryption. When a key encryption key is specified, Azure Disk Encryption uses that key to wrap the
encryption secrets before writing to Key Vault.
$KVRGname = 'MyKeyVaultResourceGroup';
$VMRGName = 'MyVirtualMachineResourceGroup';
$vmName = ‘MyExtraSecureVM’;
$aadClientID = 'My-AAD-client-ID';
$aadClientSecret = 'My-AAD-client-secret';
$KeyVaultName = 'MySecureVault';
$keyEncryptionKeyName = 'MyKeyEncryptionKey';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name
$keyEncryptionKeyName).Key.kid;
NOTE
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-
name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-
name].vault.azure.net/keys/[kekname]/[kek-unique-id]
Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the Get-
AzVmDiskEncryptionStatus cmdlet.
Disable disk encryption: To disable the encryption, use the Disable-AzureRmVMDiskEncryption cmdlet.
Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the az vm
encryption show command.
PARAMETER DESCRIPTION
keyVaultName Name of the key vault that the BitLocker key should be
uploaded to. You can get it by using the cmdlet
(Get-AzKeyVault -ResourceGroupName
<MyKeyVaultResourceGroupName>). Vaultname
or the Azure CLI command
az keyvault list --resource-group "MySecureGroup"
keyEncryptionKeyURL URL of the key encryption key that's used to encrypt the
generated BitLocker key. This parameter is optional if you
select nokek in the UseExistingKek drop-down list. If you
select kek in the UseExistingKek drop-down list, you must
enter the keyEncryptionKeyURL value.
Encrypt a running VM using KEK to wrap the client secret: Azure Disk Encryption lets you specify an
existing key in your key vault to wrap disk encryption secrets that were generated while enabling
encryption. When a key encryption key is specified, Azure Disk Encryption uses that key to wrap the
encryption secrets before writing to Key Vault. This example uses "All" for the -VolumeType parameter,
which includes both OS and Data volumes. If you only want to encrypt the OS volume, use "OS" for the -
VolumeType parameter.
$sequenceVersion = [Guid]::NewGuid();
$KVRGname = 'MyKeyVaultResourceGroup';
$VMRGName = 'MyVirtualMachineResourceGroup';
$vmName = 'MyExtraSecureVM';
$aadClientID = 'My-AAD-client-ID';
$aadClientSecret = 'My-AAD-client-secret';
$KeyVaultName = 'MySecureVault';
$keyEncryptionKeyName = 'MyKeyEncryptionKey';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name
$keyEncryptionKeyName).Key.kid;
NOTE
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string:
/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-
name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-
name].vault.azure.net/keys/[kekname]/[kek-unique-id]
$VMRGName = 'MyVirtualMachineResourceGroup'
$KVRGname = 'MyKeyVaultResourceGroup';
$AADClientID ='My-AAD-client-ID';
$KeyVaultName = 'MySecureVault';
$VMName = 'MySecureVM';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
# Fill in the certificate path and the password so the thumbprint can be set as a variable.
Enable encryption using certificate -based authentication and a KEK with Azure PowerShell
# Fill in 'MyVirtualMachineResourceGroup', 'MyKeyVaultResourceGroup', 'My-AAD-client-ID', 'MySecureVault,,
'MySecureVM’, and "KEKName.
$VMRGName = 'MyVirtualMachineResourceGroup';
$KVRGname = 'MyKeyVaultResourceGroup';
$AADClientID ='My-AAD-client-ID';
$KeyVaultName = 'MySecureVault';
$VMName = 'MySecureVM';
$keyEncryptionKeyName ='KEKName';
$KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname;
$diskEncryptionKeyVaultUrl = $KeyVault.VaultUri;
$KeyVaultResourceId = $KeyVault.ResourceId;
$keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid;
## Fill in the certificate path and the password so the thumbprint can be read and set as a variable.
# Enable disk encryption using the client certificate thumbprint and a KEK
Disable encryption
You can disable encryption using Azure PowerShell, the Azure CLI, or with a Resource Manager template.
Disable disk encryption with Azure PowerShell: To disable the encryption, use the Disable-Azure
RmVMDiskEncryption cmdlet.
Disable encryption with the Azure CLI: To disable encryption, use the az vm encryption disable
command.
Next steps
Azure Disk Encryption overview
Setting up WinRM access for Virtual Machines in
Azure Resource Manager
11/13/2019 • 3 minutes to read • Edit Online
Here are the steps you need to take to set up a VM with WinRM connectivity
1. Create a Key Vault
2. Create a self-signed certificate
3. Upload your self-signed certificate to Key Vault
4. Get the URL for your self-signed certificate in the Key Vault
5. Reference your self-signed certificates URL while creating a VM
$certificateName = "somename"
$jsonObject = @"
{
"data": "$filecontentencoded",
"dataType" :"pfx",
"password": "<password>"
}
"@
$jsonObjectBytes = [System.Text.Encoding]::UTF8.GetBytes($jsonObject)
$jsonEncoded = [System.Convert]::ToBase64String($jsonObjectBytes)
Step 4: Get the URL for your self-signed certificate in the Key Vault
The Microsoft.Compute resource provider needs a URL to the secret inside the Key Vault while provisioning the
VM. This enables the Microsoft.Compute resource provider to download the secret and create the equivalent
certificate on the VM.
NOTE
The URL of the secret needs to include the version as well. An example URL looks like below
https://contosovault.vault.azure.net:443/secrets/contososecret/01h9db0df2cd4300a20ence585a6s7ve
Templates
You can get the link to the URL in the template using the below code
PowerShell
You can get this URL using the below PowerShell command
Enable-PSRemoting -Force
NOTE
You might need to make sure the WinRM service is running if the above does not work. You can do that using
Get-Service WinRM
Once the setup is done, you can connect to the VM using the below command
Access management for cloud resources is a critical function for any organization that is using the cloud. Role-
based access control (RBAC ) helps you manage who has access to Azure resources, what they can do with those
resources, and what areas they have access to.
RBAC is an authorization system built on Azure Resource Manager that provides fine-grained access management
of Azure resources.
User - An individual who has a profile in Azure Active Directory. You can also assign roles to users in other
tenants. For information about users in other organizations, see Azure Active Directory B2B.
Group - A set of users created in Azure Active Directory. When you assign a role to a group, all users within
that group have that role.
Service principal - A security identity used by applications or services to access specific Azure resources. You
can think of it as a user identity (username and password or certificate) for an application.
Managed identity - An identity in Azure Active Directory that is automatically managed by Azure. You typically
use managed identities when developing cloud applications to manage the credentials for authenticating to
Azure services.
Role definition
A role definition is a collection of permissions. It's typically just called a role. A role definition lists the operations
that can be performed, such as read, write, and delete. Roles can be high-level, like owner, or specific, like virtual
machine reader.
Azure includes several built-in roles that you can use. The following lists four fundamental built-in roles. The first
three apply to all resource types.
Owner - Has full access to all resources including the right to delegate access to others.
Contributor - Can create and manage all types of Azure resources but can’t grant access to others.
Reader - Can view existing Azure resources.
User Access Administrator - Lets you manage user access to Azure resources.
The rest of the built-in roles allow management of specific Azure resources. For example, the Virtual Machine
Contributor role allows a user to create and manage virtual machines. If the built-in roles don't meet the specific
needs of your organization, you can create your own custom roles for Azure resources.
Azure has data operations that enable you to grant access to data within an object. For example, if a user has read
data access to a storage account, then they can read the blobs or messages within that storage account. For more
information, see Understand role definitions for Azure resources.
Scope
Scope is the set of resources that the access applies to. When you assign a role, you can further limit the actions
allowed by defining a scope. This is helpful if you want to make someone a Website Contributor, but only for one
resource group.
In Azure, you can specify a scope at multiple levels: management group, subscription, resource group, or resource.
Scopes are structured in a parent-child relationship.
When you grant access at a parent scope, those permissions are inherited to the child scopes. For example:
If you assign the Owner role to a user at the management group scope, that user can manage everything in all
subscriptions in the management group.
If you assign the Reader role to a group at the subscription scope, the members of that group can view every