Administración de blobs en bloques con PowerShell
Blob Storage admite blobs en bloques, blobs en anexos y blobs en páginas. Los blobs en bloques están optimizados para cargar grandes cantidades de datos de forma eficaz. Resultan muy adecuados para almacenar imágenes, documentos y otros tipos de datos que no están sujetos a operaciones aleatorias de lectura y escritura. En este artículo se explica cómo trabajar con los blobs en bloques.
Prerrequisitos
Suscripción a Azure. Consulte Obtención de una versión de evaluación gratuita.
El módulo
Az
de Azure PowerShell, que es el módulo recomendado de PowerShell para interactuar con Azure. Para empezar a trabajar con el módulo Az de PowerShell, consulte Instalación de Azure PowerShell.
Configuración de un objeto de contexto para encapsular credenciales
Cada solicitud para Azure Storage se debe autorizar. Puede autorizar una solicitud realizada desde PowerShell con su cuenta Microsoft Entra o utilizando las claves de acceso a la cuenta. Los ejemplos de este artículo utilizan la autorización Microsoft Entra con objetos de contexto. Los objetos de contexto encapsulan sus credenciales de Microsoft Entra y las pasan durante operaciones de datos subsecuentes.
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 Azure. La autenticación con Microsoft Entra ID crea automáticamente un contexto Azure para su suscripción predeterminada. En algunos casos, puede que necesite acceder a los recursos de otra suscripción después de la autenticación. Para ello, puede cambiar la suscripción asociada a la sesión de Azure actual mediante la modificación del contexto de la sesión activa.
Para usar la suscripción predeterminada, llame al cmdlet New-AzStorageContext
para crear el contexto. Incluya el parámetro -UseConnectedAccount
para que las operaciones de datos se realicen utilizando sus credenciales de Microsoft Entra.
#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount
Para cambiar las suscripciones, recupere el objeto de contexto con el cmdlet Get-AzSubscription y, a continuación, cambie el contexto actual con Set-AzContext. Para obtener más información, consulte Cambio de la suscripción activa.
Crear un contenedor
Todos los datos de blob se almacenan en contenedores, por lo que necesita al menos un recurso de contenedor antes de poder cargar datos. Si es necesario, use el ejemplo siguiente para crear un contenedor de almacenamiento. Para obtener más información, consulte Administración de contenedores de blobs con PowerShell.
#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx
Cuando use los ejemplos siguientes, tiene que reemplazar los valores de marcador de posición entre corchetes por 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.
Carga de un blob
Para cargar un archivo en un blob en bloques, pase los valores de parámetro requeridos al cmdlet Set-AzStorageBlobContent
. Proporcione la ruta de acceso y el nombre de archivo con el parámetro -File
y el nombre del contenedor con el parámetro -Container
. También debe proporcionar una referencia al objeto de contexto con el parámetro -Context
.
Este comando crea el blob si no existe o solicita la confirmación de sobrescritura si existe. Puede sobrescribir el archivo sin confirmación si pasa el parámetro -Force
al cmdlet.
En el ejemplo siguiente se especifica un valor de parámetro -File
para cargar un único archivo con nombre. También se muestra el uso del operador de canalización y el cmdlet Get-ChildItem
de PowerShell para cargar varios archivos. El cmdlet Get-ChildItem
usa el parámetro -Path
para especificar C:\Temp\*.png. La inclusión del carácter comodín de asterisco (*
) especifica todos los archivos con la extensión de nombre de archivo .png. El parámetro -Recurse
busca en el directorio Temp y sus subdirectorios.
#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
El resultado muestra el nombre de la cuenta de almacenamiento, el nombre del contenedor de almacenamiento y proporciona una lista de los archivos cargados.
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
Enumeración de blobs
El cmdlet Get-AzStorageBlob
se usa para enumerar los blobs almacenados en un contenedor. Puede usar varios enfoques para definir el ámbito de la búsqueda. Use los parámetros -Container
y -Name
para enumerar un blob específico dentro de un contenedor conocido. Para generar una lista sin filtrar de todos los blobs de un contenedor específico, use el parámetro -Container
solo, sin el valor -Name
.
No hay ninguna restricción respecto al número de contenedores o blobs que puede tener una cuenta de almacenamiento. Para evitar que se recuperen miles de blobs, es conveniente limitar la cantidad de datos que se devuelven. Al recuperar varios blobs, puede usar el parámetro -Prefix
para especificar los blobs cuyos nombres comienzan con una cadena específica. También puede usar el parámetro -Name
con un carácter comodín para especificar tipos o nombres de archivo.
El parámetro -MaxCount
se puede usar para limitar el número de blobs sin filtrar devueltos desde un contenedor. Se impone un límite de servicio de 5000 en todos los recursos de Azure. Este límite garantiza que se recuperen cantidades de datos administrables y que el rendimiento no se vea afectado. Si el número de blobs devueltos supera el valor -MaxCount
o el límite de servicio, se devuelve un token de continuación. Este token le permite usar varias solicitudes para recuperar un número de blobs cualquiera. Puede encontrar más información en Enumeración de recursos de blob.
En el ejemplo siguiente se muestran varios enfoques usados para proporcionar una lista de blobs. En el primer enfoque se enumera un solo blob dentro de un recurso de contenedor específico. En el segundo enfoque se usa un carácter comodín para enumerar todos los archivos .jpg
con el prefijo Louis. La búsqueda se restringe a cinco contenedores con el parámetro -MaxCount
. En el tercer enfoque se usan los parámetros -MaxCount
y -ContinuationToken
para limitar la recuperación de todos los blobs de un contenedor.
#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."
Los dos primeros enfoques muestran los nombres de la cuenta de almacenamiento y del contenedor, así como una lista de los blobs recuperados. El tercer enfoque muestra el recuento total de blobs de un contenedor con nombre. Los blobs se recuperan por lotes y una barra de estado muestra el progreso durante el recuento.
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.
Descarga de un blob
En función de su caso de uso, el cmdlet Get-AzStorageBlobContent
se puede usar para descargar uno o varios blobs. Al igual que con la mayoría de las operaciones, ambos enfoques requieren un objeto de contexto.
Para descargar un único blob con nombre, puede llamar al cmdlet directamente y proporcionar valores para los parámetros -Blob
y -Container
. De forma predeterminada, el blob se descarga en el directorio de trabajo de PowerShell, pero puede especificarse una ubicación alternativa. Para cambiar la ubicación de destino, se debe pasar una ruta de acceso válida y existente con el parámetro -Destination
. Dado que la operación no puede crear un destino, se produce un error si la ruta de acceso especificada no existe.
Para descargar varios blobs, combine el cmdlet Get-AzStorageBlob
y el operador de canalización de PowerShell. En primer lugar, cree una lista de blobs con el cmdlet Get-AzStorageBlob
. A continuación, use el operador de canalización y el cmdlet Get-AzStorageBlobContent
para recuperar los blobs del contenedor.
En el código de ejemplo siguiente se proporcionan enfoques de descarga única y múltiple. También se ofrece un enfoque simplificado para buscar archivos específicos en todos los contenedores con un carácter comodín. Dado que algunos entornos pueden tener cientos de miles de recursos, se recomienda usar el 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
El resultado muestra los nombres de la cuenta de almacenamiento y del contenedor y proporciona una lista de los archivos descargados.
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
Administración de propiedades y metadatos de blobs
Un contenedor expone tanto propiedades del sistema como metadatos definidos por el usuario. Existen propiedades del sistema en todos los recursos de Blob Storage. 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 varios pares nombre-valor que especifica para un recurso de Blob Storage. Puede usar metadatos para almacenar estos valores con el recurso. Los valores de metadatos se proporcionan para uso personal y no afectan a cómo se comporta el recurso.
Lectura de propiedades de un blob
Para leer las propiedades o los metadatos de un blob, primero debe recuperar el blob del servicio. Use el cmdlet Get-AzStorageBlob
para recuperar las propiedades y los metadatos de un blob, pero no su contenido. A continuación, use el método BlobClient.GetProperties
para capturar las propiedades del blob. Las propiedades o los metadatos se pueden leer o establecer después según sea necesario.
En el ejemplo siguiente se recupera un blob y se enumeran sus propiedades.
$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value
El resultado muestra una lista de las propiedades del blob, como se muestra en el siguiente ejemplo.
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
Lectura y escritura de los metadatos de un blob
Los metadatos de un blob son un conjunto opcional de pares nombre-valor asociados a un blob. Tal y como se muestra en el ejemplo anterior, no hay metadatos asociados a un blob inicialmente, aunque se pueden agregar cuando sea necesario. Para actualizar los metadatos del blob, se usa el método BlobClient.UpdateMetadata
. Este método solo acepta pares clave-valor almacenados en un objeto IDictionary
genérico. Para obtener más información, vea la definición de clase BlobClient.
En el ejemplo siguiente, primero se actualizan los metadatos de un blob, luego se confirman y, a continuación, se recuperan. El blob de ejemplo se vacía de la memoria para asegurarse de que los metadatos no se lean desde el objeto en memoria.
#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
El resultado devuelve los metadatos recién actualizados del blob, como se muestra en el siguiente ejemplo.
Key Value
--- -----
YearWritten 1934
YearRecorded 1958
Composer Richard Rogers
Lyricist Lorenz Hart
Artist Tony Bennett
Operaciones de copia de los blobs
Hay muchos escenarios en los que se pueden copiar blobs de diferentes tipos. Los ejemplos de este artículo se limitan a los blobs en bloques.
Copia de un blob de origen en un blob de destino
Para realizar una operación de copia simplificada dentro de la misma cuenta de almacenamiento, use el cmdlet Copy-AzStorageBlob
. Dado que la operación copia un blob dentro de la misma cuenta de almacenamiento, se trata de una operación sincrónica. Las operaciones entre cuentas son asincrónicas.
Considere la posibilidad de usar AzCopy para mayor facilidad y un mejor rendimiento, sobre todo al copiar blobs entre cuentas de almacenamiento. AzCopy es una utilidad de línea de comandos que puede usar para copiar blobs o archivos a una cuenta de almacenamiento o desde una cuenta de almacenamiento. Obtenga más información sobre cómo empezar en Introducción a AzCopy.
En el ejemplo siguiente se copia el blob bannerphoto.png del contenedor photos a la carpeta photos dentro del contenedor archive. Ambos contenedores existen dentro de la misma cuenta de almacenamiento. El resultado comprueba si la operación de copia se ha realizado correctamente.
$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
Puede usar el parámetro -Force
para sobrescribir un blob existente con el mismo nombre en el destino. Esta operación reemplaza de forma eficaz el blob de destino. También quita los bloques sin confirmar y sobrescribe los metadatos del blob de destino.
Copia de una instantánea en un blob de destino con otro nombre
El blob resultante de destino es un blob en el que se puede escribir y no una instantánea.
El blob de origen para una operación de copia puede ser un blob en bloques, un blob en anexos, un blob en páginas o una instantánea. Si el blob de destino ya existe, debe ser del mismo tipo que el blob de origen. Si existe un blob de destino, se sobrescribe.
No se puede modificar el blob de destino mientras haya una operación de copia en curso. Un blob de destino solo puede tener una operación de copia pendiente. En otras palabras, un blob no puede ser el destino de varias operaciones de copia pendientes.
Cuando se copia un blob dentro de la misma cuenta de almacenamiento, se trata de una operación sincrónica. Las operaciones de copia entre cuentas son asincrónicas.
Siempre se copia el blob o el archivo de origen completo, No se admite la copia de un intervalo de bytes o un conjunto de bloques.
Cuando se copia un blob, las propiedades del sistema al que pertenece se copian en el blob de destino con los mismos valores.
También se muestra cómo anular una operación de copia asincrónica.
Blobs de instantáneas
Una instantánea es una versión de solo lectura de un blob que se ha realizado en un momento dado. Una instantánea de blob es idéntica a su blob base, excepto que se anexa un valor DateTime al URI. Este valor indica la hora en la que se tomó la instantánea y ofrece la única distinción entre el blob base y la instantánea.
Las concesiones asociadas con el blob base no afectan a la instantánea. No puede adquirir una concesión sobre una instantánea. Obtenga más información sobre las Instantáneas de blob.
El código de ejemplo siguiente recupera un blob de un contenedor de almacenamiento y crea una instantánea de este.
$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()
Establecer nivel de blob
Cuando se cambia el nivel de un blob, se mueve el blob y todos sus datos al nivel de destino. Para ello, recupere un blob con el cmdlet Get-AzStorageBlob
y llame al método BlobClient.SetAccessTier
. Este enfoque se puede usar para cambiar el nivel entre frecuente, esporádico y archivo.
El cambio de los niveles de esporádico o frecuente a archivo se realiza de forma casi inmediata. Una vez que un blob se mueve al nivel archivo, se considera que está desconectado y no se puede leer ni modificar. Antes de poder leer o modificar los datos de un blob archivado, tiene que rehidratarlo a un nivel en línea. Obtenga más información sobre la Rehidratación de blobs desde el nivel de archivo.
El siguiente código de ejemplo establece el nivel en frecuente para todos los blobs dentro del contenedor archive
.
$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
$blob.BlobClient.SetAccessTier("Hot")
}
Operaciones con etiquetas de blob
Las etiquetas de índice de blobs facilitan la administración y la detección de datos. Estas etiquetas son atributos de índice de clave-valor definidos por el usuario que pueden aplicarse a los blobs. Una vez configuradas, puede clasificar y buscar objetos en un único contenedor o en todos los contenedores. Los recursos de blob se pueden clasificar de forma dinámica mediante la actualización de sus etiquetas de índice sin requerir ningún cambio en la organización del contenedor. Las etiquetas de índice ofrecen una forma flexible de hacer frente a los cambios en los requisitos de los datos. Puede usar tanto etiquetas de metadatos como de índice de forma simultánea. Para obtener más información sobre las etiquetas de índice, consulte Administración y búsqueda de datos de Azure Blob con etiquetas de índice de blobs.
En el ejemplo siguiente se muestra cómo agregar etiquetas de índice de blobs a una serie de blobs. En el ejemplo se leen los datos de un archivo XML y se usan para crear etiquetas de índice en varios blobs. Para usar el código de ejemplo, cree un archivo blob-list.xml local en el directorio C:\temp. En el siguiente ejemplo se proporcionan los datos XML.
<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>
El código de ejemplo crea una tabla hash y le asigna la variable $tags. Después, usa los cmdlets Get-Content
y Get-Data
para crear un objeto basado en la estructura XML. A continuación, agrega pares clave-valor a la tabla hash para usarlos como valores de la etiqueta. Por último, itera en el objeto XML y crea etiquetas para cada nodo 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
}
Eliminar blobs
Puede eliminar un único blob o una serie de blobs con el cmdlet Remove-AzStorageBlob
. Al eliminar varios blobs, puede utilizar las operaciones condicionales, los bucles o la canalización de PowerShell, tal y como se muestra en los ejemplos siguientes.
Advertencia
Al ejecutar los siguientes ejemplos se pueden eliminar los blobs de forma permanente. Microsoft recomienda habilitar la eliminación temporal de contenedores para proteger los contenedores y blobs contra la eliminación accidental. Para más información, consulte Eliminación temporal para contenedores.
#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
En algunos casos, es posible recuperar 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
devuelve los blobs eliminados dentro del período de retención asociado. Para obtener más información sobre la eliminación temporal, consulte el artículo Eliminación temporal para blobs.
Use el ejemplo siguiente para recuperar una lista de los blobs eliminados dentro del período de retención asociado al contenedor. El resultado muestra una lista de blobs eliminados recientemente.
#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
Restauración de un blob eliminado
Tal y como se mencionó en la sección Enumeración de blobs, 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 blobs eliminados dentro del período de retención asociado. También puede usar el control de versiones para conservar las versiones anteriores de los blobs para cada recuperación y restauración.
Si están habilitados el control de versiones y la eliminación temporal de blobs, al modificar, sobrescribir, eliminar o restaurar un blob se crea una versión automáticamente. El método que usa para restaurar un blob eliminado depende de si el control de versiones está habilitado en la cuenta de almacenamiento.
En el ejemplo de código siguiente se restauran todos los blobs eliminados temporalmente o, si el control de versiones está habilitado, se restaura la versión más reciente de un blob. Primero determina si el control de versiones está habilitado con el cmdlet Get-AzStorageBlobServiceProperty
.
Si el control de versiones está habilitado, el cmdlet Get-AzStorageBlob
recupera una lista de todas las versiones de blob con nombre único. A continuación, las versiones de blob de la lista se recuperan y ordenan por fecha. Si no se encuentra ninguna versión con el valor de atributo LatestVersion
, el cmdlet Copy-AzBlob
se usa para realizar una copia activa de la versión más reciente.
Si el control de versiones está deshabilitado, el método BlobBaseClient.Undelete
se usa para restaurar cada blob eliminado temporalmente en el contenedor.
Para poder seguir este ejemplo, antes debe habilitar la eliminación temporal o el control de versiones en al menos una de sus cuentas de almacenamiento.
Importante
En el ejemplo siguiente se enumera un grupo de blobs y se almacenan en memoria antes de procesarlos. Si el control de versiones está habilitado, los blobs también se ordenan. El uso del parámetro -ContinuationToken
con la variable $maxCount
limita el número de blobs dentro del grupo para conservar los recursos. Si un contenedor tiene millones de blobs, esto será extremadamente caro. Puede ajustar el valor de la variable $maxCount
, aunque si un contenedor tiene millones de blobs, el script procesará los blobs lentamente.
Para obtener 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 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."
}