Azure VMと一緒にディスクやNICも纏めて削除
仮想マシン(Azure VM)削除時にディスク(Managed Disks)やネットワークインターフェースといった関連を纏めて削除できれば便利かも?という事で試してみました。
仮想マシン(Azure VM)のリソースを指定すれば一緒に関連アイテムも削除するPowerShellを作ってみました。
今回のPower Shellの削除対象はこちらの4つになります。
複数接続されていても一緒に削除できるようにしています。
-
-
- 仮想マシン(Azure VM)
- ディスク(Managed Disks)
- ネットワークインターフェース
- パブリックIP
-
ディスクやネットワークインターフェース関連はこちらでも試しております。併せて見て頂ければと。
ロックの機能についてはこちら。
仮想マシン(Azure VM)と一緒にディスク(Managed Disks)やネットワークインターフェースをまとめて削除するPowerShell
マイクロソフト公式サイトの情報を参考にして仮想マシン名を指定すれば関連アイテムの情報を取得して一緒に削除するPowerShellを作成してみました。
PowerShell を使用してサブスクリプション内のすべての VM に関する詳細情報を収集する(公式サイト)
こちらのサンプルではディスク情報が取得されていないので追加しています。
実際のPowerShellの流れは、こちらの通りになります。
-
-
- 削除対象となる仮想マシン(Azure VM)の名前やリソースグループ名をパラメータとして指定する
- 削除対象となるディスク(Managed Disks)やネットワークインターフェースパブリックIPの情報を取得する
- 削除対象となる情報を表示する(確認用)
- 削除処理を実行する
-
先に仮想マシン(Azure VM)を削除してしまうと、仮想マシン(Azure VM)と関連付けされていたネットワークインターフェース等が分からなくなる為先に情報を取得しています。
ネットワークインターフェースやディスク(Managed Disks)は仮想マシン(Azure VM)のIDと合致するものを条件に抽出しています。
表示する為の情報を$infoや$reportに格納しています。(必要なければ削除でもOKかと思います。)
#仮想マシンを関連リソースと一緒に削除するPower Shell
$param (
[String] [Parameter(Mandatory=$true)] $resourceGroupName,
[String] [Parameter(Mandatory=$true)] $VMName
)
$vms = Get-AzVM -ResourceGroupName $resourceGroupName -Name $VMName
$report = @()
$publicIps = Get-AzPublicIpAddress
Foreach ($vm in $vms){
$info = “" | Select VmName, ResourceGroupName, PublicIPName, NicName, DiskName
$nics = Get-AzNetworkInterface | Where { $_.VirtualMachine.id -contains $vm.id}
$disks = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName | Where { $_.ManagedBy -contains $vm.id }
foreach($publicIp in $publicIps) {
if($nics.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
$info.PublicIPName = $publicIp.Name
}
}
$info.VMName = $vm.Name
$info.ResourceGroupName = $vm.ResourceGroupName
$info.NicName = $nics.Name
$info.DiskName = $disks.Name
$report+=$info
}
Write-Host “"
Write-Host “削除対象はこちらのアイテムになります。"
$report | ft VmName, ResourceGroupName, PublicIPName, NicName, DiskName
#VMを削除します。
Write-Host “VMを削除します:$($VMName)"
Remove-AzVM -ResourceGroupName $resourceGroupName -Name $VMName
#関連アイテムの削除確認。確認のみの場合は0を指定
$deletecheck = 1
#Nicを削除します。
foreach ($DeleteNic in $nics) {
if($deletecheck -eq 1){
Write-Host “Deleting NicName: $($DeleteNic.Name)"
$DeleteNic | Remove-AzNetworkInterface
}else{
Write-Host “Deleting NicName: $($DeleteNic.Name)"
}
}
#Diskを削除します。
foreach ($DeleteDisk in $disks) {
if($deletecheck -eq 1){
Write-Host “Deleting DiskName: $($DeleteDisk.Name)"
$DeleteDisk | Remove-AzDisk
}else{
Write-Host “Deleting DiskName: $($DeleteDisk.Name)"
}
}
#PublicIPを削除します。
foreach ($DeletePublicIP in $publicIp) {
if($deletecheck -eq 1){
Write-Host “Deleting PublicIPName: $($DeletePublicIP.Name)"
$DeletePublicIP | Remove-AzPublicIpAddress
}else{
Write-Host “Deleting PublicIPName: $($DeletePublicIP.Name)"
}
}
|
仮想マシン(Azure VM)とネットワークインターフェースとディスクを一緒に削除
作成したPowerShellを実行してみました。実行時の条件はこんな感じになります。
-
-
- 対象の仮想マシンとリソースグループ名をパラメータとして指定する
- 関連アイテムを一緒に削除しない場合はPowerShellの$deletecheck = 0にします。
- 確認メッセージを表示しない場合は各削除コマンドに-Forceをつけて下さい。
-
今回、削除対象の仮想マシン(Azure VM)はこちらになります。
-
-
- 仮想マシン(Azure VM)名
- TEST-VM
- ネットワークインターフェース名
- TEST-VM-NIC2
- test-vm751
- ディスク(Managed Disks)名
- TEST-VM_DataDisk_0
- TEST-VM_OsDisk_1
- パブリックIPアドレス名
- TEST-VM-ip
- 仮想マシン(Azure VM)名
-
実行コマンドはこのような形になります。
PowerShell名.ps1 -resourceGroupName リソースグループ名 -VMName VM名
今回はこのように実行します。
PowerShell名.ps1 -resourceGroupName RG-1 -VMName TEST-VM
実行結果はこんな感じになります。今回は-Forecをつけていませんので削除確認メッセージが表示されます。
削除対象はこちらのアイテムになります。 VmName ResourceGroupName PublicIPName NicName DiskName VMを削除します:TEST-VM Deleting NicName: TEST-VM-NIC2 Deleting DiskName: TEST-VM_DataDisk_0 Deleting DiskName: TEST-VM_OsDisk_1 Deleting PublicIPName: TEST-VM-ip |
Azure Portal上で確認しても削除されている事が確認出来ました。
もう少し改良できそうなので、随時試してみたい所です。