Gerenciar blobs de blocos com o PowerShell

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

Configurar um objeto de contexto para encapsular credenciais

Toda solicitação para o Armazenamento do Microsoft Azure deve ser autorizada. Você pode autorizar uma solicitação feita no PowerShell com sua conta do Microsoft Entra ou usando as chaves de acesso da conta. Os exemplos neste artigo usam a autorização do Microsoft Entra com objetos de contexto. Os objetos de contexto encapsulam suas credenciais do Microsoft Entra e as passam durante operações de dados subsequentes.

Para entrar em sua conta do Azure com uma conta do Microsoft Entra, abra o PowerShell e chame o cmdlet Connect-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Depois que a conexão tiver sido estabelecida, crie o contexto do Azure. A autenticação com o Microsoft Entra ID cria automaticamente um contexto do Azure para sua assinatura padrão. Em alguns casos, talvez seja necessário acessar recursos em uma assinatura diferente após a autenticação. É possível alterar a assinatura associada à sessão atual do Azure modificando o contexto de sessão ativa.

Para usar sua assinatura padrão, crie o contexto chamando o cmdlet New-AzStorageContext. Inclua o parâmetro -UseConnectedAccount para que as operações de dados sejam executadas usando suas credenciais do Microsoft Entra.

#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount

Para alterar assinaturas, recupere o objeto de contexto com o cmdlet Get-AzSubscription e altere o contexto atual com Set-AzContext. Para obter mais informações, consulte Alterar a assinatura ativa.

Criar um contêiner

Todos os dados de blob são armazenados em contêineres, portanto, você precisa 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 PowerShell.

#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx

Ao usar os exemplos a seguir, você precisa 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 o PowerShell, veja Conectar-se com o Azure PowerShell.

Carregar um blob

Para carregar um arquivo em um blob de blocos passe os valores de parâmetro necessários para o cmdlet Set-AzStorageBlobContent. Fornece o caminho e o nome do arquivo -File com o parâmetro e o nome do contêiner com o parâmetro -Container. Você também precisa fornecer uma referência ao objeto de contexto com o parâmetro -Context.

Esse comando cria o blob se ele não existir, ou solicita a confirmação de substituição, se existir. É possível substituir o arquivo sem confirmação se passar o parâmetro -Force para o cmdlet.

O exemplo a seguir especifica um valor de parâmetro -File para carregar um único arquivo nomeado. Ele também demonstra o uso do operador de pipeline e do cmdlet Get-ChildItem do PowerShell para carregar vários arquivos. O Get-ChildItem cmdlet usa o parâmetro -Path para especificar C:\Temp\*.png. A inclusão do caractere curinga asterisco (*) especifica todos os arquivos com a extensão .png do nome do arquivo. O -Recurse parâmetro pesquisa o diretório Temp e seus subdiretórios.

#Set variables
$path          = "C:\temp\" 
$containerName = "mycontainer"
$filename      = "demo-file.txt"
$imageFiles    = $path + "*.png"
$file          = $path + $filename

#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx

#Upload multiple image files recursively
 Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx

O resultado exibe o nome da conta de armazenamento, o nome do contêiner de armazenamento e fornece uma lista dos arquivos carregados.

   AccountName: demostorageaccount, ContainerName: demo-container

Name              BlobType   Length  ContentType                LastModified          AccessTier  IsDeleted
----              --------   ------  -----------                ------------          ----------  ---------
demo-file.txt     BlockBlob  222     application/octet-stream   2021-12-14 01:38:03Z  Cool        False     
hello-world.png   BlockBlob  14709   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world2.png  BlockBlob  12472   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world3.png  BlockBlob  13537   application/octet-stream   2021-12-14 01:38:03Z  Cool        False

Listar blobs

O cmdlet Get-AzStorageBlob é usado para listar blobs armazenados em um contêiner. É possível usar várias abordagens para definir o escopo da pesquisa. Use o parâmetro -Container e -Name para listar um blob específico dentro de um contêiner conhecido. Para gerar uma lista não filtrada de todos os blobs em um contêiner específico, use o parâmetro -Container sozinho, sem um valor -Name.

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. Ao recuperar vários blobs, você pode usar o parâmetro -Prefixpara especificar blobs cujos nomes começam com uma cadeia de caracteres específica. Você também pode usar o parâmetro -Name com um curinga para especificar nomes de arquivo ou tipos.

O parâmetro -MaxCount 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 -MaxCount 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 um único blob dentro de um recurso de contêiner específico. A segunda abordagem usa um curinga para listar todos os arquivos .jpg com um prefixo de Louis. A pesquisa é restrita a cinco contêineres usando o parâmetro -MaxCount. A terceira abordagem usa os parâmetros -MaxCount e -ContinuationToken para limitar recuperação de todos os blobs dentro de um contêiner.

#Set variables
$namedContainer  = "named-container"
$demoContainer   = "mycontainer"
$containerPrefix = "demo"

$maxCount = 1000
$total     = 0
$token     = $Null

#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx

#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg" 

#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
     #Retrieve blobs using the MaxCount parameter
     $blobs = Get-AzStorageBlob -Container $demoContainer `
         -MaxCount $maxCount `
         -ContinuationToken $token `
         -Context $ctx
     $blobCount = 1
     
     #Loop through the batch
     Foreach ($blob in $blobs)
     {
         #To-do: Perform some work on individual blobs here

         #Display progress bar
         $percent = $($blobCount/$maxCount*100)
         Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
         $blobCount++
     }

     #Update $total
     $total += $blobs.Count
      
     #Exit if all blobs processed
     If($blobs.Length -le 0) { Break; }
      
     #Set continuation token to retrieve the next batch
     $token = $blobs[$blobs.Count -1].ContinuationToken
 }
 While ($null -ne $token)
 Write-Host "`n`n   AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
 Write-Host "Processed $total blobs in $namedContainer."

As duas primeiras abordagens exibem a conta de armazenamento e os nomes do contêiner, e uma lista dos blobs recuperados. A terceira abordagem exibe a contagem total de blobs em um contêiner nomeado. Os blobs são recuperados em lotes e uma barra de status mostra o progresso durante a contagem.

   AccountName: demostorageaccount, ContainerName: named-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
index.txt            BlockBlob   222       text/plain     2021-12-15 22:00:10Z  Cool          False
miles-davis.txt      BlockBlob   23454     text/plain     2021-12-15 22:17:59Z  Cool          False
cab-calloway.txt     BlockBlob   18419     text/plain     2021-12-15 22:17:59Z  Cool          False
benny-goodman.txt    BlockBlob   17726     text/plain     2021-12-15 22:17:59Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
louis-armstrong.jpg  BlockBlob   211482    image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-jordan.jpg     BlockBlob   55766     image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-prima.jpg      BlockBlob   290651    image/jpeg     2021-12-14 01:38:03Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Processed 5257 blobs in demo-container.

Baixar um blob

Dependendo do caso de uso, o cmdlet Get-AzStorageBlobContent pode ser usado para baixar blobs individuais ou múltiplos. Assim como na maioria das operações, ambas as abordagens exigem um objeto de contexto.

Para baixar um único blob nomeado, você pode chamar o cmdlet diretamente e fornecer valores para os parâmetros -Blob e -Container. Por padrão, o download do blob é feito no diretório de trabalho do PowerShell, mas um local alternativo pode ser especificado. Para alterar o local de destino, um caminho válido e existente deve ser passado com o parâmetro -Destination. Como a operação não pode criar um destino, ela vai falhar com um erro se o caminho especificado não existir.

Vários blobs podem ser baixados combinando o cmdlet Get-AzStorageBlob e o operador de pipeline do PowerShell. Primeiro, crie uma lista de blobs com o cmdlet Get-AzStorageBlob. Em seguida, use o operador de pipeline e o cmdlet Get-AzStorageBlobContent para recuperar os blobs do contêiner.

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 centenas de milhares de recursos, é recomendável usar o parâmetro -MaxCount.

#Set variables
$containerName = "mycontainer"
$path          = "C:\temp\downloads\"
$blobName      = "demo-file.txt"
$fileList      = "*.png"
$pipelineList  = "louis*"
$maxCount      = 10

#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx

#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent

#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
     -Context $ctx | Get-AzStorageBlob `
     -Blob "louis*" | Get-AzStorageBlobContent

O resultado exibe a conta de armazenamento e os nomes de contêiner e fornece uma lista dos arquivos baixados.

   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
demo-file.txt        BlockBlob  222     application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world.png      BlockBlob  14709   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world2.png     BlockBlob  12472   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world3.png     BlockBlob  13537   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: public-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-armstrong.jpg  BlockBlob  211482  image/jpeg               2021-12-14 18:56:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: read-only-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-jordan.jpg     BlockBlob  55766   image/jpeg               2021-12-14 18:56:21Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: hidden-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-prima.jpg      BlockBlob  290651  image/jpeg               2021-12-14 18:56:45Z  Unknown     False

Gerenciar metadados e propriedades de blob

Um contêiner 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 esses valores com o recurso. Os valores de metadados são apenas 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 cmdlet Get-AzStorageBlob para recuperar as propriedades e os metadados de um blob, mas não seu conteúdo. Em seguida, use o método BlobClient.GetProperties para buscar as propriedades do blob. As propriedades ou metadados podem ser lidos ou definidos conforme necessário.

O exemplo a seguir recupera um blob e lista suas propriedades.

$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value

O resultado exibe uma lista das propriedades do blob, conforme mostrado no seguinte exemplo.

LastModified                         : 11/16/2021 3:42:07 PM +00:00
CreatedOn                            : 11/16/2021 3:42:07 PM +00:00
Metadata                             : {}
BlobType                             : Block
LeaseDuration                        : Infinite
LeaseState                           : Available
LeaseStatus                          : Unlocked
ContentLength                        : 2163298
ContentType                          : audio/mpeg
ETag                                 : 0x8D9C0AA9E0CBA78
IsServerEncrypted                    : True
AccessTier                           : Cool
IsLatestVersion                      : False
TagCount                             : 0
ExpiresOn                            : 1/1/0001 12:00:00 AM +00:00
LastAccessed                         : 1/1/0001 12:00:00 AM +00:00
HasLegalHold                         : False

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 atualizar os metadados do blob, use o método BlobClient.UpdateMetadata. Este método aceita apenas pares de valores-chave armazenados em um objeto IDictionary genérico. Para obter mais informações, consulte a definição da classe BlobClient.

O exemplo abaixo primeiro atualiza e, em seguida, confirma os metadados de um blob e, em seguida, os recupera. O blob de exemplo é liberado da memória para garantir que os metadados não estão sendo lidos do objeto na memória.

#Set variable
$container = "mycontainer"
$blobName  = "blue-moon.mp3"

#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx

#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")

#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)

#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
 
#Display metadata
Echo $properties.Value.Metadata

O resultado retorna os metadados recém-atualizados do blob, conforme mostrado no seguinte exemplo.

Key          Value         
---          -----         
YearWritten  1934          
YearRecorded 1958          
Composer     Richard Rogers
Lyricist     Lorenz Hart   
Artist       Tony Bennett

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.

Copiar um blob de origem para um blob de destino

Para uma operação de cópia simplificada na mesma conta de armazenamento, use o cmdlet Copy-AzStorageBlob. Como a operação está copiando um blob dentro da mesma conta de armazenamento, é uma operação síncrona. Operações entre contas são assíncronas.

Você deve considerar 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.

O exemplo a seguir copia o blob bannerphoto.png do contêiner de fotos para a pasta de fotos dentro do contêiner de arquivo morto. Ambos os contêineres existem na mesma conta de armazenamento. O resultado verifica o sucesso da operação de cópia.

$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
     -SrcBlob $blobname -DestContainer "archive" `
     -DestBlob $("photos/$blobname") -Context $ctx

AccountName: demostorageaccount, ContainerName: archive

Name                BlobType   Length  ContentType  LastModified          AccessTier  IsDeleted  VersionId
----                --------   ------  -----------  ------------          ----------  ---------  ---------
photos/bannerphoto  BlockBlob  12472   image/png    2021-11-27 23:11:43Z  Cool        False

Você pode usar o parâmetro -Force para substituir um blob existente com o mesmo nome no destino. Essa operação substitui efetivamente o blob de destino. Ela também remove todos os blocos não confirmadas e substitui os metadados do blob de destino.

Copiar um instantâneo para um blob de destino com um nome diferente

O blob de destino resultante é um blob gravável e não um instantâneo.

O blob de origem para uma operação de cópia pode ser um blob de blocos, um blob de acréscimo, um blob de páginas ou um instantâneo. Se o blob de destino já existir, ele deverá ser do mesmo tipo do blob de origem. Um blob de destino existente é substituído.

O blob de destino não pode ser modificado quando uma operação de cópia está em andamento. Um blob de destino pode ter apenas uma operação pendente de cópia. Em outras palavras, um blob não pode ser o destino de várias operações pendentes de cópia.

Quando você copia um blob dentro da mesma conta de armazenamento, a operação é síncrona. As operações de cópia entre contas são assíncronas.

O arquivo ou blob de origem completo é sempre copiado. Não há suporte para a cópia de um intervalo de bytes ou um conjunto de blocos.

Quando um blob é copiado, suas propriedades do sistema são copiadas no blob de destino com os mesmos valores.

Ele também mostra como anular uma operação de cópia assíncrona.

Instantâneos de blobs

Um instantâneo é uma versão somente leitura de um blob capturada em um momento no tempo. Um instantâneo de blob é idêntico ao blob base, exceto que um valor DateTime é acrescentado ao URI. Esse valor indica a hora em que o instantâneo foi tirado e oferece a única distinção entre o blob base e o instantâneo.

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.

O código de exemplo a seguir recupera um blob de um contêiner de armazenamento e cria um instantâneo dele.

$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()

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. Para fazer isso, recupere um blob com o cmdlet Get-AzStorageBlob e chame o método BlobClient.SetAccessTier. Essa abordagem pode ser usada para alterar a camada entre frequente, esporádico e arquivos.

A alteração das camadas de esporádico ou frequente para arquivos ocorre quase imediatamente. Depois que um blob é movido para a camada arquivos, ele será considerado offline e não poderá ser lido nem alterado. Antes de poder ler ou modificar os dados de um blob arquivado, você precisa reidratá-lo para uma camada de serviço online. Leia mais sobre a Reidratação de blob da camada de arquivos.

O código de exemplo a seguir define a camada como frequente para todos os blobs dentro do contêiner archive.

$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
    $blob.BlobClient.SetAccessTier("Hot")
}

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. As marcas de índice oferecem um modo 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.

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 no seguinte exemplo.

<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 cria uma tabela de hash e atribui a $tags variável a ela. Em seguida, ele usa Get-Content e os cmdlets Get-Data para criar um objeto com base na estrutura XML. Em seguida, adiciona pares de valores-chave à tabela de hash a ser usada como os valores de marca. Por fim, ele itera através do objeto XML e cria marcas para cada nó File.

#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags     = @{}

#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
 
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
    #break the path: container name, blob
    $path = $_.Path -split "/",2
   
    #set apply the blob tags
    Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
 }

Excluir blobs

Você pode excluir um único blob ou uma série de blobs com o cmdlet Remove-AzStorageBlob. Ao excluir vários blobs, você pode utilizar operações condicionais, loops ou o pipeline do PowerShell, conforme mostrado nos seguintes exemplos.

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.

#Create variables
$containerName  = "mycontainer"
$blobName       = "demo-file.txt"
$prefixName     = "file"

#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx

#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) { 
    Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
} 

#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob

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 -IncludeDeleted vai retornar blobs excluídos dentro do período de retenção associado. Para saber mais sobre a exclusão temporária, confira o artigo Exclusão temporária para blobs.

Use o exemplo a seguir para recuperar uma lista de blobs excluídos no período de retenção associado ao contêiner. O resultado exibe uma lista de blobs excluídos recentemente.

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

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 habilitado, é 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 cmdlet Get-AzStorageBlobServiceProperty.

Se o controle de versão estiver habilitado, o cmdlet Get-AzStorageBlob 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 LatestVersion, o cmdlet Copy-AzBlob será usado para fazer uma cópia ativa da versão mais recente.

Se o controle de versão estiver desabilitado, o método BlobBaseClient.Undelete será usado para restaurar cada blob excluído de forma reversível no contêiner.

Antes de seguir este exemplo, você precisa habilitar a exclusão temporária ou o controle de versão em pelo menos uma de suas contas de armazenamento.

Importante

O seguinte exemplo enumera um grupo de blobs e os armazena na memória antes de processá-los. Se o controle de versão estiver habilitado, os blobs também serão classificados. O uso do parâmetro -ContinuationToken com a variável $maxCount limita o número de blobs dentro do grupo para conservar recursos. Se um contêiner tiver milhões de blobs, isto será extremamente caro. Você pode ajustar o valor da variável $maxCount, mas se um contêiner tiver milhões de blobs, o script processará os blobs lentamente.

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.

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

Próximas etapas