Compartilhar via


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