Fernando Correia

Excluindo uma conta de armazenamento usada por uma VM

In Dicas on 14 set 2012 at 21:38

A minha resposta mais consultada no Stack Overflow é sobre como excluir uma conta de armazenamento que contém um blob bloqueado por uma máquina virtual.

Esta situação acontece quando você cria uma máquina virtual no Windows Azure (não confundir com VM Role) e depois você exclui esta máquina virtual. Ao olhar nas contas de armazenamento, você percebe que existe uma conta com um blob grande, de vários gigas. Em seguida você tenta excluir esta conta, para não gastar com o armazenamento deste blob, mas fica confuso quando aparece uma mensagem como esta:

Failed to delete Storage account ‘portalvhdscwtwycpsxxxxx’

Details:

Storage account portalvhdscwtwycpsxxxxx has 1 container(s) which have an active image and/or disk artifacts. Ensure those artifacts are removed from the image repository before deleting this storage account.

Se em vez de excluir a conta, você tentar excluir o próprio blob, você vai receber um erro como este:

There is currently a lease on the blob and no lease ID was specified in the request.

Este pequeno inconveniente tem um bom motivo. Uma máquina virtual do Azure tem dois componentes: um é o recurso de computação, que é o servidor virtual propriamente dito; outro é uma imagem de disco (padrão VHD) contendo o sistema operacional e espaço livre para armazenamento permanente de dados. Este disco virtual é criado no Blob Storage do Azure, para se beneficiar das características de alta disponibilidade e redundância local e remota que este serviço oferece.

Um disco virtual somente pode ser utilizado por uma única máquina virtual por vez; para garantir isto, o Azure reserva aquele blob para a máquina virtual associada. Acontece que quando você exclui uma máquina virtual, o blob continua reservado, e um blob reservado não pode ser excluído (por segurança, para evitar perda de dados). Isto é indicado na consulta da máquina virtual: há uma seção que relaciona os discos associados a ela:

Excluir uma máquina virtual não exclui os seus discos associados, até mesmo porque você pode querer criar outra máquina virtual e associá-la aos mesmos discos. Máquinas virtuais são descartáveis, mas os discos contém dados permanentes e uma vez apagados não podem ser recuperados. Ao excluir uma máquina virtual, o Azure avisa:

This operation will delete the virtual machine (…), while retaining the associated disks in your storage account.

Note que mesmo se você já tiver excluído a máquina virtual, o disco ainda aparece na seção “Disks” do grupo “Virtual Machines”, porque o blob ainda está associado.

Uma vez compreendido o que está acontecendo, a solução é simples. Antes de excluir este blob, você deve cancelar a reserva. Depois disto, ele se torna um blob comum, e pode ser excluído normalmente. Você também pode excluir a conta de armazenamento na qual ele foi criado (geralmente esta conta é criada junto com a máquina virtual e não tem mais nada além deste blob). Antes a conta não podia ser excluída porque havia um blob bloqueado dentro dela.

Primeiro você precisa remover o a associação entre o blob e o disco de máquinas virtuais:

  1. Ir para o site de gerenciamento.
  2. Clicar em Virtual Machines.
  3. Clicar em Disks.
  4. Clicar no disco a ser excluído.
  5. Clicar no botão Delete Disk.

Isto ainda não exclui o blob, apenas remove a sua associação. Agora ele está liberado para ser excluído. Entre no gerenciamento da conta de armazenamento e exclua o blob (dentro do container “vhds”) ou exclua a própria conta de armazenamento, se estiver seguro que não há mais nada nela que seja necessário manter.

A lição que eu tiro disto é que ao trabalhar na nuvem você precisa ficar atento aos recursos que está efetivamente consumindo. Se você esquecer uma máquina, um banco de dados ou uma imagem de disco que não precisa mais, você irá continuar pagando pelo consumo. O negócio é ficar de olho e conferir bem se está sendo usado apenas o realmente necessário.