Azure仮想マシン一括削除用スクリプト

#はじめに
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"
    }
}
```