Partager via


Créer et gérer des baux de conteneurs en Python

Cet article montre comment créer et gérer des baux de conteneurs à l’aide de la bibliothèque de client Stockage Azure pour Python. Vous pouvez utiliser la bibliothèque de client pour acquérir, renouveler, libérer et arrêter des baux de conteneur.

Pour en savoir plus sur la location d’un conteneur d’objets blob en utilisant des API asynchrones, consultez Louer des conteneurs de façon asynchrone.

Prérequis

  • Cet article suppose que vous disposez déjà d'un projet configuré pour fonctionner avec la bibliothèque client Azure Blob Storage pour Python. Pour en savoir plus sur la configuration de votre projet, y compris l’installation de packages, l’ajout d’instructions import et la création d’un objet client autorisé, consultez Prise en main du Stockage Blob Azure et de Python.
  • Le mécanisme d’autorisation doit disposer des autorisations nécessaires pour utiliser un bail de conteneur. Pour en savoir plus, consultez les conseils d’autorisation pour l’opération d’API REST suivante :

À propos des baux de conteneur

Un bail établit et gère un verrou sur un conteneur pour les opérations de suppression. La durée du verrou peut être de 15 à 60 secondes, ou peut être infinie. Un bail sur un conteneur fournit un accès exclusif en suppression au conteneur. Un bail de conteneur contrôle uniquement la suppression du conteneur à l’aide de l’opération d’API REST Delete Container. Pour supprimer un conteneur avec un bail actif, le client doit inclure l'identificateur du bail actif dans la demande de suppression. Toutes les autres opérations de conteneur réussissent sur un conteneur loué sans ID de bail. Si vous avez activé la suppression réversible de conteneur, vous pouvez restaurer les conteneurs supprimés.

Pour en savoir plus sur les états de bail et sur le moment où vous pouvez effectuer une action donnée sur un bail, consultez États et actions de bail.

Les opérations de bail sont gérées par la classe BlobLeaseClient qui fournit un client contenant toutes les opérations de bail pour des objets blob et des conteneurs. Pour en savoir plus sur l’utilisation de baux de blob à l’aide de la bibliothèque de client, consultez Créer et gérer des baux de blob en Python.

Acquérir un bail

Quand vous obtenez un bail de conteneur, vous obtenez un ID de bail que votre code peut utiliser pour agir sur le conteneur. Si le conteneur a déjà un bail actif, vous pouvez uniquement demander un nouveau bail à l’aide de l’ID de bail actif. Toutefois, vous pouvez spécifier une nouvelle durée de bail.

Pour acquérir un bail, créez une instance de la classe BlobLeaseClient, puis utilisez la méthode suivante :

Vous pouvez également acquérir un bail en utilisant la méthode suivante à partir de la classe ContainerClient :

L’exemple suivant acquiert un bail de 30 secondes pour un conteneur :

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

Renouveler un bail

Vous pouvez renouveler un bail de conteneur si l’ID de bail spécifié dans la requête correspond à l’ID de bail associé au conteneur. Le bail peut être renouvelé même s’il a expiré, tant que le conteneur n’a pas été reloué depuis l’expiration de ce bail. Lorsque vous renouvelez un bail, la durée de bail se réinitialise.

Pour renouveler un bail, utilisez la méthode suivante :

L’exemple suivant renouvelle un bail de conteneur :

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

Libérer un bail

Vous pouvez libérer un bail de conteneur si l’ID de bail spécifié dans la requête correspond à l’ID de bail associé au conteneur. La libération du bail permet à un autre client d’acquérir un bail pour le conteneur immédiatement après la libération.

Vous pouvez libérer un bail avec la méthode suivante :

L’exemple suivant libère le bail d’un conteneur :

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

Arrêter un bail

Vous pouvez résilier un bail de conteneur si le conteneur a un bail actif. Toute requête autorisée peut arrêter le bail ; la demande ne spécifie pas obligatoirement un ID de bail correspondant. Un bail ne peut pas être renouvelé après son arrêt et la rupture d’un bail empêche l’acquisition d’un nouveau bail pendant un certain temps jusqu’à l’expiration ou la libération du bail d’origine.

Vous pouvez résilier un bail avec la méthode suivante :

L’exemple suivant résilie le bail d’un conteneur :

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

Louer des conteneurs de façon asynchrone

La bibliothèque de client Stockage Blob Azure pour Python prend en charge la location de conteneurs de façon asynchrone. Pour en savoir plus sur les exigences de configuration de projet, consultez programmation asynchrone.

Procédez comme suit pour louer un conteneur en utilisant des API asynchrones :

  1. Ajoutez les instructions d’importation suivantes :

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
    
  2. Ajoutez du code pour exécuter le programme à l’aide de asyncio.run. Cette fonction exécute la coroutine passée, main() dans notre exemple et gère la boucle d’événement asyncio. Les coroutines sont déclarées avec la syntaxe asynchrone/await. Dans cet exemple, la coroutine main() crée d’abord le BlobServiceClient de plus haut niveau en utilisant async with, puis appelle la méthode qui acquiert le bail du conteneur. Notez que seul le client de niveau supérieur doit utiliser async with, car d’autres clients créés à partir de celui-ci partagent le même pool de connexions.

    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. Ajoutez du code pour acquérir un bail de conteneur. Le code est identique à l’exemple synchrone, sauf que la méthode est déclarée avec le mot clé async et que le mot clé await est utilisé lors de l’appel de la méthode acquire.

    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
    

Avec cette configuration de base en place, vous pouvez implémenter d’autres exemples dans cet article en tant que coroutines à l’aide de la syntaxe asynchrone/await.

États et actions de bail

Le diagramme suivant montre les cinq états d'un bail, et les commandes ou les événements qui peuvent entraîner des modifications d'état du bail.

A diagram showing container lease states and state change triggers.

Le tableau suivant liste les cinq états de bail, en fournit une brève description et liste les actions de bail autorisées dans un état donné. Ces actions de bail entraînent des transitions d’état, comme illustré dans le diagramme.

État du bail Description Actions de bail autorisées
Disponible Le bail est déverrouillé et peut être acquis. acquire
Loué Le bail est verrouillé. acquire (ID de bail identique uniquement), renew, change, release et break
Expired La durée du bail a expiré. acquire, renew, release et break
Rupture Le bail a été résilié, mais continue d’être verrouillé jusqu’à l’expiration de la période de résiliation. release et break
Rompu Le bail a été résilié et la période de résiliation a expiré. acquire, release et break

Une fois un bail expiré, l’ID de bail est conservé par le service BLOB jusqu’à ce que le conteneur soit modifié ou loué de nouveau. Un client peut tenter de renouveler ou de libérer le bail en utilisant l’ID de bail expiré. Si la demande échoue, le client sait que le conteneur a été reloué ou qu’il a été supprimé depuis la dernière fois que le bail était actif.

Si un bail expire au lieu d'être explicitement libéré, un client doit attendre jusqu'à une minute avant qu'un nouveau bail puisse être acquis pour le conteneur. Toutefois, le client peut renouveler le bail avec l'ID de bail expiré immédiatement.

Ressources

Pour en savoir plus sur l’utilisation d’un bail de conteneur à l’aide de la bibliothèque de client Stockage Blob Azure pour Python, consultez les ressources suivantes.

Opérations de l'API REST

Le kit SDK Azure pour Python contient des bibliothèques qui reposent sur l’API REST Azure, ce qui vous permet d’interagir avec les opérations de l’API REST via des paradigmes Python familiers. Les méthodes de bibliothèque de client pour un bail de conteneur utilisent l’opération d’API REST suivante :

Exemples de code

Ressources de bibliothèque cliente

Voir aussi