Gerenciar blobs de bloco com a CLI do Azure
O armazenamento de blobs suporta blobs de blocos, blobs de acréscimo e blobs de páginas. Os blobs de bloco são otimizados para carregar grandes quantidades de dados de forma eficiente. Os blobs de bloco são ideais para armazenar imagens, documentos e outros tipos de dados não submetidos a operações aleatórias de leitura e gravação. Este artigo explica como trabalhar com blobs de bloco.
Pré-requisitos
Para acessar o Armazenamento do Azure, você precisará de uma assinatura do Azure. Se ainda não tiver uma subscrição, crie uma conta gratuita antes de começar.
Todo o acesso ao Armazenamento do Azure ocorre por meio de uma conta de armazenamento. Para este início rápido, crie uma conta de armazenamento usando o portal do Azure, o Azure PowerShell ou a CLI do Azure. Para obter ajuda para criar uma conta de armazenamento, consulte Criar uma conta de armazenamento.
Prepare o seu ambiente para o CLI do Azure
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.
Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.
Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.
Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.
- Este artigo requer a versão 2.0.46 ou posterior da CLI do Azure. Se estiver usando o Azure Cloud Shell, a versão mais recente já está instalada.
Autorizar o acesso ao armazenamento de Blob
Você pode autorizar o acesso ao armazenamento de Blob a partir da CLI do Azure com credenciais do Microsoft Entra ou usando uma chave de acesso de conta de armazenamento. O uso de credenciais do Microsoft Entra é recomendado, e os exemplos deste artigo usam exclusivamente o Microsoft Entra ID.
Os comandos da CLI do Azure para operações de dados no armazenamento de Blob dão suporte ao --auth-mode
parâmetro, que permite especificar como autorizar uma determinada operação. Defina o --auth-mode
parâmetro para fazer logon para autorizar com as credenciais do Microsoft Entra. Somente as operações de dados de armazenamento de Blob suportam o --auth-mode
parâmetro. As operações de gerenciamento, como a criação de um grupo de recursos ou uma conta de armazenamento, usam automaticamente as credenciais do Microsoft Entra para autorização. Para obter mais informações, consulte Escolher como autorizar o acesso a dados de blob com a CLI do Azure.
Execute o login
comando para abrir um navegador e conectar-se à sua assinatura do Azure.
az login
Criar um contentor
Todos os dados de blob são armazenados em contêineres, portanto, você precisará de pelo menos um recurso de contêiner antes de poder carregar dados. Se necessário, use o exemplo a seguir para criar um contêiner de armazenamento. Para obter mais informações, consulte Gerenciando contêineres de blob usando a CLI do Azure.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
# Create a container object
az storage container create \
--name $containerName \
--account-name $storageAccount
--auth-mode login
Ao usar os exemplos incluídos neste artigo, você precisará substituir os valores de espaço reservado entre colchetes por seus próprios valores. Para obter mais informações sobre como entrar no Azure com a CLI do Azure, consulte Entrar com a CLI do Azure.
Carregar blobs
A CLI do Azure oferece comandos que executam operações em um ou em vários recursos, dependendo de suas necessidades.
Para carregar um arquivo para um blob de bloco, passe os valores de parâmetro necessários para o az storage blob upload
comando. Forneça o caminho de origem e o nome do arquivo com o --file
parâmetro e o nome do contêiner de destino com o --container-name
parâmetro. Você também precisará fornecer o --account-name
parâmetro. Este comando cria um novo blob ou substitui o blob original, se ele já existir.
Você pode usar o az storage blob upload-batch
comando para carregar recursivamente vários blobs em um contêiner de armazenamento. Você pode usar a correspondência de padrão de nome de arquivo Unix especificar um intervalo de arquivos para carregar com o --pattern
parâmetro. Os padrões suportados são *
, ?
, [seq]
, e [!seq]
. Para saber mais, consulte a documentação do Python sobre correspondência de padrão de nome de arquivo Unix.
No exemplo a seguir, a primeira operação usa o az storage blob upload
comando para carregar um único arquivo nomeado. O arquivo de origem e o contêiner de armazenamento de destino são especificados com os --file
parâmetros e --container-name
.
A segunda operação demonstra o uso do az storage blob upload-batch
comando para carregar vários arquivos. O --if-modified-since
parâmetro garante que apenas os arquivos modificados nos últimos sete dias serão carregados. O valor fornecido por este parâmetro deve ser fornecido no formato UTC.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
lastModified=$(date +%Y:%m:%d -d "7 days ago")
path="C:\\temp\\"
filename="demo-file.txt"
imageFiles="*.png"
file="$path$filename"
#Upload a single named file
az storage blob upload \
--file $file \
--container-name $containerName \
--account-name $storageAccount \
--auth-mode login
#Upload multiple image files recursively
az storage blob upload-batch \
--destination $containerName \
--source $path \
--pattern *.png \
--account-name $storageAccount \
--auth-mode login \
--if-modified-since $lastModified
Listar blobs
Por padrão, o az storage blob list
comando lista todos os blobs armazenados em um contêiner. Você pode usar várias abordagens para refinar o escopo da sua pesquisa. Não há restrição quanto ao número de contêineres ou blobs que uma conta de armazenamento pode ter. Para potencialmente evitar a recuperação de milhares de blobs, é uma boa ideia limitar a quantidade de dados retornados.
Use o --prefix
parâmetro para selecionar um único arquivo conhecido ou um intervalo de arquivos cujos nomes comecem com uma cadeia de caracteres definida. Você pode especificar um diretório virtual como parte do --prefix
parâmetro.
Por padrão, apenas blobs são retornados em uma operação de listagem. Em alguns cenários, talvez você queira passar um valor para o --include
parâmetro para retornar tipos adicionais de objetos, como blobs excluídos por software, instantâneos e versões. Esses valores podem ser combinados para retornar vários tipos de objeto.
O --num-results
parâmetro pode ser usado para limitar o número de blobs retornados de um contêiner. Um limite de serviço de 5.000 é imposto a todos os recursos do Azure. Esse limite garante que quantidades gerenciáveis de dados sejam recuperadas e que o desempenho não seja afetado. Se o número de blobs retornados exceder o --num-results
valor ou o limite de serviço, um token de continuação será retornado. Esse token permite que você use várias solicitações para recuperar qualquer número de blobs. Mais informações estão disponíveis em Enumerando recursos de blob.
O exemplo a seguir mostra várias abordagens usadas para fornecer uma lista de blobs. A primeira abordagem lista todos os blobs dentro de um contêiner especificado. A segunda abordagem usa o --prefix
parâmetro para listar todos os blobs nos contêineres que começam com o prefixo especificado. A terceira abordagem usa o --num-results
parâmetro para limitar os resultados retornados e o --show-next-marker
parâmetro para incluir o token de continuação nos resultados. Quando um token de continuação está presente nos resultados, ele é passado para a chamada subsequente para az storage blob list
recuperar o próximo conjunto de resultados.
Para obter mais informações, consulte a referência da lista de blob de armazenamento az.
#!/bin/bash
storageAccount="<storage-account>"
containerName="<container-name>"
blobPrefix="<prefix-string>"
numResults=5
#Approach 1: List all blobs in a container by name.
az storage blob list \
--account-name $storageAccount \
--container $containerName \
--query "[].name" \
--auth-mode login \
--output tsv
#Approach 2: Use the --prefix parameter to list blobs starting with specified prefix.
az storage blob list \
--account-name $storageAccount \
--container $containerName \
--prefix $blobPrefix \
--query "[].name" \
--auth-mode login \
--output tsv
#Approach 3: Use the continuation token to return the complete set of results.
get_blobs() {
if [ -z "$nextMarker" ]; then
az storage blob list --container-name $containerName --num-results $numResults --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
else
az storage blob list --container-name $containerName --num-results $numResults --marker $nextMarker --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
fi
}
total=0
nextMarker=""
while true; do
blobs=$(get_blobs $containerName $numResults $storageAccount $nextMarker)
nextMarker=""
blobsLength=$(echo $blobs | jq length)
if [ $blobsLength -le 0 ]; then
break
fi
blobIndex=0
while read blob; do
if [ $blobIndex -eq $(($blobsLength-1)) ];
then
nextMarker="$(echo $blob | jq -r .nextMarker)"
else
blobName=$(echo $blob | jq .name)
echo "blobname: $blobName"
fi
((blobIndex++))
done <<<$(echo $blobs | jq -c '.[]')
total=$(($total+$blobsLength-1))
echo "Processed $total blobs so far"
# echo "nextMarker: $nextMarker"
if [ "${nextMarker}" = "null" ]; then
echo -e "\nAccountName: $storageAccount, ContainerName: $containerName "
echo "Processed $total blobs in total."
break
fi
done
Transferir um blob
Dependendo do seu caso de uso, você usará o az storage blob download
comando ou az storage blob download-batch
para baixar blobs. Para baixar um blob individual, chame o az storage blob download
comando diretamente e passe valores para os --container-name
parâmetros , --file
e --name
. O blob é baixado para o diretório shell por padrão, mas um local alternativo pode ser especificado. A operação falhará com um erro se o caminho especificado não existir.
Para baixar recursivamente vários blobs de um contêiner de armazenamento, use o az storage blob download-batch
comando. Este comando suporta a correspondência do padrão de nome de arquivo Unix com o --pattern
parâmetro. Os padrões suportados são *
, ?
, [seq]
, e [!seq]
. Para saber mais, consulte a documentação do Python sobre correspondência de padrão de nome de arquivo Unix.
O código de exemplo a seguir fornece um exemplo de abordagens de download único e múltiplo. Ele também oferece uma abordagem simplificada para pesquisar arquivos específicos em todos os contêineres usando um curinga. Como alguns ambientes podem ter muitos milhares de recursos, o uso do --num-results
parâmetro é recomendado.
Para obter mais informações, consulte az storage blob download e az storage blob download batchreference.
#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"
destinationPath="C:\\temp\\downloads\\"
destinationFilename="downloadedBlob.txt"
file="$destinationPath$destinationFilename"
sourceBlobName="demo-file.txt"
#Download a single named blob
az storage blob download \
--container $containerName \
--file $file \
--name $sourceBlobName \
--account-name $storageAccount \
--auth-mode login
#Download multiple blobs using a pattern value
az storage blob download-batch \
--destination $destinationPath \
--source $containerName \
--pattern images/*.png \
--account-name $storageAccount \
--auth-mode login
#Use a loop to download matching blobs in a list of containers
containerList=$( \
az storage container list \
--query "[].name" \
--num-results 5 \
--account-name $storageAccount \
--auth-mode login \
--output tsv
)
for row in $containerList
do
tmpName=$(echo $row | sed -e 's/\r//g')
echo $tmpName
az storage blob download-batch \
--destination $destinationPath \
--source $tmpName \
--pattern *louis*.* \
--account-name $storageAccount \
--auth-mode login
done
Gerenciar propriedades e metadados de blob
Um blob expõe as propriedades do sistema e os metadados definidos pelo usuário. As propriedades do sistema existem em cada recurso de Armazenamento de Blob. Algumas propriedades são somente leitura, enquanto outras podem ser lidas ou definidas. Sob as capas, algumas propriedades do sistema são mapeadas para determinados cabeçalhos HTTP padrão.
Os metadados definidos pelo usuário consistem em um ou mais pares nome-valor que você especifica para um recurso de Armazenamento de Blob. Você pode usar metadados para armazenar valores adicionais com o recurso. Os valores de metadados são para seus próprios fins e não afetam como o recurso se comporta.
Lendo propriedades de blob
Para ler as propriedades ou metadados do blob, você deve primeiro recuperar o blob do serviço. Use o az storage blob show
comando para recuperar as propriedades e metadados de um blob, mas não seu conteúdo. O exemplo a seguir recupera um blob e lista suas propriedades.
Para obter mais informações, consulte az storage blob show reference.
#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"
az storage blob show \
--container demo-container \
--name demo-file.txt \
--account-name $storageAccount \
--auth-mode login
Ler e gravar metadados de blob
Os metadados de Blob são um conjunto opcional de pares nome/valor associados a um blob. Como mostrado no exemplo anterior, não há metadados associados a um blob inicialmente, embora eles possam ser adicionados quando necessário. Para ler, use o az storage blob metadata show
comando. Para atualizar metadados de blob, você usará az storage blob metadata update
e fornecerá uma matriz de pares chave-valor. Para obter mais informações, consulte a referência de metadados az storage blob.
Para obter mais informações, consulte a referência de metadados az storage blob.
O exemplo abaixo primeiro atualiza e, em seguida, confirma os metadados de um blob e, em seguida, recupera-os.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="blue-moon.mp3"
metadata=("Written=1934" "Recorded=1958")
metadata+=("Lyricist=Lorenz Hart")
metadata+=("Composer=Richard Rogers")
metadata+=("Artist=Tony Bennett")
#Update metadata
az storage blob metadata update \
--container-name $containerName \
--name $blobName \
--metadata "${metadata[@]}" \
--account-name $storageAccount \
--auth-mode login
#Retrieve updated blob metadata
az storage blob metadata show \
--container-name $containerName \
--name $blobName \
--account-name $storageAccount \
--auth-mode login
Operações de cópia para blobs
Há muitos cenários em que blobs de diferentes tipos podem ser copiados. Os exemplos neste artigo são limitados a blobs de bloco. A CLI do Azure oferece comandos que executam operações em um ou em vários recursos, dependendo de suas necessidades.
Para copiar um blob específico, use o az storage blob copy start
comando e especifique valores para contêineres e blobs de origem e destino. Também é possível fornecer um identificador de recurso uniforme (URI), compartilhamento ou assinatura de acesso compartilhado (SAS) como a origem.
Você também pode especificar as condições sob as quais o blob será copiado. Essas condições podem ser definidas para o blob de origem ou de destino. Você pode fazer referência à data da última modificação, aos dados da marca ou ao valor ETag. Você pode, por exemplo, optar por copiar blobs que não foram modificados recentemente para um contêiner separado. Para obter mais informações, consulte Especificando cabeçalhos condicionais para operações de serviço de Blob.
Você pode usar o az storage blob copy start-batch
comando para copiar recursivamente vários blobs entre contêineres de armazenamento dentro da mesma conta de armazenamento. Este comando requer valores para os --source-container
parâmetros e --destination-container
e pode copiar todos os arquivos entre a origem e o destino. Como outros comandos em lote da CLI, este comando suporta a correspondência do padrão de nome de arquivo Unix com o --pattern
parâmetro. Os padrões suportados são *
, ?
, [seq]
, e [!seq]
. Para saber mais, consulte a documentação do Python sobre correspondência de padrão de nome de arquivo Unix.
Nota
Considere o uso do AzCopy para facilidade e desempenho, especialmente ao copiar blobs entre contas de armazenamento. O AzCopy é um utilitário da linha de comandos que pode utilizar para copiar blobs ou ficheiros de/para uma conta de armazenamento. Saiba mais sobre como começar a usar o AzCopy.
Para obter mais informações, consulte a referência de cópia de blob de armazenamento az.
O código de exemplo a seguir fornece um exemplo de operações de cópia única e múltipla. Como alguns ambientes podem ter muitos milhares de recursos, o uso do --num-results
parâmetro é recomendado. O primeiro exemplo copia o blob secret-town-road.png do contêiner de fotos para o contêiner de locais. Ambos os contêineres existem dentro da mesma conta de armazenamento. O resultado verifica o sucesso da operação de cópia.
#!/bin/bash
storageAccount="<storage-account>"
sourceContainer="photos"
blobName="secret-town-road.jpg"
destContainer="locations"
az storage blob copy start \
--destination-container $destContainer \
--destination-blob $blobName \
--source-container $sourceContainer \
--source-blob $blobName \
--account-name $storageAccount \
--auth-mode login
Blobs de instantâneo
Quaisquer concessões associadas ao blob base não afetam o snapshot. Não é possível adquirir uma concessão em um instantâneo. Leia mais sobre instantâneos de Blob. Para obter mais informações, consulte a referência de instantâneo az storage blob.
O código de exemplo a seguir recupera um blob de um contêiner de armazenamento e cria um instantâneo dele.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"
az storage blob snapshot \
--container-name $containerName \
--name Blue-Moon.mp3 \
--account-name $storageAccount \
--auth-mode login
Definir camada de blob
Ao alterar a camada de um blob, você move o blob e todos os seus dados para a camada de destino. Você pode alterar a camada entre quente, frio e arquivar com o az storage blob set-tier
comando.
Dependendo de suas necessidades, você também pode utilizar a operação Copiar Blob para copiar um blob de uma camada para outra. A operação Copiar Blob cria um novo blob na camada desejada, deixando o blob de origem permanecer na camada original.
A mudança de níveis de frio ou quente para arquivamento ocorre quase imediatamente. Depois que um blob é movido para a camada de arquivamento , ele é considerado offline e não pode ser lido ou modificado. Antes de ler ou modificar os dados de um blob arquivado, você precisará reidratá-los para uma camada online. Leia mais sobre a reidratação de Blob a partir da camada de arquivo.
Para obter mais informações, consulte a referência de camada de conjunto az storage blob.
O código de exemplo a seguir define a camada como hot para um único blob chamado dentro do archive
contêiner.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
az storage blob set-tier
--container-name $containerName \
--name Blue-Moon.mp3 \
--tier Hot \
--account-name $storageAccount \
--auth-mode login
Operações usando tags de blob
As tags de índice de Blob facilitam o gerenciamento e a descoberta de dados. As tags de índice de Blob são atributos de índice de chave-valor definidos pelo usuário que você pode aplicar aos seus blobs. Uma vez configurado, você pode categorizar e localizar objetos dentro de um contêiner individual ou em todos os contêineres. Os recursos de Blob podem ser categorizados dinamicamente atualizando suas tags de índice sem exigir uma alteração na organização do contêiner. Essa abordagem oferece uma maneira flexível de lidar com as mudanças nos requisitos de dados. Você pode usar metadados e tags de índice simultaneamente. Para obter mais informações sobre marcas de índice, consulte Gerenciar e localizar dados de Blob do Azure com marcas de índice de blob.
Gorjeta
O exemplo de código fornecido abaixo usa correspondência de padrão para obter texto de um arquivo XML com uma estrutura conhecida. O exemplo é usado para ilustrar uma abordagem simplificada para adicionar tags de blob usando a funcionalidade básica do Bash. O uso de uma ferramenta de análise de dados real é sempre recomendado ao consumir dados para cargas de trabalho de produção.
O exemplo a seguir ilustra como adicionar tags de índice de blob a uma série de blobs. O exemplo lê dados de um arquivo XML e os usa para criar marcas de índice em vários blobs. Para usar o código de exemplo, crie um arquivo blob-list.xml local no diretório C:\temp. Os dados XML são fornecidos abaixo.
Para obter mais informações, consulte a referência de camada de conjunto az storage blob.
<Venue Name="House of Prime Rib" Type="Restaurant">
<Files>
<File path="transactions/12027121.csv" />
<File path="campaigns/radio-campaign.docx" />
<File path="photos/bannerphoto.png" />
<File path="archive/completed/2020review.pdf" />
<File path="logs/2020/01/01/logfile.txt" />
</Files>
</Venue>
O código de exemplo itera as linhas dentro do arquivo XML. Ele localiza o elemento Venue e cria variáveis para os valores Name e Type . Em seguida, ele itera pelas linhas restantes e cria tags para cada blob referenciado por um File
nó.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
while read line
do
#Set Tag values
if echo "$line" | grep -q "<Venue";then
name=`echo "$line" | cut -d'"' -f 2`
type=`echo "$line" | cut -d'"' -f 4`
tags=("name=$name")
tags+=("type=$type")
fi
#Add tags to blobs
if echo "$line" | grep -q "<File ";then
blobName=`echo "$line" | cut -d'"' -f 2`
echo az storage blob tag set \
--container-name $containerName \
--name $blobName \
--account-name $storageAccount \
--auth-mode login \
--tags "{$tags[@]}"
fi
done < /mnt/c/temp/bloblist.xml
Eliminar blobs
Você pode excluir um único blob ou uma série de blobs com os az storage blob delete
comandos and az storage blob delete-batch
. Ao excluir vários blobs, você pode usar operações condicionais, loops ou outra automação, conforme mostrado nos exemplos abaixo.
Aviso
A execução dos exemplos a seguir pode excluir blobs permanentemente. A Microsoft recomenda habilitar a exclusão suave de contêiner para proteger contêineres e blobs contra exclusão acidental. Para obter mais informações, consulte Exclusão suave para contêineres.
O código de exemplo a seguir fornece um exemplo de operações de exclusão individual e em lote. O primeiro exemplo exclui um único blob chamado . O segundo exemplo ilustra o uso de operações lógicas no Bash para excluir vários blobs. O terceiro exemplo usa o delete-batch
comando para excluir todos os blobs com o formato bennett-x, exceto bennett-2.
Para obter mais informações, consulte az storage blob delete e az storage blob delete-batch reference.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"
blobPrefix="sinatra-"
#Delete a single, named blob
az storage blob delete \
--container-name $containerName \
--name $blobName \
--account-name $storageAccount \
--auth-mode login
#Iterate a blob list, deleting blobs whose names end with even numbers
## Get list of containers
blobList=$(az storage blob list \
--query "[].name" \
--prefix $blobPrefix \
--container-name $containerName \
--account-name $storageAccount \
--auth-mode login \
--output tsv)
## Delete all blobs with the format *bennett-x* except *bennett-2.*
for row in $blobList
do
#Get the blob's number
tmpBlob=$(echo $row | sed -e 's/\r//g')
tmpName=$(echo ${row%.*} | sed -e 's/\r//g')
if [ `expr ${tmpName: ${#blobPrefix}} % 2` == 0 ]
then
echo "Deleting $tmpBlob"
az storage blob delete \
--container-name $containerName \
--name $tmpBlob \
--account-name $storageAccount \
--auth-mode login
fi
done
#Delete multiple blobs using delete-batch
az storage blob delete-batch \
--source $containerName \
--pattern bennett-[!2].* \
--account-name $storageAccount \
--auth-mode login
Em alguns casos, é possível recuperar blobs que foram excluídos. Se a opção de proteção de dados de exclusão suave da sua conta de armazenamento estiver habilitada, passar o parâmetro retornará blobs --include d
que foram excluídos dentro do período de retenção da conta. Para saber mais sobre a exclusão suave, consulte o artigo Exclusão suave para blobs .
Use os exemplos a seguir para recuperar uma lista de blobs excluídos dentro do período de retenção associado ao contêiner. O primeiro exemplo exibe uma lista de todos os blobs excluídos recentemente e as datas em que eles foram excluídos. O segundo exemplo lista todos os blobs excluídos que correspondem a um prefixo específico.
#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobPrefix="sinatra-"
#Retrieve a list of all deleted blobs
az storage blob list \
--container-name $containerName \
--include d \
--output table \
--account-name $storageAccount \
--auth-mode login \
--query "[?deleted].{name:name,deleted:properties.deletedTime}"
#Retrieve a list of all deleted blobs matching a specific prefix
az storage blob list \
--container-name $containerName \
--prefix $blobPrefix \
--output table \
--include d \
--account-name $storageAccount \
--auth-mode login \
--query "[].{name:name,deleted:deleted}"
Restaurar um blob excluído
Conforme mencionado na seção Listar blobs, você pode configurar a opção de proteção de dados de exclusão suave em sua conta de armazenamento. Quando ativado, é possível restaurar contêineres excluídos dentro do período de retenção associado. Você também pode usar o controle de versão para manter versões anteriores de seus blobs para cada recuperação e restauração.
Se o controle de versão do blob e o blob soft delete estiverem habilitados, modificar, substituir, excluir ou restaurar um blob criará automaticamente uma nova versão. O método que você usará para restaurar um blob excluído depende se o controle de versão está habilitado na sua conta de armazenamento.
O exemplo de código a seguir restaura todos os blobs excluídos por software ou, se o controle de versão estiver habilitado, restaura a versão mais recente de um blob. Primeiro, ele determina se o controle de versão está habilitado com o az storage account blob-service-properties show
comando.
Se o controle de versão estiver habilitado, o az storage blob list
comando recuperará uma lista de todas as versões de blob com nome exclusivo. Em seguida, as versões de blob na lista são recuperadas e ordenadas por data. Se nenhuma versão for encontrada com o valor do isCurrentVersion
atributo, o az storage blob copy start
comando será usado para fazer uma cópia ativa da versão mais recente do blob.
Se o controle de versão estiver desabilitado, o az storage blob undelete
comando será usado para restaurar cada blob excluído suavemente no contêiner.
Antes de seguir este exemplo, você precisará habilitar a exclusão virtual em pelo menos uma de suas contas de armazenamento. Para saber mais sobre a opção de proteção de dados de exclusão suave, consulte o artigo Exclusão suave para blobs ou a referência az storage blob undelete .
#!/bin/bash
storageAccount="<storage-account>"
groupName="myResourceGroup"
containerName="demo-container"
blobSvcProps=$(
az storage account blob-service-properties show \
--account-name $storageAccount \
--resource-group $groupName)
softDelete=$(echo "${blobSvcProps}" | jq -r '.deleteRetentionPolicy.enabled')
versioning=$(echo "${blobSvcProps}" | jq -r '.isVersioningEnabled')
# If soft delete is enabled
if $softDelete
then
# If versioning is enabled
if $versioning
then
# Get all blobs and versions using -Unique to avoid processing duplicates/versions
blobList=$(
az storage blob list \
--account-name $storageAccount \
--container-name $containerName \
--include dv \--query "[?versionId != null].{name:name}" \
--auth-mode login -o tsv | uniq)
# Iterate the collection
for blob in $blobList
do
# Get all versions of the blob, newest to oldest
blobVers=$(
az storage blob list \
--account-name $storageAccount \
--container-name $containerName \
--include dv \
--prefix $blob \
--auth-mode login -o json | jq 'sort_by(.versionId) | reverse | .[]')
# Select the first (newest) object
delBlob=$(echo "$blobVers" | jq -sr '.[0]')
# Verify that the newest version is NOT the latest (that the version is "deleted")
if [[ $(echo "$delBlob" | jq '.isCurrentVersion') != true ]];
then
# Get the blob's versionId property, build the URI to the blob
versionID=$(echo "$delBlob" | jq -r '.versionId')
uri="https://$storageAccount.blob.core.windows.net/$containerName/$blob?versionId=$versionID"
# Copy the latest version
az storage blob copy start \
--account-name $storageAccount \
--destination-blob $blob \
--destination-container $containerName \
--source-uri $uri \
--auth-mode login
delBlob=""
fi
done
else
#Retrieve all deleted blobs
blobList=$( \
az storage blob list \
--container-name $containerName \
--include d \
--output tsv \
--account-name $storageAccount \
--auth-mode login \
--query "[?deleted].[name]" \
)
#Iterate list of deleted blobs and restore
for row in $blobList
do
tmpName=$(echo $row | sed -e 's/\r//g')
echo "Restoring $tmpName"
az storage blob undelete \
--container-name $containerName \
--name $tmpName \
--account-name $storageAccount \
--auth-mode login
done
fi
else
#Soft delete is not enabled
echo "Sorry, the delete retention policy is not enabled."
fi