#はじめに
Azureの良いところとして、検証をしたいときに仮想マシンを作成し、完了したら削除できるという使い勝手の良さがあると思います。
ただ、作成時には複数のリソースを自動で組み合わせてデプロイしてくれますが、
削除時には仮想マシン、ディスク、ネットワークインターフェースのそれぞれを削除する必要があり、
手間だなぁと感じることがあるため、まとめて削除してくれるスクリプトを作成してみました。
VM選択のところは、以下の「Japan Azure IaaS Support Blog」の記事を参考にしています。
https://blogs.technet.microsoft.com/jpaztech/2016/06/08/addavasetvmarm/
2019/4/3追記
「AzureRm」モジュールを用いたスクリプトでしたが「Az」コマンドに置き換えました。
動作に変更はありません。
#スクリプトの流れ
本記事のスクリプトを実行すると、以下の流れでVM削除、ネットワークインターフェース削除、ディスク削除の処理を行います。
ディスクは非管理ディスク(VHD)と管理ディスクのどちらにも対応しています。
※パブリックIPは仮想マシンやNICの情報から紐づきを辿ることができず、削除されません。。。
#手順
必要に応じて以下のパラメータ(変数)の値を編集し、スクリプトを実行します。
管理ディスクはスクリプト完了から削除まで、若干ラグがあります。
※ログインユーザーにはAzureADユーザーを使用すること(MSアカウントの場合Get-Credentialでのログイン不可)
※仮想マシンおよび接続するディスク(VHD、ディスク)が同一リソースグループであること
※削除はForceオプション付きなので対象を間違えないように注意
変数 | 入力する値 |
---|---|
$UserName | 使用するAzureADユーザーアカウント名。空文字でも可。(毎回ユーザーアカウントを入力するのが面倒な人用) |
#スクリプト
#
#Delete_VM
#
#-----------------------------------------------------
$ErrorActionPreference = "Stop"
$UserName = "kkusaya@jbs.com"
$Credential = Get-Credential -UserName $UserName -Message "Input Azure Account Password"
Connect-AzAccount -Credential $Credential
#Select Subscription
$Subscription = (Get-AzSubscription | Out-GridView -Title "Select an Azure Subscription ..." -PassThru).Name
Select-AzSubscription -Subscription $Subscription
#Get ResourceGroup Name
$ResourceGroup = (Get-AzResourceGroup |Out-GridView -Title "Select an Azure Resource Group ..." -PassThru).ResourceGroupName
#Get Target VM Name
$TargetVMName = (Get-AzVm -ResourceGroupName $ResourceGroup).Name |Out-GridView -Title "Select a VM ..." -PassThru
#Get Target VM Object
$VM = Get-AzVM -ResourceGroupName $ResourceGroup -Name $TargetVMName
#Get Parameter to judge Managed or UnManaged
$VMvhdValue = $VM.StorageProfile.OsDisk.Vhd.Uri
$VMdiskValue = $VM.StorageProfile.OsDisk.ManagedDisk.Id
#Deleting VM
Write-Host "VM Name:$TargetVMName"
Remove-AzVM -Name $TargetVMName -ResourceGroupName $ResourceGroup -Force
Write-Host "Delete VM"
#Delete NIC
$NICs = $VM.NetworkProfile.NetworkInterfaces.id
$NICs|ForEach-Object{
$NICName = $_.Split("/")[-1]
Write-Host "NIC Name:$NICName"
Remove-AzNetworkInterface -Name $NICName -ResourceGroupName $ResourceGroup -Force
Write-Host "Delete NIC"
}
#Delete Disk or VHD
if($VMvhdValue -and !$VMdiskValue){
#VHD VM
#Get Storage Context
$StorageAccountName = $VM.StorageProfile.OsDisk.Vhd.Uri.Split("/")[2].Split(".")[0]
$OSDiskName = $VM.StorageProfile.OsDisk.Vhd.Uri.Split("/")[4]
$ContainerName = $VM.StorageProfile.OsDisk.Vhd.Uri.Split("/")[3]
$StorageKey = (Get-AzStorageAccountKey -ResourceGroupName $ResourceGroup -Name $StorageAccountName).value[0]
$Context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageKey
#Delte OS Disk
Write-Host "StorageAccount Name:$StorageAccountName"
Write-Host "VHD Name:$OSDiskName"
Remove-AzureStorageBlob -Container $ContainerName -Blob $OSDiskName -Context $Context -Force
Write-Host "Delete VHD"
#Delete Data Disk
$DataDisks = $VM.StorageProfile.DataDisks
$DataDisks|ForEach-Object{
$DiskName = $_.Name + ".vhd"
Write-Host "Disk Name:$DiskName"
Remove-AzureStorageBlob -Container $ContainerName -Blob $DiskName -Context $Context -Force
Write-Host "Delete Disk"
}
}elseif(!$VMvhdValue -and $VMdiskValue){
#Managed VM
#Delete OS Disk
$DiskName = $VM.StorageProfile.OsDisk.Name
Write-Host "Disk Name:$DiskName"
Remove-AzDisk -ResourceGroupName $ResourceGroup -DiskName $DiskName -Force
Write-Host "Delete Disk"
#Delete Data Disk
$DataDisks = $VM.StorageProfile.DataDisks
$DataDisks|ForEach-Object{
$DiskName = $_.Name
Write-Host "Disk Name:$DiskName"
Remove-AzDisk -ResourceGroupName $ResourceGroup -DiskName $DiskName -Force
Write-Host "Delete Disk"
}
}