Compartilhar via


Gerenciar blob de blocos com CLI do Azure

O Armazenamento de Blobs dá suporte a blobs de blocos, blobs de acréscimo e blobs de páginas. Os blobs de blocos são otimizados para carregar grandes quantidades de dados de forma eficiente. Os blobs de blocos são ideais para armazenar imagens, documentos e outros tipos de dados não sujeitos a operações aleatórias de leitura e gravação. Este artigo explica como trabalhar com os blobs de blocos.

Pré-requisitos

Para acessar o Armazenamento do Azure, você precisará de uma assinatura do Azure. Se você ainda não tiver uma assinatura, 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 sobre como criar uma conta de armazenamento, confira Criar uma conta de armazenamento.

Preparar o ambiente para a CLI do Azure

  • Este artigo exige a versão 2.0.46 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

Autorizar o acesso ao Armazenamento de Blobs

Você pode autorizar o acesso ao Armazenamento de Blob por meio da CLI do Azure com as credenciais do Microsoft Entra ou usando a chave de acesso da conta de armazenamento. É recomendável usar as credenciais do Microsoft Entra e os exemplos desse artigo usam exclusivamente o Microsoft Entra ID.

Os comandos da CLI do Azure para operações de dados no Armazenamento de Blobs dão suporte ao parâmetro --auth-mode, que permite especificar como autorizar determinada operação. Defina o parâmetro --auth-mode como logon para autorizar com as credenciais do Microsoft Entra. Somente as operações de dados do Armazenamento de Blobs dão suporte ao parâmetro --auth-mode. 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, confira Escolher como autorizar o acesso a dados de blob com a CLI do Azure.

Execute o comando login para abrir um navegador e se conectar à sua assinatura do Azure.


az login

Criar um contêiner

Todos os dados blob são armazenados em contêineres, portanto, você precisará de pelo menos um recurso de contêiner antes de 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 o 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 em colchetes por seus próprios valores. Para obter mais informações sobre como entrar no Azure com a CLI do Azure, veja Conectar-se com a CLI do Azure.

Carregar blobs

A CLI do Azure oferece comandos que executam operações em um recurso ou em vários recursos, dependendo de seus requisitos.

Para carregar um arquivo em um blob de blocos passe os valores de parâmetro necessários para o comando az storage blob upload. Fornece o caminho de origem e o nome do arquivo --file com o parâmetro e o nome do contêiner de destino com o parâmetro --container-name. Você também precisará fornecer o parâmetro --account-name. Esse comando cria um novo blob ou substitui o blob original se ele já existir.

É possível usar o comando az storage blob upload-batch para carregar recursivamente vários Blobs em um contêiner de armazenamento. É possível usar a correspondência de padrão de nome de arquivo UNIX especifique um intervalo de arquivos para carregar com o parâmetro --pattern. Os padrões com suporte são *, ?, [seq], e [!seq]. Para saber mais, consulte a documentação do Python sobre Correspondência de padrões de nome de arquivo Unix.

No exemplo a seguir, a primeira operação usa o comando az storage blob upload para carregar um único arquivo nomeado. O arquivo de origem e o contêiner de armazenamento de destino são especificados com os parâmetros --file e --container-name.

A segunda operação demonstra o uso do comando az storage blob upload-batch para carregar vários arquivos. O parâmetro --if-modified-since garante que somente os arquivos modificados nos últimos sete dias serão carregados. O valor fornecido por esse 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 comando az storage blob list lista todos os blobs armazenados em um contêiner. É possível usar várias abordagens para aperfeiçoar o escopo da pesquisa. Não há restrição no número de contêineres ou blobs que uma conta de armazenamento pode ter. Para evitar a recuperação de milhares de blobs, é uma boa ideia limitar a quantidade de dados retornados.

Use o parâmetro --prefix 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 parâmetro --prefix.

Por padrão, somente os blobs são retornados em uma operação de listagem. Em alguns cenários, talvez você queira passar um valor para que o parâmetro --include retorne tipos adicionais de objetos, como blobs, instantâneos e versões com exclusão reversível. Esses valores podem ser combinados para retornar mais do que vários tipos de objeto.

O parâmetro --num-results pode ser usado para limitar o número de blobs não filtrados 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 valor --num-results 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 em um contêiner especificado. A segunda abordagem usa o parâmetro --prefix para listar todos os blobs nos contêineres que começam com o prefixo especificado. A terceira abordagem usa o parâmetro --num-results para limitar os resultados retornados e o parâmetro --show-next-marker 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 a az storage blob list para recuperar o próximo conjunto de resultados.

Para obter mais informações, consulte a referência 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

Baixar um blob

Dependendo de seu caso de uso, você usará o comando az storage blob downloadou az storage blob download-batch para baixar os blobs. Para baixar um blob individual, chame o comando az storage blob download diretamente e passe valores para os parâmetros --container-name, --file e --name. O blob será baixado para o diretório do 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 comando az storage blob download-batch. Esse comando dá suporte à correspondência de padrão de nome de arquivo UNIX com o parâmetro --pattern. Os padrões com suporte são *, ?, [seq], e [!seq]. Para saber mais, consulte a documentação do Python sobre Correspondência de padrões de nome de arquivo Unix.

O código de exemplo a seguir fornece um exemplo de abordagens de download simples e múltiplas. Ele também oferece uma abordagem simplificada para pesquisar todos os contêineres para arquivos específicos usando um curinga. Como alguns ambientes podem ter muitos milhares de recursos, é recomendável usar o parâmetro --num-results.

Para obter informações adicionais, consulte a referência download de blob de armazenamento az e lote de download de blob de armazenamento az.

#!/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 metadados e propriedades de blob

Um blob expõe as propriedades do sistema e os metadados definidos pelo usuário. Existem propriedades do sistema em cada recurso de Armazenamento de Blobs. Algumas propriedades são somente leitura, enquanto outras podem ser lidas ou definidas. Internamente, algumas propriedades do sistema correspondem a certos 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 Blobs. É possível usar os metadados para armazenar valores adicionais com o recurso. Os valores de metadados são para serem usados para os objetivos que você desejar e não afetam o comportamento do recurso.

Leitura de propriedades blob

Para ler propriedades de blob ou metadados, você deve primeiro recuperar o blob do serviço. Use o comando az storage blob show para recuperar as propriedades e os 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 a referência mostrar blob de armazenamento az.

#!/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 blob são um conjunto opcional de pares de nome/valor associados a um blob. Como mostrado no exemplo anterior, não há metadados associados a um blob inicialmente, embora ele possa ser adicionado quando necessário. Para ler, use o comando az storage blob metadata show. 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 de blob de armazenamento az.

Para obter mais informações, consulte a referência de metadados de blob de armazenamento az.

O exemplo abaixo primeiro atualiza e, em seguida, confirma os metadados de um blob e, em seguida, os recupera.

#!/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

Copiar operações para blobs

Há muitos cenários em que blobs de diferentes tipos podem ser copiados. Os exemplos neste artigo estão limitados a blob de blocos. A CLI do Azure oferece comandos que executam operações em um recurso ou em vários recursos, dependendo de seus requisitos.

Para copiar um blob específico, use o comando az storage blob copy start e especifique valores para contêineres e blobs de origem e destino. Também é possível fornecer um URI (uniform resource identifier), compartilhamento ou SAS (assinatura de acesso compartilhado) 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 referenciar a data da última modificação, os dados de marca ou o valor de ETag. Você pode, por exemplo, optar por copiar blobs que não foram modificados recentemente em um contêiner separado. Para obter mais informações, confira Como especificar cabeçalhos condicionais para operações de serviço Blob.

Você pode usar o comando az storage blob copy start-batch para copiar recursivamente vários blobs entre contêineres de armazenamento dentro da mesma conta de armazenamento. Esse comando requer valores para os parâmetros --source-container e --destination-container pode copiar todos os arquivos entre a origem e o destino. Assim como outros comandos em lotes da CLI, esse comando dá suporte ao padrão de nome de arquivo Unix correspondente ao parâmetro --pattern. Os padrões com suporte são *, ?, [seq], e [!seq]. Para saber mais, consulte a documentação do Python sobre Correspondência de padrões de nome de arquivo Unix.

Observação

Considere o uso do AzCopy para facilitar e melhorar o desempenho, especialmente ao copiar blobs entre contas de armazenamento. AzCopy é um utilitário de linha de comando que você pode usar para copiar blobs ou arquivos de ou para uma conta de armazenamento. Saiba mais sobre como Introdução ao 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, é recomendável usar o parâmetro --num-results. O primeiro exemplo copia o secret-town-road.png do contêiner de fotos para o contêiner de locais. Ambos os contêineres existem na 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

Instantâneos de blobs

Quaisquer concessões associadas ao blob básico não afetam o instantâneo. 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 de blob de armazenamento az.

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 do blob

Ao alterar a camada de um blob, você move o blob e todos os dados dele para a camada de destino. Você pode alterar a camada entre frequente, esporádico e arquivos com o comando az storage blob set-tier.

Dependendo de seus requisitos, você também pode utilizar a operação Copiar Blob para copiar um blob de uma camada para outra. A operação Copiar Blob criará um novo blob na camada desejada, deixando o blob de origem permanece na camada original.

A alteração das camadas de esporádico ou frequente para arquivos ocorre quase imediatamente. Depois que um blob for movido para a camada arquivos, ele será considerado offline e não poderá ser lido ou modificado. Antes de poder 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 da camada de arquivos.

Para obter mais informações, consulte a referência nível de blob de armazenamento az.

O código de exemplo a seguir define a camada como frequente para um único blob nomeado dentro do contêiner archive.

#!/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 marcas blob

As marcas de índice de blob facilitam o gerenciamento e a descoberta de dados. As marcas de índice blob são atributos de índice de valor-chave definidos pelo usuário que você pode aplicar aos seus blobs. Depois de configurado, você pode categorizar e encontrar objetos em um contêiner individual ou em todos os contêineres. Os recursos blob podem ser categorizados dinamicamente atualizando suas marcas de índice sem exigir uma alteração na organização do contêiner. Essa abordagem oferece uma maneira flexível de lidar com a alteração dos requisitos de dados. É possível usar metadados e marcas de índice simultaneamente. Para obter mais informações sobre marcas de índice, confira Gerenciar e localizar dados de blob do Azure com marcas de índice de blob.

Dica

O exemplo de código fornecido abaixo usa a correspondência de padrões para obter texto de um arquivo XML com uma estrutura conhecida. O exemplo é usado para ilustrar uma abordagem simplificada para adicionar marcas 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 marcas 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 no diretório C:\temp. Os dados XML são fornecidos abaixo.

Para obter mais informações, consulte a referência nível de blob de armazenamento az.

<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 Nome e Tipo. Em seguida, ele itera pelas linhas restantes e cria marcas para cada blob referenciado por um nó File.

#!/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

Excluir blobs

Você pode excluir um único blob ou uma série de blobs com os comandos az storage blob delete e az storage blob delete-batch. Ao excluir vários blobs, é possível usar operações condicionais, loops ou outra automação, conforme mostrado nos exemplos a seguir.

Aviso

Executar os exemplos a seguir pode excluir permanentemente os blobs. A Microsoft recomenda habiltar a exclusão temporária do contêiner para proteger contêineres e blobs contra exclusão acidental. Para obter mais informações, consulte Exclusão temporária para contêineres.

O código de exemplo a seguir fornece um exemplo de operações de exclusão individuais e em lote. O primeiro exemplo exclui um único blob nomeado. O segundo exemplo ilustra o uso de operações lógicas no Bash para excluir vários blobs. O terceiro exemplo usa o comando delete-batch para excluir todos os blobs com o formato bennett-x, exceto o bennett-2.

Para obter mais informações, consulte a referência de exclusão de blob de armazenamento az e lote de exclusão de blob de armazenamento az.

#!/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 temporária de sua conta de armazenamento estiver habilitada, o parâmetro --include d e o valor retornarão blobs excluídos no período de retenção da conta. Para saber mais sobre a exclusão temporária, confira o artigo Exclusão temporária para blobs.

Use os exemplos a seguir para recuperar uma lista de blobs excluídos no 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, é possível configurar a opção de proteção de dados de exclusão temporária em sua conta de armazenamento. Quando habilitada, é possível restaurar contêineres excluídos dentro do período de retenção associado. Use o controle de versão para manter automaticamente as versões anteriores dos blobs para recuperação e restauração.

Se o controle de versão de blob e a exclusão temporária de blob estiverem habilitados em uma conta de armazenamento, a substituição de um blob criará automaticamente uma nova versão. O método usado para restaurar um blob excluído depende de o controle de versão estar habilitado em sua conta de armazenamento.

O exemplo de código a seguir restaura todos os blobs com exclusão temporária ou, caso o controle de versão estiver habilitado, restaura a versão mais recente de um blob. Ele determina primeiro se o controle de versão está habilitado com o comando az storage account blob-service-properties show.

Se o controle de versão estiver habilitado, o comando az storage blob list recuperará uma lista de todas as versões de blob nomeadas exclusivamente. Em seguida, as versões de blob na lista são recuperadas e ordenadas por data. Se não for encontrada nenhuma versão com o valor do atributo isCurrentVersion, o comando az storage blob copy start será usado para fazer uma cópia ativa da versão mais recente do blob.

Se o controle de versão estiver desabilitado, o comando az storage blob undelete será usado para restaurar cada blob excluído de modo temporário no contêiner.

Antes de seguir este exemplo, você precisará habilitar a exclusão temporária em pelo menos uma de suas contas de armazenamento. Para saber mais sobre a opção de proteção de dados de exclusão temporária, confira o artigo Exclusão temporária para blobs ou a referência deexclusão de blob de armazenamento az.

#!/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

Próximas etapas