Creación y administración de concesiones de contenedores con Python
En este artículo se muestra cómo crear y administrar concesiones de contenedores mediante la biblioteca cliente para Python de Azure Storage. Puedes usar la biblioteca cliente para adquirir, renovar, liberar e interrumpir concesiones de contenedor.
Para obtener información sobre cómo hacer la concesión de un contenedor de blobs mediante API asincrónicas, consulte Concesión de contenedores de forma asincrónica.
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- Una cuenta de Azure Storage: cree una cuenta de almacenamiento
- Python 3.8 y versiones posteriores
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, BlobLeaseClient
Authorization
El mecanismo de autorización debe tener los permisos necesarios para trabajar con una concesión de contenedor. 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 Contenedor de concesión (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.
Acerca de las concesiones de contenedor
Una concesión establece y administra un bloqueo en un contenedor para las operaciones de eliminación. La duración del bloqueo puede ser de 15 a 60 segundos, o puede ser infinita. Una concesión sobre un contenedor proporciona acceso exclusivo de eliminación sobre el contenedor. Una concesión de contenedor solo controla la capacidad de eliminar el contenedor mediante la operación Eliminar contenedor de la API de REST. Para eliminar un contenedor con una concesión activa, un cliente debe incluir el identificador de concesión activo con la solicitud de eliminación. Todas las demás operaciones de contenedor se realizarán correctamente en un contenedor sujeto a una concesión sin necesidad de incluir el identificador de concesión. Si ha habilitado la eliminación temporal de contenedores, puede restaurar los contenedores eliminados.
Para obtener más información sobre los estados de concesión y cuándo puedes realizar una acción determinada en una concesión, consulta Estados y acciones de concesión.
Las operaciones de concesión se controlan mediante la clase BlobLeaseClient, que proporciona un cliente que contiene todas las operaciones de concesión para blobs y contenedores. Para más información sobre las concesiones de blob mediante la biblioteca cliente, consulta Creación y administración de concesiones de blob con Python.
Adquisición de una concesión
Al adquirir una concesión de contenedor, obtienes un identificador de concesión que el código puede usar para operar en el contenedor. Si el contenedor ya tiene una concesión activa, solo puedes solicitar una nueva concesión mediante el id. de concesión activo. No obstante, puede especificar una nueva duración de concesión.
Para adquirir una concesión, cree una instancia de la clase BlobLeaseClient y, a continuación, use cualquiera de estos métodos:
También puede adquirir una concesión mediante el método siguiente a partir de la clase ContainerClient:
En el ejemplo siguiente, se adquiere una concesión de 30 segundos en un contenedor:
def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name):
# Instantiate a ContainerClient
container_client = blob_service_client.get_container_client(container=container_name)
# Acquire a 30-second lease on the container
lease_client = container_client.acquire_lease(30)
return lease_client
Renovación de una concesión
Puedes renovar una concesión de contenedor si el id. de concesión especificado en la solicitud coincide con el id. de concesión asociado al contenedor. La concesión se puede renovar incluso si ha expirado, siempre que el contenedor no se haya concedido de nuevo desde la caducidad de la concesión. Cuando se renueva una concesión, se restablece su duración.
Para renovar una concesión, use el método siguiente:
En el ejemplo siguiente, se renueva una concesión para un contenedor:
def renew_container_lease(self, lease_client: BlobLeaseClient):
# Renew a lease on the container
lease_client.renew()
Liberación de una concesión
Puedes liberar una concesión de contenedor si el id. de concesión especificado en la solicitud coincide con el id. de concesión asociado al contenedor. Liberar la concesión permite a otro cliente adquirir la concesión sobre el contenedor inmediatamente después de que finalice la operación de liberación.
Puede liberar una concesión mediante el método siguiente:
En el ejemplo siguiente, se libera la concesión en un contenedor:
def release_container_lease(self, lease_client: BlobLeaseClient):
# Release a lease on the container
lease_client.release()
Interrupción de una concesión
Puedes interrumpir una concesión de contenedor si el contenedor tiene una concesión activa. Cualquier solicitud autorizada puede interrumpir la concesión; no es necesario que la solicitud especifique un identificador de concesión que coincida. Una concesión no se puede renovar después de que se interrumpa e interrumpir una concesión impide que se adquiera una nueva concesión durante un período de tiempo hasta que expire o se libere la concesión original.
Puede interrumpir una concesión mediante el método siguiente:
En el ejemplo siguiente, se interrumpe la concesión de un contenedor:
def break_container_lease(self, lease_client: BlobLeaseClient):
# Break a lease on the container
lease_client.break_lease()
Concesión de contenedores de forma asincrónica
La biblioteca cliente de Azure Blob Storage para Python admite la concesión de contenedores de forma asíncrona. Para obtener más información sobre los requisitos de configuración del proyecto, consulte Programación asincrónica.
Siga estos pasos para hacer la concesión de un contenedor mediante API asincrónicas:
Agregue las siguientes instrucciones import:
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
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 eventosasyncio
. Las corrutinas se declaran con la sintaxis async/await. En este ejemplo, la corrutinamain()
crea primero el nivel superiorBlobServiceClient
medianteasync with
, y a continuación, llama al método que adquiere la concesión del contenedor. Tenga en cuenta que solo el cliente de nivel superior debe usarasync with
, ya que otros clientes creados a partir de él comparten el mismo grupo de conexiones.async def main(): sample = ContainerSamples() # 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: lease_client = await sample.acquire_container_lease(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())
Agregue código para adquirir la concesión de un contenedor. 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 claveawait
se usa al llamar al métodoacquire
.async def acquire_container_lease(self, blob_service_client: BlobServiceClient, container_name): # Instantiate a ContainerClient container_client = blob_service_client.get_container_client(container=container_name) # Acquire a 30-second lease on the container lease_client = BlobLeaseClient(container_client) await lease_client.acquire(lease_duration=30) return lease_client
Con esta configuración básica, puede implementar otros ejemplos de este artículo como corrutinas mediante la sintaxis async/await.
Estados y acciones de concesión
En el diagrama siguiente se muestran los cinco estados de una concesión y los comandos o los eventos que provocan cambios en el estado de la misma.
En la tabla siguiente se enumeran los cinco estados de concesión, se proporciona una breve descripción de cada uno y se enumeran las acciones de concesión permitidas en un estado determinado. Estas acciones de concesión provocan transiciones de estado, como se muestra en el diagrama.
Estado de concesión | Descripción | Acciones de concesión permitidas |
---|---|---|
Disponible | La concesión está desbloqueada y se puede adquirir. | acquire |
Leased | La concesión está bloqueada. | acquire (solo con el mismo identificador de concesión), renew , change , release y break . |
Expired | La duración de la concesión ha expirado. | acquire , renew , release y break . |
Problemático | La concesión se ha interrumpido, pero seguirá bloqueada hasta que haya expirado el período de interrupción. | release y break |
Interrumpido | La concesión se ha interrumpido y el período de interrupción ha expirado. | acquire , release y break |
Cuando expira una concesión, Blob service mantiene el identificador de concesión hasta que el contenedor se modifica o se concede de nuevo. Un cliente puede intentar renovar o liberar la concesión mediante el identificador de concesión expirado. Si se produce un error en la solicitud, el cliente sabe que el contenedor se ha concedido de nuevo, o que se ha eliminado desde que la concesión estuvo activa por última vez.
Si una concesión expira en lugar de liberarse explícitamente, es posible que el cliente tenga que esperar hasta un minuto para poder adquirir una nueva concesión sobre el contenedor. Sin embargo, el cliente puede renovar inmediatamente la concesión con el identificador de concesión expirada.
Recursos
Para obtener más información sobre cómo eliminar un contenedor con la biblioteca cliente de Azure Blob Storage para Python, consulte los recursos siguientes.
Ejemplos de código
- Ver ejemplo de código sincrónicos o asincrónicos de este artículo (GitHub)
Operaciones de API REST
El SDK de Azure para Python contiene bibliotecas que se crean a partir de la API REST de Azure, lo que le permite interactuar con las operaciones de API REST a través de paradigmas conocidos de Python. Los métodos de la biblioteca cliente para conceder un contenedor usan esta operación de API REST:
Recursos de la biblioteca cliente
- Documentación de referencia de la biblioteca cliente
- Código fuente de la biblioteca del cliente
- Paquete (PyPi)
Consulte también
Contenido relacionado
- 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.