Azure PowerShell を使用し、接続されていない Azure マネージド ディスクおよびアンマネージド ディスクを見つけて削除する

適用対象: ✔️ Linux VM ✔️ Windows VM ✔️ フレキシブル スケール セット ✔️ 均一スケール セット

Azure で仮想マシン (VM) を削除するとき、既定では、その VM に接続されているディスクはいずれも削除されません。 この機能は、意図せず VM を削除したことによるデータ損失を防ぐのに役立ちます。 VM が削除されたら、接続されていないディスクに対する料金の支払いに進みます。 この記事では、接続されていないディスクを見つけて削除し、不要なコストを削減する方法を示します。

Get-AzureDisk コマンドを使用して、任意のディスクのLastOwnershipUpdateTimeを取得できます。 このプロパティは、ディスクの状態が最後に更新された日時を表します。 接続されていないディスクの場合、この値はディスクが接続されなかった時刻を示します。 新しく作成されたディスクの場合、その状態が変わるまでこのプロパティは空白です。

マネージド ディスク: 接続されていないディスクを見つけて削除する

次のスクリプトは、ManagedBy プロパティの値を調べることにより、接続されていないマネージド ディスクを探します。 マネージド ディスクを VM に接続すると、 ManagedBy プロパティに VM のリソース ID が含まれます。 マネージド ディスクが接続されていないとき、ManagedBy プロパティは null です。 スクリプトは Azure サブスクリプションのすべてのマネージド ディスクを調べます。 スクリプトは、ManagedBy プロパティに null が設定されたマネージド ディスクを見つけると、そのディスクが接続されていないと判断します。

重要

まず、deleteUnattachedDisks 変数を 0 に設定してスクリプトを実行します。 この操作は、接続されていないすべてのマネージド ディスクを検索して表示します。

接続されていないすべてのディスクを確認したら、再びスクリプトを実行します。このときは deleteUnattachedDisks 変数を 1 に設定します。 このアクションにより、接続されていないマネージド ディスクがすべて削除されます。

# Set deleteUnattachedDisks=1 if you want to delete unattached managed disks
# Set deleteUnattachedDisks=0 if you want to see the Id of the unattached managed disks
$deleteUnattachedDisks=0
$managedDisks = Get-AzDisk
foreach ($md in $managedDisks) {
    # ManagedBy property stores the Id of the VM to which managed disk is attached to
    # If ManagedBy property is $null then it means that the managed disk is not attached to a VM
    if($md.ManagedBy -eq $null){
        if($deleteUnattachedDisks -eq 1){
            Write-Host "Deleting unattached managed disk with Id: $($md.Id)"
            $md | Remove-AzDisk -Force
            Write-Host "Deleted unattached managed disk with Id: $($md.Id) "
        }else{
            $md.Id
        }
    }
 }

非管理対象ディスク: 接続されていないディスクを見つけて削除する

アンマネージド ディスクはサポートされなくなりました。 アンマネージド ディスクを使用している場合は、マネージド ディスクに移行します。 詳細については、「 非管理対象ディスクをマネージド ディスクに移行する」を参照してください。

非管理対象ディスクは、Azure Storage アカウントページ BLOB として格納された VHD ファイルです。 次のスクリプトは、LeaseStatus プロパティの値を調べて、接続されていない非管理対象ディスク (ページ BLOB) を探します。 非管理対象ディスクが VM に接続されているとき、LeaseStatus プロパティは Locked に設定されています。 非管理対象ディスクが接続されていないとき、LeaseStatus プロパティは Unlocked に設定されています。 このスクリプトは、Azure サブスクリプションのすべての Azure ストレージ アカウントの非管理対象ディスクを調べます。 スクリプトは、LeaseStatus プロパティに Unlocked が設定された非管理対象ディスクを見つけると、そのディスクが接続されていないと判断します。

重要

このスクリプトでは、 deleteUnattachedVHDs 変数が 既定で $false に設定されています。 この設定を使用すると、接続されていないすべてのアンマネージド VHD を検索して表示できます。

接続されていないすべてのディスクを確認した後、これらの VHD をすべて削除する場合は、 deleteUnattachedVHDs 変数を $true に設定し、スクリプトをもう一度実行します。 このアクションにより、接続されていない VHD がすべて削除されます。

# Set deleteUnattachedVHDs=$true if you want to delete unattached VHDs
# Set deleteUnattachedVHDs=$false if you want to see the Uri of the unattached VHDs
$deleteUnattachedVHDs = $false
$storageAccounts = Get-AzStorageAccount
foreach ($storageAccount in $storageAccounts) {
    $storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageAccount.ResourceGroupName -Name $storageAccount.StorageAccountName)[0].Value

    $context = New-AzStorageContext -StorageAccountName $storageAccount.StorageAccountName -StorageAccountKey $storageKey

    $containers = Get-AzStorageContainer -Context $context

    foreach ($container in $containers) {
        $blobs = Get-AzStorageBlob -Container $container.Name -Context $context
        #Fetch all the Page blobs with extension .vhd as only Page blobs can be attached as disk to Azure VMs
        $blobs | Where-Object {$_.BlobType -eq 'PageBlob' -and $_.Name.EndsWith('.vhd')} | ForEach-Object {
            if ($_.BlobProperties.LeaseStatus -eq 'Unlocked') {
                if ($deleteUnattachedVHDs) {
                    Write-Host "Deleting unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
                    Remove-AzStorageBlob -Blob $_.Name -Container $container.Name -Context $context -Force
                    Write-Host "Deleted unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
                } else {
                    Write-Host "Unattached VHD Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
                }
            }
        }
    }
}

次のステップ

詳細については、「 ストレージ アカウントを削除する 」および「 PowerShell を使用して孤立したディスクを識別する」を参照してください。