Удаление виртуальных жестких дисков из Azure Resource Manager после удаления виртуальной машины

До моего сведения было доведено, что если вы создаете новую виртуальную машину, а затем удаляете ее (и связанные с ней ресурсы), вы фактически не удаляете соответствующий VHD-файл — этот файл остается в большом двоичном объекте. хранилище, блокируя предоставление новой машины с тем же именем хоста, а также тратя реальные деньги на потраченное впустую и неиспользуемое хранилище. Я хочу удалить виртуальные жесткие диски вместе с виртуальными машинами.

Где я могу найти хороший обзор современных советов о том, как с этим бороться? Все, что я могу найти, это ссылки до 2013 года, которые явно нацелены на «классическую» версию.

Я написал следующий код, чтобы попытаться исправить эту ситуацию. У меня есть два варианта использования, во-первых, я должен избавиться от всего накопившегося хлама, а после этого мне «просто» нужно обязательно очищать после каждой будущей машины при ее удалении.

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» на «классическую» версию на полпути — это, вероятно, часть моей проблемы, но мне не повезло придумать лучшие команды.

Обновление:

Кажется, это помогает:

# 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)
    }
}

person KlaymenDK    schedule 04.02.2016    source источник
comment
Как удалить виртуальную машину? какую команду вы используете?   -  person Michael B    schedule 04.02.2016
comment
Для пробы удаляю ВМ через веб-интерфейс. Насколько я (с недавнего времени) понимаю, это имеет неприятный эффект, заключающийся в том, что VHD остается на месте.   -  person KlaymenDK    schedule 05.02.2016


Ответы (2)


Общая мудрость Azure Resource Management заключается в том, что вы перестаете думать о ресурсах в атомарных единицах, таких как виртуальные машины, хранилище, сети, и вместо этого начинаете думать о них как о группе ресурсов. Ресурсная группа, так сказать ;)

Теоретически вы создаете шаблон, который создает все развертывание за один раз либо через Rest, Powershell, либо через файл шаблона.

затем вместо удаления виртуальной машины и ее повторного создания вы удаляете всю группу ресурсов и снова запускаете развертывание, и вы вернетесь именно туда, где вы были.

Это делает все это гораздо более управляемым и позволяет создавать гораздо более сложные сборки.

При использовании этой модели при удалении всей группы ресурсов будут удалены все базовые ресурсы, большие двоичные объекты, учетные записи хранения и сети.

Итак, к вашей проблеме.

Azure не создает диски так, как это делал классический менеджер. В основном вы указываете машине на blob vhd и все. Итак, проблема с вашей командой в том, что нет диска для удаления.

Итак, команда, которую вы хотели бы

Remove-AzureStorageBlob -Blob $diskname -Container vhds -Context $context 
person Michael B    schedule 04.02.2016
comment
Я думал о том, чтобы сделать именно это (одна выделенная группа ресурсов для каждой виртуальной машины), но установка, которую мне дали в настоящее время, вращается вокруг множества виртуальных машин в одной группе. Однако весьма вероятно, что я могу оспорить это, особенно учитывая такую ​​хорошую мотивацию. - person KlaymenDK; 05.02.2016
comment
вам специально нужно добавлять и удалять виртуальные машины независимо друг от друга? Есть ли какие-либо группы, которые вы можете использовать вокруг них. Чем больше вы сможете разбить их на группы, которые впоследствии сможете рассматривать как единое целое, тем проще будет управление. - person Michael B; 05.02.2016
comment
Да, индивидуально; это тестовые машины, на которых запущены (независимые) наборы тестов. Будет ли проблема иметь 50-100 групп ресурсов одновременно, плюс небольшой оборот? - person KlaymenDK; 05.02.2016
comment
Я удалил группу ресурсов. Список VHD не изменяется. :-( Я не думаю, что этот подход сработает. Должна быть какая-то форма формального правильного подхода, который (очевидно) неочевиден. - person KlaymenDK; 05.02.2016
comment
@klaymendk есть лучший способ, вы можете использовать наборы масштабов vm, если вы опубликуете новый вопрос с описанием вашей проблемы, я напишу правильный ответ, когда вернусь к клавиатуре! - person Michael B; 05.02.2016
comment
Спасибо, это очень мило с твоей стороны. Но актуальны ли масштабные наборы? Я имею в виду, что это не одна рабочая нагрузка, которую нужно масштабировать, это совершенно отдельные блоки, выполняющие отдельные задачи (через MS Test Manager). - person KlaymenDK; 05.02.2016
comment
@klaymendk это не совсем то, как они предназначены для использования, и мне нужно проверить пару вещей (когда я не на мобильном телефоне!) Но я думаю, что с небольшим убеждением они могли бы сделать именно то, что вы ищу (конечно, я вполне мог ошибаться, и вам, возможно, просто нужно было написать все это целиком) - person Michael B; 05.02.2016
comment
Давайте продолжим обсуждение в чате. - person Michael B; 05.02.2016

Проверьте часы сервера и часы клиента

Службы хранения гарантируют, что запрос не старше 15 минут к моменту поступления в службу. Это защищает от определенных атак безопасности, включая атаки воспроизведения. Если эта проверка не проходит, сервер возвращает код ответа 403 (Запрещено).

person Mohamed.Radwan -MVP    schedule 05.02.2016
comment
Я немного смущен тем, как это относится к вопросу? - person Michael B; 05.02.2016
comment
Я предполагаю, что он не может найти ресурсы, когда устал удалять с помощью Remove-AzureDisk, возможно, из-за часов, поэтому просто дважды проверьте эту часть. - person Mohamed.Radwan -MVP; 05.02.2016
comment
Это потому, что это была машина ARM, и у них нет дисков;) - person Michael B; 05.02.2016