In Azure delete VM is an easy task. Just go to the VM and click “Delete” on the menu. The issue is that only deletes the Virtual Machine resource, it does not delete the dependant child resources such as disk and network interface. Obviously you can manually delete each child resource but that is time consuming and…well manual. This is where PowerShell comes in.
If you don’t have the PowerShell Az module already installed then you can follow this Microsoft document: Install Azure PowerShell
The first job is to connect or login to your Azure account. If you have access to multiple subscriptions you also need to set which subscription to work with. Use the commands below to login and set your subscription scope for the session:
Connect-AzAccount Get-AzSubscription Set-AzContext -Subscription "subscriptionId"
Once connected you can press on with Azure delete VM. Firstly get the VM object into a variable: $vm = Get-AzVm -Name "vmName"
Now you have the VM object in a variable, use it to find and stop the VM backup (if one exists). If you don’t do this step then you get backup alerts for failed backups because the VM no longer exists when a backup schedule tries to run.
Foreach ($bkpvlt in Get-AzRecoveryServicesVault) { $bkpctr = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVM -VaultId $bkpvlt.ID -FriendlyName $vm.Name if ($bkpctr) { $vltid = $bkpvlt.ID } } if ($bkpctr) { $bkpitm = Get-AzRecoveryServicesBackupItem -Container $bkpctr -WorkloadType AzureVM -VaultId $vltid Disable-AzRecoveryServicesBackupProtection -Item $bkpitm -VaultId $vltid -Force } else { Write-Warning -Message 'No backup found for VM' }
Now the backup has been stopped (and data retained) proceed to delete VM: $vm | Remove-AzVM -Force
With the VM deleted, you can delete the network adapter and Public IP address (if exists):
Foreach ($nicUri in $vm.NetworkProfile.NetworkInterfaces.Id) { $nic = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicUri.Split('/')[-1] Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $vm.ResourceGroupName -Force Foreach ($ipConfig in $nic.IpConfigurations) { if($ipConfig.PublicIpAddress -ne $null) { Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('/')[-1] -Force } } }
Final task, for this post at least is to delete any VM disks. This will delete any managed disks on the VM along with any data disks.
Get-AzDisk | where { $_.ManagedBy -eq $vm.Id } | Remove-AzDisk -Force if ('DataDiskNames' -in $vm.PSObject.Properties.Name -and @($vm.DataDiskNames).Count -gt 0) { Foreach ($uri in $vm.StorageProfile.DataDisks.Vhd.Uri) { $dataDiskStorageAcct = Get-AzStorageAccount -Name $uri.Split('/')[2].Split('.')[0] $dataDiskStorageAcct | Remove-AzStorageBlob -Container $uri.Split('/')[-2] -Blob $uri.Split('/')[-1] } }
Combine all those commands into a script to quickly and easily Azure delete VM and child resources. Feel free to add more commands to delete other resources too. You could add a check to see if the resource group is left empty post Azure delete VM, if so that could be deleted too.
I am one of the follower of your blog and found great content on your website. Keep up the good work. I am also SEO consultant at Betasnews