Partilhar via


Localizar e excluir discos gerenciados e não gerenciados do Azure não anexados usando o Azure PowerShell

Aplica-se a: ✔️ VMs ✔️ Linux VMs ✔️ do Windows Conjuntos ✔️ de escala flexíveis Conjuntos de balanças uniformes

Quando você exclui uma máquina virtual (VM) no Azure, por padrão, todos os discos anexados à VM não são excluídos. Esta funcionalidade ajuda a prevenir a perda de dados devido à eliminação não intencional de VMs. Depois que uma VM for excluída, você continuará a pagar por discos não conectados. Este artigo mostra como localizar e excluir discos desconectados e reduzir custos desnecessários.

Nota

Você pode usar o comando Get-AzureDisk para obter o LastOwnershipUpdateTime para qualquer disco. Esta propriedade representa quando o estado do disco foi atualizado pela última vez. Para um disco desconectado, isso mostra a hora em que o disco foi desconectado. Esta propriedade fica em branco para discos recém-criados, até que seu estado mude.

Discos gerenciados: localizar e excluir discos não conectados

O script a seguir procura discos gerenciados não anexados examinando o valor da propriedade ManagedBy. Quando um disco gerenciado é anexado a uma VM, a propriedade ManagedBy contém a ID do recurso da VM. Quando um disco gerenciado é desanexado, a propriedade ManagedBy é null. 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. Esta ação permite localizar e visualizar todos os discos gerenciados desanexados.

Depois de revisar 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 não conectados.

# 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 geridos: localizar e eliminar discos desanexados

Discos não gerenciados são arquivos VHD armazenados como blobs de página em contas de armazenamento do Azure. O script a seguir procura discos não gerenciados não anexados (blobs de página) examinando o valor da propriedade LeaseStatus . Quando um disco não gerenciado é anexado a uma VM, a propriedade LeaseStatus é definida como Locked. Quando um disco não gerenciado é desanexado, a propriedade LeaseStatus é definida como Desbloqueado. 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 definida como Desbloqueado, o script determina que o disco está desanexado.

Importante

Primeiro, execute o script definindo a variável deleteUnattachedVHDs como $false. Esta ação permite localizar e visualizar todos os VHDs não gerenciados não conectados.

Depois de revisar 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 não anexados.

# 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óximos passos

Para obter mais informações, consulte Excluir uma conta de armazenamento e Identificar discos órfãos usando o PowerShell