Localizar e excluir discos gerenciados e não gerenciados desanexados do Azure usando o Azure PowerShell
Aplica-se a: ✔️ VMs do Linux ✔️ VMs do Windows ✔️ Conjuntos de dimensionamento flexíveis ✔️ Conjuntos de dimensionamento uniformes
Quando você exclui uma VM (máquina virtual) no Azure, por padrão, nenhum disco anexado à máquina virtual é excluído. Esse recurso ajuda a evitar a perda de dados devido à exclusão não intencional de VMs. Depois que uma VM for excluída, você continuará a pagar pelos discos desanexados. Este artigo mostra como localizar e excluir discos desanexados e reduzir custos desnecessários.
Observação
Você pode usar o comando Get-AzureDisk para obter o LastOwnershipUpdateTime
para qualquer disco. Essa propriedade representa quando o estado do disco foi atualizado pela última vez. Para um disco não anexado, isso mostra a hora em que o disco foi desanexado. Essa propriedade fica em branco para discos recém-criados, até que seu estado seja alterado.
Discos gerenciados: Localizar e excluir discos desanexados
O script a seguir procura discos gerenciados desanexados examinando o valor da propriedade ManagedBy. Quando um disco gerenciado é anexado a uma VM, a propriedade ManagedBy contém a ID de recurso da VM. Quando um disco gerenciado é desanexado, a propriedade ManagedBy é nula. O script examina todos os discos gerenciados em uma assinatura do Azure. Quando o script localiza um disco gerenciado com a propriedade ManagedBy definida como null, o script determina que o disco está desanexado.
Importante
Primeiro, execute o script definindo a variável deleteUnattachedDisks como 0. Essa ação permite localizar e exibir todos os discos gerenciados desanexados.
Depois de examinar todos os discos desanexados, execute o script novamente e defina a variável deleteUnattachedDisks como 1. Essa ação permite excluir todos os discos gerenciados desanexados.
# 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
}
}
}
Discos não gerenciados: Localizar e excluir discos desanexados
Discos não gerenciados são arquivos VHD armazenados como blobs de páginas nas Contas de Armazenamento do Microsoft Azure. O script a seguir procura discos não gerenciados desanexados (blobs de página) examinando o valor da propriedade LeaseStatus. Se um disco não gerenciado estiver conectado a uma máquina virtual, a propriedadeLeaseStatus estará configurada como Locked. Quando um disco não gerenciado é desanexado, a propriedade LeaseStatus está definida como Unlocked. O script examina todos os discos não gerenciados em todas as contas de armazenamento do Azure em uma assinatura do Azure. Quando o script localiza um disco não gerenciado com uma propriedade LeaseStatus propriedade definida como Unlocked, o script determina que o disco está desanexado.
Importante
Primeiro, execute o script definindo a variável deleteUnattachedVHDs como $false
. Essa ação permite localizar e exibir todos os VHDs não gerenciados desanexados.
Depois de examinar todos os discos desanexados, execute o script novamente e defina a variável deleteUnattachedVHDs como $true
. Essa ação permite excluir todos os VHDs não gerenciados desanexados.
# 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 a Page blob is not attached as disk then LeaseStatus will be unlocked
if($_.ICloudBlob.Properties.LeaseStatus -eq 'Unlocked'){
if($deleteUnattachedVHDs){
Write-Host "Deleting unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
$_ | Remove-AzStorageBlob -Force
Write-Host "Deleted unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
}
else{
$_.ICloudBlob.Uri.AbsoluteUri
}
}
}
}
}
Próximas etapas
Para obter mais informações, confira Excluir uma conta de armazenamento e Identificar discos órfãos usando o PowerShell