删除 VM 后从 Azure 资源管理器中删除 VHD

Removing VHD's from Azure Resource Manager after removing VM

我注意到,如果您创建一个新的 VM 然后删除它(及其关联的资源),您实际上 而不是 删除相应的 VHD 文件-- 该文件留在 blob 存储中,阻止了使用相同主机名的新机器的配置,并且还为浪费和未使用的存储花费了真金白银。我希望将 VHD 与 VM 一起删除。

我在哪里可以找到有关如何处理此问题的 当前 智慧的好文章?我能找到的是 2013 年之前的参考资料,这些参考资料显然针对 "classic" 版本。

我编写了以下代码来尝试补救这种情况。我有两个用例,首先我必须清除所有累积的垃圾,然后我 "just" 需要确保在每台未来的机器被删除后进行清理。

write-output("Removing orphaned disks for hostname ""$hostname"" ...")
$storageContext = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -match $azureStorage}).Context
$storageBlob = Get-AzureStorageBlob -Context $storageContext -Container "vhds"
$vhdList = $storageBlob | Where-Object{$_.Name -match "$hostname"}
foreach($disk in $vhdList) {
    $diskname = $disk.Name
    write-output("Removing VHD ""$diskname"" ...")
    Remove-AzureDisk -Diskname "$diskname" -DeleteVHD
    write-output("Removed VHD ""$diskname"" ... [OK]")
}
write-output("Removed orphaned disks ... [OK]")

现在,当我 运行 时,我得到了我希望看到的 VHD 文件的漂亮列表(以及一些相应的“*.status”文件)。但是,Remove-AzureDisk 命令会产生错误 Remove-AzureDisk : ResourceNotFound: The disk with the specified name does not exist,所以它并没有真正起作用。

您会注意到我在中途从新的 "ARM" 命令切换到 "classic" 版本 -- 这可能是我的问题的一部分,但我没有运气想出更好的命令。

更新:

这似乎可以解决问题:

# Verify that the OS VHD does not already exist
write-output("Checking for blocking VHD's ...")
$storageContext = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -match $azureStorage}).Context
$storageBlob = Get-AzureStorageBlob -Context $storageContext -Container "vhds"
$vhdList = $storageBlob | Where-Object{$_.Name -match "$hostname"}
if ($vhdList) {
    write-output("There is an existing VHD blocking host ""$hostname"" in storage container ""$($storageContext.BlobEndPoint)vhds""):")
    foreach($vhdName in $vhdList.Name) {
        write-output("- $vhdName")
    }
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
    $answer = [System.Windows.Forms.MessageBox]::Show("There is an existing VHD blocking host ""$hostname"" in storage container ""$($storageContext.BlobEndPoint)vhds"").`nDo you wish to remove the existing VHD file?" , "Create New VM" , $MB_YESNO)
    if ($answer -eq "YES" ) {
        # Remove VHD files
        foreach($diskName in $vhdList.Name) {
            write-output("- Removing VHD ""$diskName""")
            Remove-AzureStorageBlob -Blob $diskName -Container "vhds" -Context $storageContext
        }
        write-output("Checked for blocking VHD's ... [OK]")
    } else {
        exit(331)
    }
}

Azure 资源管理的一般智慧是,您不再以原子单元(如 VM、存储、网络)来考虑资源,而是开始将它们视为一组资源。可以说是一个资源组 ;)

理论是您创建一个模板,通过 Rest、Powershell 或模板文件一次性创建整个部署。

然后,您无需删除 VM 并重新创建它,而是删除整个资源组,然后 运行 再次部署,您将回到原来的位置。

它确实使整个事情更易于管理,并允许进行更复杂的构建。

使用该模型,如果删除整个资源组,则所有基础资源、blob、存储帐户、网络都将被删除。

所以,关于你的问题。

Azure 不像经典管理器那样创建磁盘。基本上,您将机器指向一个 blob vhd,仅此而已。所以你的命令的问题是没有任何磁盘可以删除。

所以你想要的命令

Remove-AzureStorageBlob -Blob $diskname -Container vhds -Context $context 

检查服务器时钟和客户端时钟

存储服务确保请求到达服务时不早于 15 分钟。这可以防止某些安全攻击,包括重放攻击。当此检查失败时,服务器 returns 响应代码 403(禁止访问)。