Mastering Snapshots and Leases
Azure Blob Storage offers powerful features for managing your data, including snapshots and leases. Snapshots provide read-only, point-in-time copies of a blob, while leases offer a concurrency control mechanism for managing exclusive write access to a blob.
A blob snapshot is a read-only version of a blob that is taken at a specific point in time. When you create a snapshot, it's stored as a separate entity from the original blob. The snapshot retains the data and metadata of the blob at the time it was created. Snapshots are useful for:
Snapshots are billed separately from the original blob and are stored at the same redundancy level. You can list and retrieve snapshots, but you cannot modify them.
A blob lease grants exclusive write and delete access to a blob for a specified period. A lease is acquired by a client application, and other applications cannot modify or delete the blob until the lease expires or is released. Leases are essential for:
Leases can be acquired with fixed durations (20-60 seconds) or infinite durations. You can also renew a lease if you still need exclusive access.
You can create a snapshot of a blob using the Azure portal, Azure CLI, PowerShell, or the Azure Storage SDKs.
To create a snapshot of a blob named myblob.txt
in a container named mycontainer
:
az storage blob snapshot --container-name mycontainer --name myblob.txt --output table
This command will return information about the snapshot, including its URI.
You can list all snapshots for a specific blob:
az storage blob list --container-name mycontainer --prefix myblob.txt --snapshot --output table
To restore a blob to a previous state from a snapshot, you typically copy the snapshot back to the original blob name or a new blob name.
az storage blob copy --destination-blob myblob.txt --destination-container mycontainer --source-uri "https://mystorageaccount.blob.core.windows.net/mycontainer/myblob.txt?snapshot=2023-10-27T10:00:00Z"
Replace the snapshot URI with the actual URI of your snapshot.
Leases are managed through the Lease Blob
operation. You specify the lease action, duration, and optionally a lease ID.
Acquiring an infinite lease on a blob:
az storage blob lease acquire --container-name mycontainer --blob-name myblob.txt --lease-duration infinite --lease-id "YOUR-UNIQUE-LEASE-ID"
YOUR-UNIQUE-LEASE-ID
should be a GUID or other unique identifier. The response will include the lease ID if successful.
If the lease is about to expire and you still require exclusive access:
az storage blob lease renew --container-name mycontainer --blob-name myblob.txt --lease-id "YOUR-UNIQUE-LEASE-ID"
When you no longer need exclusive access:
az storage blob lease release --container-name mycontainer --blob-name myblob.txt --lease-id "YOUR-UNIQUE-LEASE-ID"
If a lease holder becomes unavailable, you can break the lease:
az storage blob lease break --container-name mycontainer --blob-name myblob.txt
Breaking a lease makes it available for other clients to acquire after a short grace period.
Snapshots and leases are billed separately. Ensure you understand the cost implications of using these features.
When working with leases, consider using an infinite lease duration with a lease ID and handling lease renewal in your application's logic to ensure consistent exclusive access.
Here's a conceptual example of how you might use a lease in Python to ensure exclusive write access.
from azure.storage.blob import BlobServiceClient, LeaseClient
import uuid
# Replace with your actual connection string and container/blob names
connection_string = "YOUR_AZURE_STORAGE_CONNECTION_STRING"
container_name = "mycontainer"
blob_name = "mydata.txt"
lease_duration_seconds = 60 # Or -1 for infinite
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
blob_client = blob_service_client.get_blob_client(container_name, blob_name)
lease_client = LeaseClient(blob_client)
lease_id = str(uuid.uuid4())
try:
# Acquire the lease
lease_client.acquire(lease_duration=lease_duration_seconds, lease_id=lease_id)
print(f"Lease acquired successfully with ID: {lease_id}")
# Now you have exclusive write access
data = "This data can only be written while the lease is active."
blob_client.upload_blob(data, overwrite=True)
print("Blob data updated.")
# You can renew the lease if needed
# lease_client.renew(lease_id=lease_id)
# print("Lease renewed.")
except Exception as e:
print(f"An error occurred: {e}")
finally:
# Release the lease when done
if lease_client.lease_id:
try:
lease_client.release(lease_id=lease_id)
print(f"Lease {lease_id} released.")
except Exception as e:
print(f"Failed to release lease {lease_id}: {e}")