Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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"
    }
}
KazukiKusaya
SIerにてAzureインフラ基盤の設計/構築を生業としてます。
https://www.michikusayan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away