Compartir vía


Eliminación y restauración de un blob con Python

Este artículo muestra cómo eliminar blobs usando el biblioteca cliente de Azure Storage para Python, y cómo restaurar blobs eliminados temporalmente durante el periodo de retención.

Para obtener información sobre cómo eliminar un blob mediante API asincrónicas, consulte Eliminación de un blob de forma asincrónica.

Requisitos previos

Configurar el entorno

Si no tiene un proyecto existente, en esta sección se muestra cómo configurar uno para que funcione con la biblioteca cliente de Azure Blob Storage para Python. Para más información, vea Introducción a Azure Blob Storage y Python.

Para trabajar con los ejemplos de código de este artículo, siga los pasos siguientes a fin de configurar el proyecto.

Instalar paquetes

Instale los siguientes paquetes mediante pip install:

pip install azure-storage-blob azure-identity

Adición de instrucciones import

Agregue las instrucciones siguientes import :

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

Authorization

El mecanismo de autorización necesario debe tener permisos para eliminar un contenedor de blobs o para restaurar un contenedor eliminado temporalmente. Para la autorización con Microsoft Entra ID (recomendado) se necesita el rol integrado de RBAC de Azure de Colaborador de datos de Storage Blob o superior. Para obtener más información, consulte la guía de autorización para Eliminar blob (API de REST) y Anular la eliminación de Blob (API de REST).

Creación de un objeto de cliente

Para conectar una aplicación a Blob Storage, cree una instancia de BlobServiceClient. En el ejemplo siguiente se muestra cómo crear un objeto de cliente mediante DefaultAzureCredential para la autorización:

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

También puede crear objetos de cliente para contenedores o blobs específicos ya sea directamente o desde el objeto BlobServiceClient. Para obtener más información sobre cómo crear y administrar objetos de cliente, consulte Crear y administrar objetos de cliente que interactúan con los recursos de datos.

Eliminar un blob

Nota:

Cuando la eliminación temporal de blobs está habilitada para una cuenta de almacenamiento, no puede realizar una eliminación permanente mediante métodos de biblioteca cliente. Usando los métodos de este artículo, un blob, una versión de blob o una instantánea eliminados de forma temporal permanecen disponibles hasta que expira el periodo de retención, momento en el que se eliminan de forma permanente. Para más información sobre la operación subyacente de la API de REST, consulte Eliminar blob (API de REST).

Para eliminar un blob, llame al método siguiente:

En el ejemplo siguiente se elimina un blob:

def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob()

Si el blob tiene instantáneas asociadas, debe eliminar todas sus instantáneas para eliminar el blob. En el ejemplo siguiente se elimina un blob y sus instantáneas:

def delete_blob_snapshots(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob(delete_snapshots="include")

Para eliminar solo las instantáneas y no el propio blob, puede pasar el parámetro delete_snapshots="only".

Restauración de un blob eliminado

La eliminación temporal de blobs protege a cada uno de los blobs y sus versiones, instantáneas y metadatos de errores accidentales al borrar o sobrescribir los datos, ya que conserva en el sistema los datos eliminados durante el período de tiempo que se especifique. Durante este período de retención, los blobs pueden restaurarse a su estado original. Una vez vencido el período de retención especificado, el blob se elimina permanentemente. Para más información sobre la eliminación temporal, consulte este artículo sobre la eliminación temporal de blobs.

Puede usar las bibliotecas cliente de Azure Storage para restaurar un blob o una instantánea eliminados temporalmente.

La forma en que restaura un blob eliminado temporalmente depende de si la cuenta de almacenamiento tiene habilitado el control de versiones de blobs. Para más información sobre el control de versiones de blobs, consulte Control de versiones de blobs. Consulte una de las secciones siguientes en función de su escenario:

Restauración de objetos eliminados temporalmente cuando el control de versiones está deshabilitado

Para restaurar los blobs eliminados cuando el control de versiones está desactivado, llame al método siguiente:

Este método restaura el contenido y los metadatos de un blob eliminado temporalmente y las instantáneas asociadas eliminadas temporalmente. La llamada a este método para un blob que no se haya eliminado no tiene ningún efecto.

def restore_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.undelete_blob()

Restauración de objetos eliminados temporalmente cuando el control de versiones está habilitado

Si una cuenta de almacenamiento está configurada para habilitar el control de versiones de blob, la eliminación de un blob hace que la versión actual del blob se convierta en la versión anterior. Para restaurar un blob eliminado temporalmente cuando el control de versiones está habilitado, copie una versión anterior en el blob base. Puede usar el método siguiente:

El siguiente ejemplo de código obtiene la última versión de un blob eliminado y la restaura copiándola en el blob base:

def restore_blob_version(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)

    # Get a reference to the soft-deleted base blob and list all the blob versions
    blob_client = container_client.get_blob_client(blob=blob_name)
    blob_list = container_client.list_blobs(name_starts_with=blob_name, include=['deleted','versions'])
    blob_versions = []
    for blob in blob_list:
        blob_versions.append(blob.version_id)
    
    # Get the latest version of the soft-deleted blob
    blob_versions.sort(reverse=True)
    latest_version = blob_versions[0]

    # Build the blob URI and add the version ID as a query string
    versioned_blob_url = f"{blob_client.url}?versionId={latest_version}"

    # Restore the latest version by copying it to the base blob
    blob_client.start_copy_from_url(versioned_blob_url)

Eliminación de un blob de forma asincrónica

La biblioteca cliente de Azure Blob Storage para Python admite la eliminación de un blob de forma asincrónica. Para obtener más información sobre los requisitos de configuración del proyecto, consulte Programación asincrónica.

Siga estos pasos para eliminar un blob mediante API asincrónicas:

  1. Agregue las siguientes instrucciones import:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient
    
  2. Agregue código para ejecutar el programa mediante asyncio.run. Esta función ejecuta la corrutina pasada, main() en nuestro ejemplo, y administra el bucle de eventos asyncio. Las corrutinas se declaran con la sintaxis async/await. En este ejemplo, la corrutina main() crea primero el nivel superior BlobServiceClient mediante async with y, a continuación, llama al método que elimina el blob. Tenga en cuenta que solo el cliente de nivel superior debe usar async with, ya que otros clientes creados a partir de él comparten el mismo grupo de conexiones.

    async def main():
        sample = BlobSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            await sample.delete_blob(blob_service_client, "sample-container", "sample-blob.txt")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Agregue código para eliminar el blob. El código es el mismo que el ejemplo sincrónico, salvo que el método se declara con la palabra clave async y la palabra clave await se usa al llamar al método delete_blob.

    async def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        await blob_client.delete_blob()
    

Con esta configuración básica, puede implementar otros ejemplos de este artículo como corrutinas mediante la sintaxis async/await.

Recursos

Para más información sobre cómo eliminar blobs y restaurar blobs eliminados temporalmente mediante la biblioteca cliente de Azure Blob Storage para Python, vea los siguientes recursos.

Ejemplos de código

Operaciones de API REST

El SDK de Azure para Python contiene bibliotecas que se crean a partir de la API de REST de Azure, lo que le permite interactuar con las operaciones de API de REST a través de paradigmas conocidos de Python. Los métodos de la biblioteca cliente para eliminar blobs y restaurar blobs eliminados usan las siguientes operaciones de la API de REST:

Recursos de la biblioteca cliente

Consulta también

  • Este artículo forma parte de la guía para desarrolladores de Blob Storage para Python. Para más información, consulte la lista completa de artículos de la guía para desarrolladores en Compilación de la aplicación de Python.