Condividi tramite


Creare e gestire lease di contenitori con Python

Questo articolo illustra come creare e gestire i lease di contenitori utilizzando la libreria client di archiviazione di Azure per Python. È possibile utilizzare la libreria client per acquisire, rinnovare, rilasciare e interrompere i lease dei contenitori.

Per informazioni sul leasing di un contenitore BLOB utilizzando API asincrone, vedere Leasing di contenitori in modo asincrono.

Prerequisiti

  • Questo articolo presuppone che sia già stato configurato un progetto per lavorare con la libreria client di Archiviazione BLOB di Azure per Python. Per informazioni sulla configurazione del progetto, incluse l'installazione del pacchetto, l'aggiunta di istruzioni import e la creazione di un oggetto client autorizzato, vedere Introduzione ad Archiviazione BLOB di Azure e Python.
  • Il meccanismo di autorizzazione deve disporre delle autorizzazioni per lavorare con un lease di contenitore. Per altre informazioni, vedere il materiale sussidiario relativo all'autorizzazione della seguente operazione API REST:

Informazioni sui lease di contenitori

Un lease stabilisce e gestisce un blocco su un contenitore per le operazioni di eliminazione. La durata del blocco può variare da 15 a 60 secondi o può essere infinita. Un lease su un contenitore fornisce un accesso esclusivo con diritti di eliminazione al contenitore. Il lease del contenitore controlla unicamente la possibilità di eliminare il contenitore tramite l'operazione API REST Delete Container. Per eliminare un contenitore con un lease attivo, un client deve includere l'ID lease attivo con la richiesta di eliminazione. Tutte le altre operazioni hanno esito positivo su un contenitore con lease senza ID del lease. Se è stata abilitata l'eliminazione temporanea dei contenitori, sarà possibile ripristinare i contenitori eliminati.

Per ulteriori informazioni sugli stati dei lease e sapere quando è possibile eseguire una determinata azione su un lease, consultare Stati e azioni dei lease.

Le operazioni di lease sono gestite dalla classe BlobLeaseClient che fornisce un client contenente tutte le operazioni di lease per BLOB e contenitori. Per altre informazioni sui lease di BLOB utilizzando la libreria client, vedere Creare e gestire lease di BLOB con Python.

Acquisire un lease

Quando si acquisisce un lease di contenitore, si ottiene un ID del lease che può essere utilizzato dal codice per operare sul contenitore. Se il contenitore ha già un lease attivo, si può fare una richiesta per un nuovo lease soltanto utilizzando l'ID del lease attivo. Tuttavia, è possibile specificare una nuova durata del lease.

Per acquisire un lease, creare un'istanza di classe BlobLeaseClient, quindi utilizzare il metodo seguente:

È anche possibile acquisire un lease utilizzando il metodo seguente dalla classe ContainerClient:

Nell'esempio seguente viene acquisito un lease di 30 secondi su un contenitore:

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

Rinnovare un lease

È possibile rinnovare un lease di contenitore se l'ID del lease specificato nella richiesta corrisponde all'ID del lease associato al contenitore. Il lease può essere rinnovato anche se scaduto, purché il contenitore non sia stato associato a un nuovo lease dopo la scadenza di quello corrente. Quando si rinnova un lease, la sua durata viene reimpostata.

Per rinnovare un lease, utilizzare il metodo seguente:

Nell'esempio seguente viene rinnovato un lease per un contenitore:

def renew_container_lease(self, lease_client: BlobLeaseClient):
    # Renew a lease on the container
    lease_client.renew()

Rilasciare un lease

È possibile rilasciare un lease di contenitore se l'ID del lease specificato nella richiesta corrisponde all'ID del lease associato al contenitore. Quando si rilascia un lease si consente a un altro client di acquisire un lease per il contenitore subito dopo il completamento del rilascio.

È possibile rilasciare un lease utilizzando il metodo seguente:

Nell'esempio seguente viene rilasciato il lease su un contenitore:

def release_container_lease(self, lease_client: BlobLeaseClient):
    # Release a lease on the container
    lease_client.release()

Interrompere un lease

È possibile interrompere un lease di un contenitore se il contenitore ha un lease attivo. Qualsiasi richiesta autorizzata può interrompere il lease. Non è necessario che nella richiesta sia specificato un ID del lease corrispondente. Un lease non può essere rinnovato dopo che è stato interrotto e l'interruzione di un lease impedisce di acquisirne uno nuovo per un certo periodo, ossia fino alla scadenza o al rilascio del lease originale.

È possibile interrompere un lease utilizzando il metodo seguente:

Nell'esempio seguente viene interrotto il lease su un contenitore:

def break_container_lease(self, lease_client: BlobLeaseClient):
    # Break a lease on the container
    lease_client.break_lease()

Creare lease di contenitori in modo asincrono

La libreria client di archiviazione BLOB di Azure per Python supporta la capacità di creare lease di contenitori in modo asincrono. Per altre informazioni sui requisiti di configurazione del progetto, vedere Programmazione asincrona.

Seguire questa procedura per creare lease per un contenitore utilizzando API asincrone:

  1. Aggiungere le seguenti istruzioni Import:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Aggiungere il codice per eseguire il programma utilizzando asyncio.run. Questa funzione esegue la coroutine passata, main() nell'esempio, e gestisce il ciclo di eventi asyncio. Le coroutine vengono dichiarate con la sintassi async/await. In questo esempio, la coroutine main() crea innanzitutto il BlobServiceClient di primo livello utilizzando async with, quindi richiama il metodo che acquisisce il lease di contenitore. Si noti che soltanto il client di primo livello deve utilizzare async with, poiché gli altri client creati da esso condividono lo stesso pool di connessioni.

    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())
    
  3. Aggiungere il codice per acquisire un lease di contenitore. Il codice è uguale a quello dell'esempio sincrono, a eccezione del fatto che il metodo viene dichiarato con la parola chiave async e che quando si richiama il metodo acquire si utilizza la parola chiave await.

    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 questa configurazione di base, nel presente articolo è possibile implementare altri esempi come coroutine, utilizzando la sintassi async/await.

Stati e azioni dei lease

Il diagramma seguente illustra i cinque stati di un lease e i comandi o gli eventi che causano le modifiche dello stato del lease.

A diagram showing container lease states and state change triggers.

Nella tabella seguente sono elencati i cinque stati di lease, inoltre viene fornita una breve descrizione di ognuno di essi ed sono elencate le azioni di lease consentite in un determinato stato. Queste azioni di lease causano transizioni di stato, come indicato nel diagramma.

Stato lease Descrizione Azioni di lease consentite
Disponibile Il lease è sbloccato e può essere acquisito. acquire
Leased Il lease è bloccato. acquire (soltanto lo stesso ID del lease), renew, change, release e break
Scaduta La durata del lease è scaduta. acquire, renew, release e break
Breaking Il lease è stato interrotto, ma resterà bloccato fino alla scadenza del periodo di interruzione. release e break
Broken Il lease è stato interrotto e il periodo di interruzione è scaduto. acquire, release e break

Quando un lease scade, il relativo ID viene mantenuto dal servizio BLOB finché il contenitore non viene modificato o gli viene associato un nuovo lease. Un client può provare a rinnovare o rilasciare il lease utilizzando l'ID del lease scaduto. Se la richiesta ha esito negativo, il client sa che il contenitore è stato associato a un nuovo lease o è stato eliminato dall'ultima volta che il lease era attivo.

Se un lease scade anziché essere rilasciato in modo esplicito, è possibile che il client debba attendere fino a un minuto prima di poter acquisire un nuovo lease per il contenitore. Tuttavia, il client può rinnovare immediatamente il lease con l'ID del lease scaduto.

Risorse

Per altre informazioni sulla creazione di un contenitore utilizzando la libreria client di archiviazione BLOB di Azure per Python, vedere le risorse seguenti.

Operazioni dell'API REST

Azure SDK per Python contiene librerie basate su API REST di Azure che consentono di interagire con le operazioni API REST tramite paradigmi Python noti. I metodi della libreria client per il lease dei contenitori utilizzano l'operazione API REST seguente:

Esempi di codice

Risorse libreria client

Vedi anche