Administración de contenedores de blobs mediante PowerShell

Azure Blob Storage permite almacenar grandes cantidades de datos de objetos sin estructura. Blob Storage se puede usar para recopilar o exponer datos multimedia, de contenido o de aplicaciones a los usuarios. Como todos los datos de blob se almacenan en contenedores, debe crear un contenedor de almacenamiento antes de empezar a cargar datos. Para más información sobre Blob Storage, lea la introducción a Azure Blob Storage.

Este artículo explica cómo trabajar con objetos de contenedor de almacenamiento tanto individuales como múltiples.

Prerrequisitos

Para poder usar los ejemplos de este artículo, necesitará obtener autorización para una suscripción de Azure. La autorización puede producirse mediante la autenticación con una cuenta de Microsoft Entra o mediante una clave compartida. En los ejemplos de este artículo se usa la autenticación de Microsoft Entra junto con objetos de contexto. Los objetos de contexto encapsulan las credenciales de Microsoft Entra y las pasan en operaciones de datos posteriores, lo que elimina la necesidad de volver a autenticarse.

Para iniciar sesión en su cuenta Azure con una cuenta Microsoft Entra, abra PowerShell y llame al cmdlet Connect-AzAccount.

# Connect to your Azure subscription
 Connect-AzAccount

Una vez establecida la conexión, cree el contexto de la cuenta de almacenamiento llamando al cmdlet New-AzStorageContext. Incluya el parámetro -UseConnectedAccount para que las operaciones de datos se realicen mediante sus credenciales de Microsoft Entra.

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

No olvide reemplazar los valores del marcador de posición entre corchetes con sus propios valores. Para obtener más información sobre cómo iniciar sesión en Azure con PowerShell, consulte Inicio de sesión con Azure PowerShell.

Crear un contenedor

Para crear contenedores con PowerShell, llame al cmdlet New-AzStorageContainer. No hay límites en el número de blobs o contenedores que se pueden crear en una cuenta de almacenamiento. Los contenedores no se pueden anidar dentro de otros contenedores.

En el ejemplo siguiente se ilustran tres opciones para la creación de contenedores de blobs con el cmdlet New-AzStorageContainer. El primer enfoque crea un único contenedor, mientras que los dos enfoques restantes aprovechan las operaciones de PowerShell para automatizar la creación de contenedores.

Para usar este ejemplo, especifique valores para las variables y asegúrese de que ha creado una conexión a su suscripción de Azure. No olvide reemplazar los valores del marcador de posición entre corchetes con sus propios 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

El resultado proporciona el nombre de la cuenta de almacenamiento y confirma la creación del nuevo contenedor.

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          

Enumerar contenedores

Use el cmdlet Get-AzStorageContainer para recuperar contenedores de almacenamiento. Para recuperar un único contenedor, incluya el parámetro -Name. Para devolver una lista de contenedores que comience con una cadena de caracteres determinada, especifique un valor para el parámetro -Prefix.

En el ejemplo siguiente se recuperan no solo un contenedor individual, sino también una lista de recursos de contenedor.

# 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

El resultado proporciona el identificador URI del punto de conexión del blob y enumera los contenedores recuperados por nombre y prefijo.

   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 

Metadatos y propiedades del contenedor de lectura

Un contenedor expone tanto las propiedades del sistema como los metadatos definidos por el usuario. En cada recurso de almacenamiento de blobs existen propiedades del sistema. Algunas propiedades son de solo lectura, mientras que otras se pueden leer o establecer. En segundo plano, algunas propiedades del sistema se asignan a ciertos encabezados HTTP estándar.

Los metadatos definidos por el usuario se componen de uno o más pares nombre-valor que se especifican para un recurso de almacenamiento de blobs. Puede usar metadatos para almacenar valores adicionales con el recurso. Los valores de metadatos se proporcionan para uso personal y no afectan a cómo se comporta el recurso.

Propiedades del contenedor

En el ejemplo siguiente se recuperan todos los contenedores con el prefijo demo y se itera por ellos, enumerando sus propiedades.

# 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
 }

Los resultados muestran todos los contenedores con el bucle del prefijo y muestran sus propiedades.

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

Metadatos de contenedor de lectura y escritura

Los usuarios que tienen muchos miles de objetos dentro de su cuenta de almacenamiento pueden localizar rápidamente contenedores específicos en función de sus metadatos. Para acceder a los metadatos, usará el objeto BlobContainerClient. Este objeto le permite acceder y manipular contenedores y sus blobs. Para actualizar los metadatos, tendrá que llamar al método SetMetadata(). El método solo acepta pares clave-valor almacenados en un objeto IDictionary genérico. Para más información, vea la clase BlobContainerClient

El ejemplo siguiente actualiza primero los metadatos de un contenedor y, después, recupera los metadatos de un contenedor. El ejemplo vacía el contenedor de ejemplo de la memoria y lo recupera de nuevo para asegurarse de que no se leen metadatos desde el objeto en la memoria.

# 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

Los resultados muestran los metadatos completos de un contenedor.

individual-container metadata:

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

Obtención de una firma de acceso compartido para un contenedor

Las firmas de acceso compartido (SAS) ofrecen acceso delegado a los recursos de Azure. Una SAS proporciona control granular sobre la forma en que un cliente puede acceder a los datos. Por ejemplo, puede especificar qué recursos están disponibles para el cliente. También puede limitar los tipos de operaciones que el cliente puede realizar y especificar la cantidad de tiempo durante la que se pueden realizar las acciones.

Una SAS se usa normalmente para proporcionar acceso temporal y seguro a un cliente que normalmente no tendría permisos. Un ejemplo de este escenario sería un servicio que permite a los usuarios leer y escribir sus propios datos en su cuenta de almacenamiento.

Azure Storage admite tres tipos de firmas de acceso compartido: delegación de usuarios, servicio y SAS de cuenta. Para más información sobre las firmas de acceso compartido, consulte el artículo Creación de una SAS de servicio para un contenedor o blob.

Precaución

Cualquier cliente que posea una SAS válida puede acceder a los datos de la cuenta de almacenamiento según lo permitido por esa SAS. Es importante proteger una SAS de uso malintencionado o no intencionado. Sea cauto al distribuir una SAS y tenga un plan para revocar una SAS en peligro.

En el ejemplo siguiente se ilustra el proceso de configuración de una SAS de servicio para un contenedor específico mediante el cmdlet New-AzStorageContainerSASToken. El ejemplo configurará la SAS con las horas de inicio y expiración y un protocolo. También especificará los permisos de lectura, escritura y enumeración, mediante el parámetro -Permission. Puede hacer referencia a la tabla de permisos completa en el artículo Creación de una SAS de servicio.

# 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:

El token de SAS que ha devuelto Blob Storage no incluye el carácter delimitador ("?") para la cadena de consulta de dirección URL. Si va a anexar el token de SAS a una dirección URL de recurso, recuerde también anexar el carácter delimitador.

Eliminación de contenedores

En función del caso de uso, puede eliminar un contenedor o una lista de contenedores con el cmdlet Remove-AzStorageContainer. Al eliminar una lista de contenedores, puede aprovechar las operaciones condicionales, los bucles o la canalización de PowerShell, tal como se muestra en los ejemplos siguientes.

# 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

En algunos casos, es posible recuperar los blobs que se hayan eliminado. Si la opción de protección de datos de eliminación temporal de su cuenta de almacenamiento está habilitada, el parámetro -IncludeDeleted devolverá los contenedores eliminados dentro del período de retención asociado. El parámetro -IncludeDeleted solo se puede usar junto con el parámetro -Prefix al devolver una lista de contenedores. Para más información sobre la eliminación temporal, consulte el artículo Eliminación temporal para contenedores.

Use el ejemplo siguiente para recuperar una lista de los contenedores eliminados dentro del período de retención asociado a la cuenta de almacenamiento.

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

Restauración de un contenedor eliminado temporalmente

Tal como se mencionó en la sección Enumeración de contenedores, puede configurar la opción de protección de datos de eliminación temporal en su cuenta de almacenamiento. Cuando se habilita, se pueden restaurar los contenedores eliminados dentro del período de retención asociado.

En el ejemplo siguiente se explica cómo restaurar un contenedor eliminado temporalmente con el cmdlet Restore-AzStorageContainer. Para poder seguir este ejemplo, deberá habilitar la eliminación temporal y configurarla al menos en una de sus cuentas de almacenamiento.

Para más información sobre la opción de protección de datos de eliminación temporal, consulte el artículo Eliminación temporal para contenedores.

# 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

Los resultados muestran todos los contenedores con el prefijo demo que se han restaurado.

    Storage Account Name: demostorageaccount

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

Consulte también