Créer et gérer des baux d’objets blob en Python
Cet article montre comment créer et gérer des baux d’objets blob à 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.
Pour en savoir plus sur le bail d’un blob à l’aide d’API asynchrones, consultez Louer des blobs de manière asynchrone.
Prérequis
- Abonnement Azure : créez-en un gratuitement
- Compte de stockage Azure : créez un compte de stockage
- Python 3.8+
Paramétrer votre environnement
Si vous n’avez aucun projet existant, cette section vous montre comment configurer un projet de façon à utiliser la bibliothèque de client Stockage Blob Azure pour Python. Pour plus d’informations, consultez Bien démarrer avec le service Stockage Blob Azure et Python.
Pour utiliser les exemples de code de cet article, effectuez les étapes suivantes pour configurer votre projet.
Installer des packages
Installez les packages suivants en utilisant pip install
:
pip install azure-storage-blob azure-identity
Ajouter des instructions import
Ajoutez les instructions import
suivantes :
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobLeaseClient
Autorisation
Le mécanisme d’autorisation doit disposer des autorisations nécessaires pour travailler avec un bail de blob. Pour l’autorisation avec Microsoft Entra ID (recommandé), vous devez disposer au minimum du rôle RBAC Azure intégré Contributeur aux données Blob du stockage. Pour en savoir plus, consultez l’aide d’autorisation pour l’opération Bail de blob (API REST).
Créer un objet client
Pour connecter une application au Stockage Blob, créez une instance de BlobServiceClient. L’exemple suivant montre comment créer un objet client à l’aide de DefaultAzureCredential
pour l’autorisation :
# 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)
Vous pouvez également créer des objets clients pour des conteneurs ou des objets blob spécifiques, directement ou à partir de l’objet BlobServiceClient
. Pour en savoir plus sur la création et la gestion d’objets clients, consultez Créer et gérer des objets clients qui interagissent avec des ressources de données.
À propos des baux d’objets blob
Un bail crée et gère un verrou sur un blob pour les opérations d’écriture et de suppression. La durée du verrou peut être de 15 à 60 secondes, ou peut être infinie. Un bail sur un objet blob fournit un accès exclusif en écriture et en suppression à l'objet blob. Pour écrire dans un objet blob avec un bail actif, un client doit inclure l'ID de bail actif à la demande d'écriture.
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.
Toutes les opérations de conteneur sont autorisées sur un conteneur qui comprend des blobs avec un bail actif, notamment Delete Container. Par conséquent, un conteneur peut être supprimé même si les blobs qu’il contient ont des baux actifs. Utilisez l’opération Lease Container pour contrôler les droits de suppression d’un conteneur.
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 conteneurs à l’aide de la bibliothèque de client, consultez Créer et gérer des baux de conteneurs en Python.
Acquérir un bail
Quand vous obtenez un objet blob, vous obtenez un ID de bail que votre code peut utiliser pour agir sur le blob. Si l’objet blob 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 pour un objet blob en créant une instance de BlobClient, et en utilisant la méthode suivante :
L’exemple suivant acquiert un bail de 30 secondes pour un blob :
def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name):
# Instantiate a BlobClient
blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt")
# Acquire a 30-second lease on the blob
lease_client = blob_client.acquire_lease(30)
return lease_client
Renouveler un bail
Vous pouvez renouveler un bail d’objet blob si l’ID de bail spécifié dans la requête correspond à l’ID de bail associé à l’objet blob. Le bail peut être renouvelé même s’il a expiré, tant que l’objet blob n’a pas été modifié ou 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 blob :
def renew_blob_lease(self, lease_client: BlobLeaseClient):
# Renew a lease on a blob
lease_client.renew()
Libérer un bail
Vous pouvez louer un bail d’objet blob si l’ID de bail spécifié dans la requête correspond à l’ID de bail associé à l’objet blob. L’arrêt du bail permet à un autre client d’acquérir le bail pour l’objet blob immédiatement après la mise en production.
Vous pouvez libérer un bail avec la méthode suivante :
L’exemple suivant libère le bail d’un blob :
def release_blob_lease(self, lease_client: BlobLeaseClient):
# Release a lease on a blob
lease_client.release()
Arrêter un bail
Vous pouvez arrêter un bail d’objet blob si l’objet blob 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 blob :
def break_blob_lease(self, lease_client: BlobLeaseClient):
# Break a lease on a blob
lease_client.break_lease()
Louer des blobs de manière asynchrone
La bibliothèque de client Stockage Blob Azure pour Python prend en charge les baux asynchrone de blobs. Pour en savoir plus sur les exigences de configuration de projet, consultez programmation asynchrone.
Procédez comme suit pour louer un blob à l’aide d’API asynchrones :
Ajoutez les instructions d’importation suivantes :
import asyncio from azure.identity.aio import DefaultAzureCredential from azure.storage.blob.aio import BlobServiceClient, BlobLeaseClient
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énementasyncio
. Les coroutines sont déclarées avec la syntaxe asynchrone/await. Dans cet exemple, la coroutinemain()
crée d’abord leBlobServiceClient
de premier niveau à l’aide deasync with
, puis appelle la méthode qui acquiert le bail de blob. Notez que seul le client de niveau supérieur doit utiliserasync with
, car d’autres clients créés à partir de celui-ci partagent le même pool de connexions.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: lease_client = await sample.acquire_blob_lease(blob_service_client, "sample-container") if __name__ == '__main__': asyncio.run(main())
Ajoutez du code pour acquérir un bail de blob. 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éthodeacquire_lease
.async def acquire_blob_lease(self, blob_service_client: BlobServiceClient, container_name): # Instantiate a BlobClient blob_client = blob_service_client.get_blob_client(container=container_name, blob="sample-blob.txt") # Acquire a 30-second lease on the blob lease_client = await blob_client.acquire_lease(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.
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 blob 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 cette opération réussit, le client sait que le blob n’a pas changé depuis la dernière fois que l’ID de bail était valide. Si la demande échoue, le client sait que le blob a été modifié ou qu’il a été reloué depuis la dernière fois que le bail était actif. Le client doit ensuite acquérir un nouveau bail sur l'objet blob.
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 l'objet blob. Toutefois, le client peut renouveler le bail avec son ID de bail immédiatement si le blob n’a pas été modifié.
Un bail ne peut pas être accordé pour un instantané de blob, car les instantanés sont en lecture seule. La demande d’un bail sur un instantané entraîne le code d’état 400 (Bad Request)
.
Ressources
Pour en savoir plus sur la gestion des baux d’objets blob à l’aide de la bibliothèque de client Stockage Blob Azure pour Python, consultez les ressources suivantes.
Exemples de code
- Afficher synchrone ou exemples de code asynchrones de cet article (GitHub)
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 la gestion des baux d’objets blob utilisent l’opération d’API REST suivante :
Ressources de bibliothèque cliente
- Documentation de référence sur la bibliothèque cliente
- Code source de la bibliothèque de client
- Package (PyPi)
Voir aussi
Contenu connexe
- Cet article fait partie du guide Stockage Blob pour Python pour les développeurs. Pour découvrir plus d’informations, consultez la liste complète des articles du guide du développeur dans Générer votre application Python.