Administración de blobs en bloques con la CLI de Azure

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

Para acceder a Azure Storage, necesitará una suscripción de Azure. Si todavía no tiene una suscripción, cree una cuenta gratuita antes de empezar.

Todo el acceso a Azure Storage tiene lugar mediante una cuenta de almacenamiento. En este inicio rápido, cree una cuenta de almacenamiento con Azure Portal, Azure PowerShell o la CLI de Azure. Si necesita ayuda para crear una cuenta de almacenamiento, consulte Creación de una cuenta de almacenamiento.

Preparación del entorno para la CLI de Azure

  • En este artículo se necesita la versión 2.0.46 de la CLI de Azure, o cualquier versión posterior. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

Autorización del acceso al almacenamiento de blobs

Puede autorizar el acceso al almacenamiento Blob desde la CLI de Azure con credenciales de Microsoft Entra o utilizando una clave de acceso a la cuenta de almacenamiento. Se recomienda utilizar credenciales de Microsoft Entra, y los ejemplos de este artículo utilizan exclusivamente Microsoft Entra ID.

Los comandos de la CLI de Azure para operaciones de datos en el almacenamiento de blobs admiten el parámetro --auth-mode, que permite especificar cómo se autoriza una operación determinada. Establezca el parámetro --auth-mode de inicio de sesión para autorizar con credenciales de Microsoft Entra. Solo las operaciones de datos de almacenamiento de blobs admiten el parámetro --auth-mode. Las operaciones de administración, como la creación de un grupo de recursos o una cuenta de almacenamiento, utilizan automáticamente las credenciales de Microsoft Entra para la autorización. Para más información, consulte Distintas formas de autorizar el acceso a datos en blobs con la CLI de Azure.

Ejecute el comando login para abrir un explorador y conectarse a su suscripción de Azure.


az login

Crear un contenedor

Todos los datos de blob se almacenan en contenedores, por lo que necesitará 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 más información, consulte Administración de contenedores de blobs con la CLI de Azure.


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

# Create a container object
az storage container create \
    --name $containerName \
    --account-name $storageAccount
    --auth-mode login

Cuando use los ejemplos incluidos en este artículo, tendrá que reemplazar los valores de marcador de posición entre corchetes por los suyos propios. Para más información sobre cómo iniciar sesión en Azure con la CLI de Azure, consulte Inicio de sesión con la CLI de Azure.

Cargar blobs

La CLI de Azure ofrece comandos que realizan operaciones en uno o varios recursos, en función de sus requisitos.

Para cargar un archivo en un blob en bloques, pase los valores de parámetro requeridos al comando az storage blob upload. Proporcione la ruta de acceso y el nombre de archivo con el parámetro --file y el nombre del contenedor de destino con el parámetro --container-name. También tendrá que proporcionar el parámetro --account-name. Este comando crea un nuevo blob o sobrescribe el blob original si ya existe.

Puede usar el comando az storage blob upload-batch para cargar de forma recursiva varios blobs en un contenedor de almacenamiento. Puede usar la coincidencia de patrones de nombre de archivo de Unix para especificar un intervalo de archivos para cargar con el parámetro --pattern. Los patrones admitidos son *, ?, [seq] y [!seq]. Para más información, consulte la documentación de Python sobre la coincidencia de patrones de nombre de archivo de Unix.

En el ejemplo siguiente, la primera operación usa el comando az storage blob upload para cargar un único archivo con nombre. El archivo de origen y el contenedor de almacenamiento de destino se especifican con los parámetros --file y --container-name.

La segunda operación muestra el uso del comando az storage blob upload-batch para cargar varios archivos. El parámetro --if-modified-since garantiza que solo se cargan los archivos modificados en los últimos siete días. El valor proporcionado por este parámetro debe proporcionarse en formato UTC.


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
lastModified=$(date +%Y:%m:%d -d "7 days ago")

path="C:\\temp\\"
filename="demo-file.txt"
imageFiles="*.png"
file="$path$filename"

#Upload a single named file
az storage blob upload \
    --file $file \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login

#Upload multiple image files recursively
az storage blob upload-batch \
    --destination $containerName \
    --source $path \
    --pattern *.png \
    --account-name $storageAccount \
    --auth-mode login \
    --if-modified-since $lastModified

Enumeración de blobs

De forma predeterminada, el comando az storage blob list muestra todos los blobs almacenados en un contenedor. Puede usar varios enfoques para definir el ámbito de la búsqueda. 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.

Use el parámetro --prefix para seleccionar un único archivo conocido o un intervalo de archivos cuyos nombres comiencen por una cadena definida. Puede especificar un directorio virtual como parte del parámetro --prefix.

De forma predeterminada, solo se devuelven blobs en una operación de lista. En algunos escenarios, es posible que quiera pasar un valor para el parámetro --include para devolver tipos adicionales de objetos, como blobs, instantáneas y versiones eliminados temporalmente. Estos valores se pueden combinar para devolver varios tipos de objeto.

El parámetro --num-results se puede usar para limitar el número de blobs devueltos de 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 --num-results 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. El primer enfoque enumera todos los blobs de un contenedor especificado. El segundo enfoque usa el parámetro --prefix para enumerar todos los blobs de los contenedores que comienzan con el prefijo especificado. El tercer enfoque usa el parámetro --num-results para limitar los resultados devueltos y el parámetro --show-next-marker para incluir el token de continuación en los resultados. Cuando hay presente un token de continuación en los resultados, se pasa en la llamada posterior a az storage blob list para recuperar el siguiente conjunto de resultados.

Para obtener más información, consulte la referencia de az storage blob list.

#!/bin/bash
storageAccount="<storage-account>"
containerName="<container-name>"
blobPrefix="<prefix-string>"
numResults=5

#Approach 1: List all blobs in a container by name.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 2: Use the --prefix parameter to list blobs starting with specified prefix.

az storage blob list \
    --account-name $storageAccount \
    --container $containerName \
    --prefix $blobPrefix \
    --query "[].name" \
    --auth-mode login \
    --output tsv

#Approach 3: Use the continuation token to return the complete set of results.

get_blobs() {
    if [ -z "$nextMarker" ]; then
        az storage blob list --container-name $containerName --num-results $numResults --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    else
        az storage blob list --container-name $containerName --num-results $numResults --marker $nextMarker --account-name $storageAccount --show-next-marker --only-show-errors --auth-mode login
    fi
}
 
total=0
nextMarker=""
while true; do
    blobs=$(get_blobs $containerName $numResults $storageAccount $nextMarker) 
    nextMarker=""
    blobsLength=$(echo $blobs | jq length)
    
    if [ $blobsLength -le 0 ]; then
        break
    fi
    
    blobIndex=0
    while read blob; do
        if [ $blobIndex -eq $(($blobsLength-1)) ]; 
        then
            nextMarker="$(echo $blob | jq -r .nextMarker)"
        else
            blobName=$(echo $blob | jq .name)
            echo "blobname: $blobName"
        fi
        ((blobIndex++))
    done <<<$(echo $blobs | jq -c '.[]')
 
    total=$(($total+$blobsLength-1))
    echo "Processed $total blobs so far"
    # echo "nextMarker: $nextMarker"
    if [ "${nextMarker}" = "null" ]; then
        echo -e "\nAccountName: $storageAccount, ContainerName: $containerName "
        echo "Processed $total blobs in total."
        break
    fi
done

Descarga de un blob

En función del caso de uso, usará el comando az storage blob download o el comando az storage blob download-batch para descargar los blobs. Para descargar un solo blob, llame al comando az storage blob download directamente y pase los valores de los parámetros --container-name, --file y --name. El blob se descarga en el directorio del shell de manera predeterminada, pero se puede especificar una ubicación alternativa. La operación producirá un error si la ruta de acceso especificada no existe.

Para descargar de forma recursiva varios blobs de un contenedor de almacenamiento, use el comando az storage blob download-batch. Este comando admite la coincidencia de patrones de nombre de archivo de Unix con el parámetro --pattern. Los patrones admitidos son *, ?, [seq] y [!seq]. Para más información, consulte la documentación de Python sobre la coincidencia de patrones de nombre de archivo de Unix.

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 miles de recursos, se recomienda usar el parámetro --num-results.

Para obtener más información, consulte la referencia de az storage blob download y az storage blob download batch.

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

destinationPath="C:\\temp\\downloads\\"
destinationFilename="downloadedBlob.txt"
file="$destinationPath$destinationFilename"
sourceBlobName="demo-file.txt"

#Download a single named blob

az storage blob download \
    --container $containerName \
    --file $file \
    --name $sourceBlobName \
    --account-name $storageAccount \
    --auth-mode login

#Download multiple blobs using a pattern value

az storage blob download-batch \
    --destination $destinationPath \
    --source $containerName \
    --pattern images/*.png \
    --account-name $storageAccount \
    --auth-mode login

#Use a loop to download matching blobs in a list of containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results 5 \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
   
    az storage blob download-batch \
        --destination $destinationPath \
        --source $tmpName \
        --pattern *louis*.* \
        --account-name $storageAccount \
        --auth-mode login
done

Administración de propiedades y metadatos de blobs

Un blob expone tanto las propiedades del sistema como los 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 valores adicionales 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 az storage blob show para recuperar las propiedades y los metadatos de un blob, pero no su contenido. En el ejemplo siguiente se recupera un blob y se enumeran sus propiedades.

Para obtener más información, consulte la referencia de az storage blob show.

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob show \
    --container  demo-container \
    --name demo-file.txt \
    --account-name $storageAccount \
    --auth-mode login

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 leerlos, use el comando az storage blob metadata show. Para actualizar los metadatos del blob, usará az storage blob metadata update y suministrará una matriz de pares clave-valor. Para más información, consulte la referencia az storage blob metadata.

Para más información, consulte la referencia az storage blob metadata.

En el ejemplo siguiente, primero se actualizan los metadatos de un blob, luego se confirman y, a continuación, se recuperan.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="blue-moon.mp3"

metadata=("Written=1934" "Recorded=1958")
metadata+=("Lyricist=Lorenz Hart")
metadata+=("Composer=Richard Rogers")
metadata+=("Artist=Tony Bennett")

#Update metadata
az storage blob metadata update \
    --container-name $containerName \
    --name $blobName \
    --metadata "${metadata[@]}" \
    --account-name $storageAccount \
    --auth-mode login

#Retrieve updated blob metadata
az storage blob metadata show \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

Operaciones de copia de los blobs

Hay muchos escenarios en los que se pueden copiar blobs de distintos tipos. Los ejemplos de este artículo se limitan a los blobs en bloques. La CLI de Azure ofrece comandos que realizan operaciones en uno o varios recursos, en función de sus requisitos.

Para copiar un blob específico, use el comando az storage blob copy start y especifique valores para los contenedores y los blobs de origen y destino. También es posible proporcionar como origen un identificador uniforme de recursos (URI), un recurso compartido o una firma de acceso compartido (SAS).

Además, puede especificar las condiciones bajo las que se copiará el blob. Estas condiciones se pueden establecer para el blob de origen o de destino. Puede hacer referencia a la fecha de última modificación, los datos de etiqueta o el valor de ETag. Por ejemplo, puede elegir copiar blobs que no se hayan modificado recientemente en un contenedor independiente. Para más información, consulte Especificación de encabezados condicionales para las operaciones de Blob service.

Puede usar el comando az storage blob copy start-batch para copiar de forma recursiva varios blobs entre contenedores de almacenamiento dentro de la misma cuenta de almacenamiento. Este comando requiere valores para los parámetros --source-container y --destination-container, y puede copiar todos los archivos entre el origen y el destino. Al igual que otros comandos por lotes de la CLI, este comando admite la coincidencia de patrones de nombre de archivo de Unix con el parámetro --pattern. Los patrones admitidos son *, ?, [seq] y [!seq]. Para más información, consulte la documentación de Python sobre la coincidencia de patrones de nombre de archivo de Unix.

Nota:

Considere la posibilidad de usar AzCopy por su uso sencillo y buen 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.

Para más información, consulte la referencia az storage blob copy.

En el código de ejemplo siguiente se proporciona un ejemplo de operaciones de copia única y múltiple. Dado que algunos entornos pueden tener miles de recursos, se recomienda usar el parámetro --num-results. En el ejemplo siguiente se copia el blob secret-town-road.png del contenedor photos al contenedor locations. Ambos contenedores existen dentro de la misma cuenta de almacenamiento. El resultado comprueba si la operación de copia se ha realizado correctamente.

#!/bin/bash
storageAccount="<storage-account>"
sourceContainer="photos"
blobName="secret-town-road.jpg"
destContainer="locations"

az storage blob copy start \
    --destination-container $destContainer \
    --destination-blob $blobName \
    --source-container $sourceContainer \
    --source-blob $blobName \
    --account-name $storageAccount \
    --auth-mode login

Blobs de instantáneas

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. Para más información, consulte la referencia az storage blob snapshot.

El código de ejemplo siguiente recupera un blob de un contenedor de almacenamiento y crea una instantánea de este.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"

az storage blob snapshot \
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --account-name $storageAccount \
    --auth-mode login

Establecer nivel de blob

Cuando se cambia el nivel de un blob, se mueve el blob y todos sus datos al nivel de destino. Puede cambiar el nivel entre frecuente, esporádico y archivo con el comando az storage blob set-tier.

En función de sus requisitos, también puede usar la operación Copiar blob para copiar un blob de un nivel a otro. La operación Copiar blob crea un nuevo blob en el nivel deseado y deja el blob de origen en el nivel original.

El cambio de nivel 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, tendrá que rehidratarlo a un nivel en línea. Obtenga más información sobre la Rehidratación de blobs desde el nivel de archivo.

Para obtener más información, consulte la referencia de az storage blob set-tier.

El siguiente código de ejemplo establece el nivel en frecuente para un único blob con nombre dentro del contenedor archive.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob set-tier 
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --tier Hot \
    --account-name $storageAccount \
    --auth-mode login

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. Este enfoque ofrece 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.

Sugerencia

En el ejemplo de código que se proporciona a continuación se usa la coincidencia de patrones para obtener texto de un archivo XML que tiene una estructura conocida. El ejemplo se usa para ilustrar un enfoque simplificado de agregar etiquetas de blobs mediante funcionalidad básica de Bash. Siempre se recomienda el uso de una herramienta de análisis de datos real al consumir datos para cargas de trabajo de producción.

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. Los datos XML se proporcionan a continuación.

Para obtener más información, consulte la referencia de az storage blob set-tier.

<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 recorre en iteración las líneas dentro del archivo XML. Busca el elemento Venue y crea variables para los valores Nombre y Tipo. A continuación, recorre en iteración las líneas restantes y crea etiquetas para cada blob al que hace referencia un nodo File.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

while read line
do
  
#Set Tag values 
if echo "$line" | grep -q "<Venue";then
    name=`echo "$line" | cut -d'"' -f 2`
    type=`echo "$line" | cut -d'"' -f 4`
    tags=("name=$name")
    tags+=("type=$type")
fi

#Add tags to blobs
if echo "$line" | grep -q "<File ";then
    blobName=`echo "$line" | cut -d'"' -f 2`
    
    echo az storage blob tag set \
        --container-name $containerName \
        --name $blobName \
        --account-name $storageAccount \
        --auth-mode login \
        --tags "{$tags[@]}"
fi

done < /mnt/c/temp/bloblist.xml

Eliminar blobs

Puede eliminar un único blob o una serie de blobs con los comandos az storage blob delete y az storage blob delete-batch. Al eliminar varios blobs, puede usar las operaciones condicionales, los bucles u otro tipo de automatización, 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.

En el código de ejemplo siguiente se proporciona un ejemplo de operaciones de eliminación única y múltiple. En el primer ejemplo se elimina un único blob con nombre. En el segundo ejemplo se muestra el uso de operaciones lógicas en Bash para eliminar varios blobs. En el tercer ejemplo se usa el comando delete-batch para eliminar todos los blobs con el formato bennett-x, excepto bennett-2.

Para más información, consulte las referencias az storage blob delete y az storage blob delete-batch.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobName="demo-file.txt"
blobPrefix="sinatra-"

#Delete a single, named blob
az storage blob delete \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

#Iterate a blob list, deleting blobs whose names end with even numbers

## Get list of containers
blobList=$(az storage blob list \
    --query "[].name" \
    --prefix $blobPrefix \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

## Delete all blobs with the format *bennett-x* except *bennett-2.*
for row in $blobList
do
    #Get the blob's number
    tmpBlob=$(echo $row | sed -e 's/\r//g') 
    tmpName=$(echo ${row%.*} | sed -e 's/\r//g')

    if [ `expr ${tmpName: ${#blobPrefix}} % 2` == 0 ]
    then
        
        echo "Deleting $tmpBlob"
        az storage blob delete \
            --container-name $containerName \
            --name $tmpBlob \
            --account-name $storageAccount \
            --auth-mode login

  fi
done

#Delete multiple blobs using delete-batch
az storage blob delete-batch \
    --source $containerName \
    --pattern bennett-[!2].* \
    --account-name $storageAccount \
    --auth-mode login

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 la cuenta de almacenamiento está habilitada, pasar el parámetro --include d devuelve los blobs que se eliminaron dentro del período de retención de la cuenta. Para obtener más información sobre la eliminación temporal, consulte el artículo Eliminación temporal para blobs.

Use los ejemplos siguientes para recuperar una lista de los blobs eliminados dentro del período de retención asociado al contenedor. En el primer ejemplo se muestra una lista de todos los blobs eliminados recientemente y las fechas en las que se eliminaron. En el segundo ejemplo se enumeran todos los blobs eliminados que coinciden con un prefijo específico.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobPrefix="sinatra-"

#Retrieve a list of all deleted blobs
az storage blob list \
    --container-name $containerName \
    --include d \
    --output table \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[?deleted].{name:name,deleted:properties.deletedTime}"

#Retrieve a list of all deleted blobs matching a specific prefix
az storage blob list \
    --container-name $containerName \
    --prefix $blobPrefix \
    --output table \
    --include d \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[].{name:name,deleted:deleted}"

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 contenedores 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 se usa para restaurar un blob eliminado dependerá 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 comando az storage account blob-service-properties show.

Si el control de versiones está habilitado, el comando az storage blob list recupera una lista de todas las versiones del 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 isCurrentVersion, el comando az storage blob copy start se usa para realizar una copia activa de la versión más reciente del blob.

Si el control de versiones está deshabilitado, el comando az storage blob undelete se usa para restaurar cada blob eliminado temporalmente en el contenedor.

Para seguir este ejemplo, antes deberá habilitar la eliminación temporal en al menos 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 blobs o la referencia az storage blob undelete.

#!/bin/bash
storageAccount="<storage-account>"
groupName="myResourceGroup"
containerName="demo-container"

blobSvcProps=$(
    az storage account blob-service-properties show \
        --account-name $storageAccount \
        --resource-group $groupName)

softDelete=$(echo "${blobSvcProps}" | jq -r '.deleteRetentionPolicy.enabled')
versioning=$(echo "${blobSvcProps}" | jq -r '.isVersioningEnabled')

# If soft delete is enabled
if $softDelete
then
    
    # If versioning is enabled
    if $versioning
    then

        # Get all blobs and versions using -Unique to avoid processing duplicates/versions
        blobList=$(
            az storage blob list \
                --account-name $storageAccount \
                --container-name $containerName \
                --include dv \--query "[?versionId != null].{name:name}" \
                --auth-mode login -o tsv | uniq)
        
        # Iterate the collection
        for blob in $blobList
        do
            # Get all versions of the blob, newest to oldest
            blobVers=$(
                az storage blob list \
                    --account-name $storageAccount \
                    --container-name $containerName \
                    --include dv \
                    --prefix $blob \
                    --auth-mode login -o json | jq 'sort_by(.versionId) | reverse | .[]')
            # Select the first (newest) object
            delBlob=$(echo "$blobVers" | jq -sr '.[0]')
            
            # Verify that the newest version is NOT the latest (that the version is "deleted")
            if [[ $(echo "$delBlob" | jq '.isCurrentVersion') != true ]]; 
            then
                # Get the blob's versionId property, build the URI to the blob
                versionID=$(echo "$delBlob" | jq -r '.versionId')
                uri="https://$storageAccount.blob.core.windows.net/$containerName/$blob?versionId=$versionID"
                
                # Copy the latest version 
                az storage blob copy start \
                    --account-name $storageAccount \
                    --destination-blob $blob \
                    --destination-container $containerName \
                    --source-uri $uri \
                    --auth-mode login
       
                delBlob=""
            fi
        done

    else

        #Retrieve all deleted blobs
        blobList=$( \
            az storage blob list \
                --container-name $containerName \
                --include d \
                --output tsv \
                --account-name $storageAccount \
                --auth-mode login \
                --query "[?deleted].[name]" \
        )

        #Iterate list of deleted blobs and restore
        for row in $blobList
        do
            tmpName=$(echo $row | sed -e 's/\r//g')
            echo "Restoring $tmpName"
            az storage blob undelete \
                --container-name $containerName \
                --name $tmpName \
                --account-name $storageAccount \
                --auth-mode login
        done

    fi

else
    
    #Soft delete is not enabled
    echo "Sorry, the delete retention policy is not enabled."

fi

Pasos siguientes