Erstellen und Verwalten von Containerleases mit Python

In diesem Artikel wird beschrieben, wie Containerleases mithilfe der Azure Storage-Clientbibliothek für Python erstellt und verwaltet werden. Sie können mithilfe der Clientbibliothek Containerleases abrufen, verlängern, freigeben und unterbrechen.

Informationen zum Leasing eines Blob-Containers mithilfe asynchroner APIs finden Sie unter Container asynchron leasen.

Voraussetzungen

Erstellen Ihrer Umgebung

Wenn Sie kein vorhandenes Projekt haben, wird in diesem Abschnitt gezeigt, wie Sie ein Projekt für die Arbeit mit der Azure Blob Storage-Clientbibliothek für Python einrichten. Weitere Details finden Sie unter Erste Schritte mit Azure Blob Storage und Python.

Um die Codebeispiele in diesem Artikel zu verwenden, führen Sie die folgenden Schritte zum Einrichten Ihres Projekts aus.

Installieren von Paketen

Installieren Sie die folgenden Pakete mittels pip install:

pip install azure-storage-blob azure-identity

Hinzufügen von Importanweisungen

Fügen Sie die folgenden import -Anweisungen ein:

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

Autorisierung

Der Autorisierungsmechanismus muss über die erforderlichen Berechtigungen zum Arbeiten mit einer Containerlease verfügen. Für die Autorisierung mit Microsoft Entra ID (empfohlen) benötigen Sie mindestens die integrierte Azure RBAC-Rolle Mitwirkender an Storage-Blobdaten. Weitere Informationen finden Sie im Autorisierungsleitfaden für Create Container (REST-API).

Erstellen eines Clientobjekts

Um eine App mit Blob Storage zu verbinden, erstellen Sie eine Instanz von BlobServiceClient. Das folgende Beispiel zeigt, wie Sie ein Clientobjekt mithilfe von DefaultAzureCredential für die Autorisierung erstellen:

# 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)

Sie können auch Clientobjekte für bestimmte Container oder Blobs erstellen, entweder direkt oder aus dem BlobServiceClient-Objekt. Weitere Informationen zum Erstellen und Verwalten von Clientobjekten finden Sie unter Erstellen und Verwalten von Clientobjekten, die mit Datenressourcen interagieren.

Informationen zu Containerleases

Eine Lease richtet für einen Container eine Sperre für Löschvorgänge ein und verwaltet diese. Die Sperrdauer kann 15 bis 60 Sekunden betragen oder unendlich sein. Eine Lease für einen Container bietet exklusiven Löschzugriff auf den Container. Eine Containerlease steuert nur die Möglichkeit zum Löschen des Containers mithilfe des REST-API-Vorgangs Container löschen. Um einen Container mit einer aktiven Lease zu löschen, muss ein Client die ID der aktiven Lease bei der Löschanforderung angeben. Alle anderen Containervorgänge werden für einen geleasten Container auch ohne Angabe der Lease-ID erfolgreich ausgeführt. Wenn Sie das vorläufige Löschen von Containern aktiviert haben, können Sie gelöschte Container wiederherstellen.

Weitere Informationen zu Leasezuständen und zu Situationen, in denen Sie eine bestimmte Aktion für eine Lease ausführen können, finden Sie unter Leasezustände und -aktionen.

Leasevorgänge werden von der BlobLeaseClient-Klasse verarbeitet, die einen Client bereitstellt, in dem alle Leasevorgänge für Blobs und Container enthalten sind. Weitere Informationen zu Blobleases mit der Clientbibliothek finden Sie unter Erstellen und Verwalten von Blobleases mit Python.

Abrufen einer Lease

Wenn Sie eine Containerlease abrufen, erhalten Sie eine Lease-ID, die Sie in Ihrem Code für Vorgänge mit dem Container verwenden können. Wenn der Container bereits über eine aktive Lease verfügt, können Sie nur unter Verwendung der aktiven Lease-ID eine neue Lease anfordern. Sie können jedoch eine neue Leasedauer angeben.

Erstellen Sie zum Abrufen einer Lease eine Instanz der BlobLeaseClient-Klasse, und verwenden Sie dann die folgende Methode:

Sie können eine Lease auch mithilfe der folgenden Methode aus der Klasse ContainerClient abrufen:

Im folgenden Beispiel wird eine Lease von 30 Sekunden Dauer für einen Container abgerufen:

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

Erneuern einer Lease

Sie können eine Containerlease verlängern, wenn die in der Anforderung angegebene Lease-ID mit der dem Container zugeordneten Lease-ID übereinstimmt. Beachten Sie, dass eine Lease selbst nach ihrem Ablauf noch verlängert werden kann, sofern der Container danach noch nicht wieder geleast wurde. Beim Verlängern einer Lease wird die Leasedauer zurückgesetzt.

Verwenden Sie zum Verlängern einer Lease die folgende Methode:

Im folgenden Beispiel wird eine Lease für einen Container erneuert:

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

Freigeben einer Lease

Sie können eine Containerlease freigeben, wenn die in der Anforderung angegebene Lease-ID mit der dem Container zugeordneten Lease-ID übereinstimmt. Durch das Freigeben einer Lease kann ein anderer Client die Lease für den Container sofort nach Abschluss der Freigabe abrufen.

Sie können eine Lease mit der folgenden Methode freigeben:

Im folgenden Beispiel wird die Lease für einen Container freigegeben:

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

Aufheben einer Lease

Sie können eine Containerlease unterbrechen, sofern der Container über eine aktive Lease verfügt. Die Lease kann mit jeder autorisierten Anforderung unterbrochen werden. In der Anforderung muss keine übereinstimmende Lease-ID angegeben werden. Nach einer Unterbrechung kann die Lease nicht verlängert werden. Außerdem verhindert das Unterbrechen einer Lease, dass für einen bestimmten Zeitraum eine neue Lease erworben werden kann, bis die ursprüngliche Lease abläuft oder freigegeben wird.

Sie können eine Lease mit der folgenden Methode aufheben:

Im folgenden Beispiel wird die Lease für einen Container aufgehoben:

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

Asynchrones Leasen von Containern

Die Azure Blob Storage-Clientbibliothek für Python unterstützt das asynchrone Leasen von Containern. Weitere Informationen zu den Projekteinrichtungsanforderungen finden Sie unter Asynchrone Programmierung.

Führen Sie die folgenden Schritte aus, um einen Container mithilfe asynchroner APIs zu leasen:

  1. Fügen Sie die folgenden import-Anweisungen hinzu:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Fügen Sie Code hinzu, um das Programm mithilfe von asyncio.run auszuführen. Diese Funktion führt die übergebene Coroutine aus, main() in unserem Beispiel, und verwaltet die Ereignisschleife von asyncio. Coroutinen werden mit der async/await-Syntax deklariert. In diesem Beispiel erstellt die Coroutine main() zunächst den BlobServiceClient auf oberster Ebene mit async with und ruft dann die Methode auf, welche den Container-Lease erhält. Beachten Sie, dass nur der Client auf oberster Ebene async withverwenden muss, da andere von ihm erstellte Clients denselben Verbindungspool aufweisen.

    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. Fügen Sie Code hinzu, um einen Container-Lease zu erhalten. Der Code ist identisch mit dem synchronen Beispiel, mit der Ausnahme, dass die Methode mit dem Schlüsselwort „async“ deklariert wird und das Schlüsselwort „await‘‘ beim Aufrufen der Methode „acquire“ verwendet wird.

    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
    

Mit dieser grundlegenden Einrichtung können Sie weitere Beispiele in diesem Artikel als Coroutinen mit async/await-Syntax implementieren.

Leasezustände und -aktionen

Im folgenden Diagramm werden die fünf Statusangaben einer Lease sowie die Befehle oder Ereignisse gezeigt, die Leasestatusänderungen verursachen.

Diagramm der Containerleasezustände und der Zustandsänderungstrigger

In der folgenden Tabelle sind die fünf Leasezustände mit einer Kurzbeschreibung sowie die Leaseaktionen aufgeführt, die bei einem bestimmten Zustand zulässig sind. Diese Leaseaktionen verursachen Statusübergänge, wie im Diagramm dargestellt.

Leasezustand BESCHREIBUNG Zulässige Leaseaktionen
Verfügbar Die Lease wird entsperrt und kann abgerufen werden. acquire
Geleast Die Lease wird gesperrt. acquire (nur dieselbe Lease-ID), renew, change, release und break
Abgelaufen Die Leasedauer ist abgelaufen. acquire, renew, release und break
Breaking Die Lease wurde unterbrochen, ist aber weiterhin gesperrt, bis der Unterbrechungszeitraum abgelaufen ist. release und break
Beschädigt Die Lease wurde unterbrochen, und der Unterbrechungszeitraum ist abgelaufen. acquire, release und break

Nachdem eine Lease abgelaufen ist, wird die Lease-ID vom Blob-Dienst beibehalten, bis der Container geändert oder erneut geleast wird. Ein Client kann versuchen, die Lease mithilfe der abgelaufenen Lease-ID zu verlängern oder freizugeben. Wenn die Anforderung nicht erfolgreich ist, weiß der Client, dass der Container erneut geleast oder seit der letzten Aktivierung der Lease gelöscht wurde.

Wenn eine Lease abläuft und nicht explizit freigegeben wird, muss der Client u. U. bis zu einer Minute warten, bevor eine neue Lease für den Container abgerufen werden kann. Der Client kann jedoch die Lease mit der abgelaufenen Lease-ID sofort verlängern.

Ressourcen

Weitere Informationen zum Leasen eines Containers mithilfe der Azure Blob Storage-Clientbibliothek für Python finden Sie in den folgenden Ressourcen.

Codebeispiele

REST-API-Vorgänge

Das Azure SDK für Python enthält Bibliotheken, die auf der Azure-REST-API basieren, und ermöglicht Ihnen so die Interaktion mit REST-API-Vorgängen über vertraute Python-Paradigmen. Die Clientbibliotheksmethoden zum Leasen eines Containers verwenden den folgenden REST-API-Vorgang:

Ressourcen zur Clientbibliothek

Weitere Informationen

  • Dieser Artikel ist Teil des Blob Storage-Entwicklerleitfadens für Python. Weitere Informationen finden Sie in der vollständigen Liste der Entwicklerleitfadenartikel unter Erstellen Ihrer Python-App.