Gerenciar contêineres de blob usando o PowerShell

O armazenamento de blob do Azure permite armazenar grandes quantidades de dados de objetos não estruturados. Você pode usar o armazenamento de blob para coletar ou expor dados de mídia, conteúdo ou aplicativo aos usuários. Como todos os dados de blob são armazenados em contêineres, você deve criar um contêiner de armazenamento antes de começar a carregar dados. Para saber mais sobre o armazenamento de blobs, leia a Introdução ao armazenamento de Blob do Azure.

Este artigo explica como trabalhar com objetos de contêiner de armazenamento individuais e múltiplos.

Pré-requisitos

Você precisará obter autorização para uma assinatura do Azure antes de poder usar os exemplos neste artigo. A autorização pode ocorrer autenticando-se com uma conta do Microsoft Entra ou usando uma chave compartilhada. Os exemplos neste artigo usam a autenticação do Microsoft Entra em conjunto com objetos de contexto. Os objetos de contexto encapsulam suas credenciais do Microsoft Entra e as passam em operações de dados subsequentes, eliminando a necessidade de autenticar novamente.

Para entrar na 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 for estabelecida, crie o contexto da conta de armazenamento chamando o New-AzStorageContext cmdlet. Inclua o parâmetro para que as -UseConnectedAccount 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

Lembre-se de substituir os valores de espaço reservado entre colchetes pelos seus próprios valores. Para obter mais informações sobre como entrar no Azure com o PowerShell, consulte Entrar com o Azure PowerShell.

Criar um contentor

Para criar contêineres com o PowerShell, chame o cmdlet New-AzStorageContainer . Não há limites para o número de blobs ou contêineres que podem ser criados em uma conta de armazenamento. Os contêineres não podem ser aninhados em outros contêineres.

O exemplo a seguir ilustra três opções para a criação de contêineres de blob com o New-AzStorageContainer cmdlet. A primeira abordagem cria um único contêiner, enquanto as duas abordagens restantes aproveitam as operações do PowerShell para automatizar a criação de contêineres.

Para usar este exemplo, forneça valores para as variáveis e verifique se você criou uma conexão com sua assinatura do Azure. Lembre-se de substituir os valores de espaço reservado entre colchetes pelos seus próprios valores.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop"

# Approach 1: Create a container
 New-AzStorageContainer -Name $containerName -Context $ctx

# Approach 2: Create containers with a PowerShell loop
 for ($i = 1; $i -le 3; $i++) { 
     New-AzStorageContainer -Name (-join($prefixName, $i)) -Context $ctx
    } 

# Approach 3: Create containers using the PowerShell Split method
 "$($prefixName)4 $($prefixName)5 $($prefixName)6".split() | New-AzStorageContainer -Context $ctx

O resultado fornece o nome da conta de armazenamento e confirma a criação do novo contêiner.

Storage Account Name: demostorageaccount

Name                   PublicAccess   LastModified
----                   ------------   ------------
individual-container   Off            11/2/2021 4:09:05 AM +00:00
loop-container1        Off            11/2/2021 4:09:05 AM +00:00
loop-container2        Off            11/2/2021 4:09:05 AM +00:00
loop-container3        Off            11/2/2021 4:09:05 AM +00:00           
loop-container4        Off            11/2/2021 4:09:05 AM +00:00           
loop-container5        Off            11/2/2021 4:09:05 AM +00:00           
loop-container6        Off            11/2/2021 4:09:05 AM +00:00          

Listar contentores

Use o Get-AzStorageContainer cmdlet para recuperar contêineres de armazenamento. Para recuperar um único contêiner, inclua o -Name parâmetro. Para retornar uma lista de contêineres que começa com uma determinada cadeia de caracteres, especifique um valor para o parâmetro -Prefix.

O exemplo a seguir recupera um contêiner individual e uma lista de recursos de contêiner.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Approach 1: Retrieve an individual container
 Get-AzStorageContainer -Name $containerName -Context $ctx
 Write-Host

# Approach 2: Retrieve a list of containers
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx

O resultado fornece o URI do ponto de extremidade de blob e lista os contêineres recuperados por nome e prefixo.

   Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
individual-container                      11/2/2021 5:52:08 PM +00:00                                

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00                               

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00
loop-container3                           11/2/2021 12:22:00 AM +00:00   True       01D7E7129FDBD7D4
loop-container4                           11/2/2021 12:22:00 AM +00:00   True       01D7E8A5EF01C787 

Ler propriedades e metadados do contêiner

Um contêiner 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 apenas para seus próprios fins e não afetam como o recurso se comporta.

Propriedades do contentor

O exemplo a seguir recupera todos os contêineres com o prefixo demo e itera através deles, listando suas propriedades.

# Create variable
 $prefix = "loop"

# Get containers
 $containers = Get-AzStorageContainer -Prefix $prefix -Context $ctx

# Iterate containers, display properties
 Foreach ($container in $containers) 
 {
    $containerProperties = $container.BlobContainerClient.GetProperties()
    Write-Host $container.Name "properties:"
    $containerProperties.Value
 }

Os resultados exibem todos os contêineres com o loop de prefixo e listam suas propriedades.

loop-container1 properties:

LastModified                      : 12/7/2021 7:47:17 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA602806DA
Metadata                          : {}
HasImmutableStorageWithVersioning : False

loop-container2 properties:
LastModified                      : 12/7/2021 7:47:18 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA605996AE
Metadata                          : {}
HasImmutableStorageWithVersioning : False

Ler e gravar metadados de contêiner

Os usuários que têm muitos milhares de objetos em sua conta de armazenamento podem localizar rapidamente contêineres específicos com base em seus metadados. Para acessar os metadados, você usará o BlobContainerClient objeto. Este objeto permite que você acesse e manipule contêineres e seus blobs. Para atualizar metadados, você precisará chamar o SetMetadata() método. O método só aceita pares chave-valor armazenados em um objeto genérico IDictionary . Para obter mais informações, consulte a classe BlobContainerClient

O exemplo abaixo primeiro atualiza os metadados de um contêiner e depois recupera os metadados de um contêiner. O exemplo libera o contêiner de amostra da memória e o recupera novamente para garantir que os metadados não estejam sendo lidos do objeto na memória.

# Create variable
  $containerName = "individual-container"

# Retrieve container
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx

# Create IDictionary, add key-value metadata pairs to IDictionary
 $metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
 $metadata.Add("CustomerName","Anthony Bennedetto")
 $metadata.Add("CustomerDOB","08/03/1926")
 $metadata.Add("CustomerBirthplace","Long Island City")

# Update metadata
  $container.BlobContainerClient.SetMetadata($metadata, $null)

# Flush container from memory, retrieve updated container
 $container = $null
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx
 
# Display metadata
 $properties = $container.BlobContainerClient.GetProperties()
 Write-Host $container.Name "metadata:" 
 Write-Host $properties.Value.Metadata

Os resultados exibem os metadados completos de um contêiner.

individual-container metadata:

[CustomerName, Anthony Bennedetto] [CustomerDOB, 08/03/1926] [CustomerBirthplace, Long Island City]

Obter uma assinatura de acesso compartilhado para um contêiner

Uma assinatura de acesso compartilhado (SAS) fornece acesso delegado aos recursos do Azure. Uma SAS oferece controle granular sobre como um cliente pode acessar seus dados. Por exemplo, você pode especificar quais recursos estão disponíveis para o cliente. Você também pode limitar os tipos de operações que o cliente pode executar e especificar a quantidade de tempo para a qual as ações podem ser executadas.

Um SAS é comumente usado para fornecer acesso temporário e seguro a um cliente que normalmente não teria permissões. Um exemplo desse cenário seria um serviço que permite que os usuários leiam e gravem seus próprios dados em sua conta de armazenamento.

O Armazenamento do Azure dá suporte a três tipos de assinaturas de acesso compartilhado: delegação de usuário, serviço e SAS de conta. Para obter mais informações sobre assinaturas de acesso compartilhado, consulte o artigo Criar uma SAS de serviço para um contêiner ou blob .

Atenção

Qualquer cliente que possua uma SAS válida pode aceder aos dados na sua conta de armazenamento conforme permitido por essa SAS. É importante proteger um SAS contra uso mal-intencionado ou não intencional. Use discrição na distribuição de um SAS e tenha um plano para revogar um SAS comprometido.

O exemplo a seguir ilustra o processo de configuração de uma SAS de serviço para um contêiner específico usando o New-AzStorageContainerSASToken cmdlet. O exemplo configurará o SAS com tempos de início e expiração e um protocolo. Ele também especificará as permissões de leitura, gravação e lista no SAS usando o -Permission parâmetro. Você pode fazer referência à tabela completa de permissões no artigo Criar uma SAS de serviço.

# Create variables
 $accountName   = "<storage-account>"
 $containerName = "individual-container"
 $startTime     = Get-Date
 $expiryTime    = $startTime.AddDays(7)
 $permissions   = "rwl"
 $protocol      = "HttpsOnly"

# Create a context object using Azure AD credentials, retrieve container
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount
 
# Approach 1: Generate SAS token for a specific container
 $sas = New-AzStorageContainerSASToken `
 -Context $ctx `
 -Name $containerName `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol

# Approach 2: Generate SAS tokens for a container list using pipeline
  Get-AzStorageContainer -Container $filterName -Context $ctx | New-AzStorageContainerSASToken `
 -Context $ctx `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol | Write-Output

Nota

O token SAS retornado pelo Armazenamento de Blob não inclui o caractere delimitador ('?') para a cadeia de caracteres de consulta de URL. Se você estiver anexando o token SAS a uma URL de recurso, lembre-se de acrescentar também o caractere delimitador.

Eliminar contentores

Dependendo do seu caso de uso, você pode excluir um contêiner ou uma lista de contêineres com o Remove-AzStorageContainer cmdlet. Ao excluir uma lista de contêineres, você pode aproveitar operações condicionais, loops ou o pipeline do PowerShell, conforme mostrado nos exemplos abaixo.

# Create variables
 $accountName    = "<storage-account>"
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Delete a single named container
 Remove-AzStorageContainer -Name $containerName -Context $ctx

# Iterate a loop, deleting containers
 for ($i = 1; $i -le 2; $i++) { 
     Remove-AzStorageContainer -Name (-join($containerPrefix, $i)) -Context $ctx
    } 

# Retrieve container list, delete using a pipeline
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx | Remove-AzStorageContainer

Em alguns casos, é possível recuperar contêineres que foram excluídos. Se a opção de proteção de dados de exclusão suave da sua conta de armazenamento estiver ativada, o -IncludeDeleted parâmetro retornará os contêineres excluídos dentro do período de retenção associado. O -IncludeDeleted parâmetro só pode ser usado em conjunto com o -Prefix parâmetro ao retornar uma lista de contêineres. Para saber mais sobre a exclusão suave, consulte o artigo Exclusão suave para contêineres .

Use o exemplo a seguir para recuperar uma lista de contêineres excluídos dentro do período de retenção associado da conta de armazenamento.

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

Restaurar um contêiner excluído suavemente

Conforme mencionado na seção Listar contêineres , 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.

O exemplo a seguir explica como restaurar um contêiner excluído por software com o Restore-AzStorageContainer cmdlet. Antes de seguir este exemplo, você precisará habilitar a exclusão virtual e configurá-la 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 contêineres .

# Create variables
 $accountName = "<storage-account>"
 $prefixName  = "loop-"

# Create a context object using Azure AD credentials
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Retrieve all containers, filter deleted containers, restore deleted containers
 Get-AzStorageContainer -Prefix $prefixName -IncludeDeleted `
    -Context $ctx | ? { $_.IsDeleted } | Restore-AzStorageContainer

Os resultados exibem todos os contêineres com o prefixo demo que foram restaurados.

    Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
loop-container3                                                                                       
loop-container4               

Consulte também