Delen via


Een blob kopiëren met asynchrone planning met behulp van Python

In dit artikel wordt beschreven hoe u een blob kopieert met asynchrone planning met behulp van de Azure Storage-clientbibliotheek voor Python. U kunt een blob kopiëren vanuit een bron binnen hetzelfde opslagaccount, van een bron in een ander opslagaccount of van een toegankelijk object dat via een HTTP GET-aanvraag op een bepaalde URL wordt opgehaald. U kunt ook een in behandeling zijnde kopieerbewerking afbreken.

De clientbibliotheekmethoden die in dit artikel worden behandeld, maken gebruik van de bewerking Blob REST API kopiëren en kunnen worden gebruikt wanneer u een kopie wilt uitvoeren met asynchrone planning. Voor de meeste kopieerscenario's waarin u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben, raadpleegt u Een blob kopiëren van een bronobject-URL met Python.

Vereisten

Uw omgeving instellen

Als u geen bestaand project hebt, ziet u in deze sectie hoe u een project instelt voor gebruik met de Azure Blob Storage-clientbibliotheek voor Python. Zie Aan de slag met Azure Blob Storage en Python voor meer informatie.

Als u wilt werken met de codevoorbeelden in dit artikel, volgt u deze stappen om uw project in te stellen.

Pakketten installeren

Installeer de volgende pakketten met behulp van pip install:

pip install azure-storage-blob azure-identity

Importinstructies toevoegen

Voeg de volgende import instructies toe:

import datetime
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    BlobClient,
    BlobLeaseClient,
    BlobSasPermissions,
    generate_blob_sas
)

Autorisatie

Het autorisatiemechanisme moet over de benodigde machtigingen beschikken om een kopieerbewerking uit te voeren of om een in behandeling zijnde kopie af te breken. Voor autorisatie met Microsoft Entra ID (aanbevolen), varieert de ingebouwde rol van Azure RBAC met minimale bevoegdheden op basis van verschillende factoren. Zie de autorisatierichtlijnen voor Copy Blob (REST API) of Abort Copy Blob (REST API) voor meer informatie.

Een clientobject maken

Als u een app wilt verbinden met Blob Storage, maakt u een exemplaar van BlobServiceClient. In het volgende voorbeeld ziet u hoe u een clientobject maakt met behulp van DefaultAzureCredential autorisatie:

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

U kunt ook clientobjecten maken voor specifieke containers of blobs, rechtstreeks of vanuit het BlobServiceClient object. Zie Clientobjecten maken en beheren die interactie hebben met gegevensbronnen voor meer informatie over het maken en beheren van clientobjecten.

Over het kopiëren van blobs met asynchrone planning

De Copy Blob bewerking kan asynchroon worden voltooid en wordt uitgevoerd op basis van best effort, wat betekent dat de bewerking niet gegarandeerd onmiddellijk of binnen een opgegeven tijdsbestek wordt gestart of voltooid. De kopieerbewerking wordt op de achtergrond gepland en uitgevoerd als de server beschikbare resources heeft. De bewerking kan synchroon worden voltooid als de kopie plaatsvindt binnen hetzelfde opslagaccount.

Een Copy Blob bewerking kan een van de volgende acties uitvoeren:

  • Kopieer een bron-blob naar een doel-blob met een andere naam. De doel-blob kan een bestaande blob zijn van hetzelfde blobtype (blok, toevoeg of pagina), of kan een nieuwe blob zijn die is gemaakt door de kopieerbewerking.
  • Kopieer een bron-blob naar een doel-blob met dezelfde naam, waardoor de doel-blob wordt vervangen. Met dit type kopieerbewerking worden eventuele niet-doorgevoerde blokken verwijderd en worden de metagegevens van de doel-blob overschreven.
  • Kopieer een bronbestand in de Azure File-service naar een doel-blob. De doel-blob kan een bestaande blok-blob zijn of kan een nieuwe blok-blob zijn die is gemaakt door de kopieerbewerking. Kopiëren van bestanden naar pagina-blobs of toevoeg-blobs wordt niet ondersteund.
  • Kopieer een momentopname over de basis-blob. Door een momentopname te promoveren naar de positie van de basis-blob, kunt u een eerdere versie van een blob herstellen.
  • Kopieer een momentopname naar een doel-blob met een andere naam. De resulterende doel-blob is een beschrijfbare blob en geen momentopname.

De bron-blob voor een kopieerbewerking kan een van de volgende typen zijn: blok-blob, toevoeg-blob, pagina-blob, blobmomentopname of blobversie. Met de kopieerbewerking wordt altijd de hele bron-blob of het hele bestand gekopieerd. Het kopiëren van een bereik van bytes of een set blokken wordt niet ondersteund.

Als de doel-blob al bestaat, moet deze van hetzelfde blobtype zijn als de bron-blob en wordt de bestaande doel-blob overschreven. De doel-blob kan niet worden gewijzigd terwijl er een kopieerbewerking wordt uitgevoerd en een doel-blob kan slechts één uitstekende kopieerbewerking hebben.

Zie Blob-opmerkingen kopiëren voor meer informatie over de Copy Blob bewerking, waaronder informatie over eigenschappen, indextags, metagegevens en facturering.

Een blob kopiëren met asynchrone planning

In deze sectie vindt u een overzicht van methoden die door de Azure Storage-clientbibliotheek voor Python worden geleverd om een kopieerbewerking uit te voeren met asynchrone planning.

Met de volgende methoden wordt de rest API-bewerking voor kopiëren blob verpakt en wordt een asynchrone kopie van gegevens uit de bron-blob gestart:

De start_copy_from_url retourneert een woordenlijst met copy_status en copy_id. De eigenschap copy_status is voltooid als de kopie synchroon is voltooid of in behandeling is als de kopie asynchroon is gestart.

Een blob kopiëren vanuit een bron in Azure

Als u een blob in hetzelfde opslagaccount kopieert, kan de bewerking synchroon worden voltooid. Toegang tot de bron-blob kan worden geautoriseerd via Microsoft Entra ID, een Shared Access Signature (SAS) of een accountsleutel. Zie Een blob kopiëren vanuit een bronobject-URL met Python voor een afwisselende synchrone kopieerbewerking.

Als de kopieerbron een blob in een ander opslagaccount is, kan de bewerking asynchroon worden voltooid. De bron-blob moet openbaar of geautoriseerd zijn via een SAS-token. Het SAS-token moet de machtiging Lezen ('r') bevatten. Zie Toegang delegeren met handtekeningen voor gedeelde toegang voor meer informatie over SAS-tokens.

In het volgende voorbeeld ziet u een scenario voor het kopiëren van een bronblob uit een ander opslagaccount met asynchrone planning. In dit voorbeeld maken we een bron-blob-URL met een toegevoegd SAS-token voor gebruikersdelegering. In het voorbeeld ziet u hoe u het SAS-token genereert met behulp van de clientbibliotheek, maar u kunt ook uw eigen token opgeven. In het voorbeeld ziet u ook hoe u de bron-blob tijdens de kopieerbewerking kunt leasen om wijzigingen in de blob van een andere client te voorkomen. Met Copy Blob de bewerking wordt de ETag waarde van de bron-blob opgeslagen wanneer de kopieerbewerking wordt gestart. Als de ETag waarde wordt gewijzigd voordat de kopieerbewerking is voltooid, mislukt de bewerking.

def copy_from_source_in_azure_async(self, source_blob: BlobClient, destination_blob: BlobClient, blob_service_client: BlobServiceClient):
    # Lease the source blob during copy to prevent other clients from modifying it
    lease = BlobLeaseClient(client=source_blob)

    sas_token = self.generate_user_delegation_sas(blob_service_client=blob_service_client, source_blob=source_blob)
    source_blob_sas_url = source_blob.url + "?" + sas_token

    # Create an infinite lease by passing -1 as the lease duration
    lease.acquire(lease_duration=-1)

    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_blob_sas_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

    # Release the lease on the source blob
    lease.break_lease()

def generate_user_delegation_sas(self, blob_service_client: BlobServiceClient, source_blob: BlobClient):
    # Get a user delegation key
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(hours=1)
    key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    # Create a SAS token that's valid for one hour, as an example
    sas_token = generate_blob_sas(
        account_name=blob_service_client.account_name,
        container_name=source_blob.container_name,
        blob_name=source_blob.blob_name,
        account_key=None,
        user_delegation_key=key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=1),
        start=datetime.datetime.now(datetime.timezone.utc)
    )

    return sas_token

Notitie

SAS-tokens voor gebruikersdelegatie bieden meer beveiliging, omdat ze zijn ondertekend met Microsoft Entra-referenties in plaats van een accountsleutel. Voor het maken van een SAS-token voor gebruikersdelegering heeft de Microsoft Entra-beveiligingsprincipaal de juiste machtigingen nodig. Zie Sleutel voor gebruikersdelegering ophalen voor autorisatievereisten.

Een blob kopiëren van een bron buiten Azure

U kunt een kopieerbewerking uitvoeren op elk bronobject dat kan worden opgehaald via een HTTP GET-aanvraag op een bepaalde URL, inclusief toegankelijke objecten buiten Azure. In het volgende voorbeeld ziet u een scenario voor het kopiëren van een blob vanuit een toegankelijke bronobject-URL.

def copy_from_external_source_async(self, source_url: str, destination_blob: BlobClient):
    # Start the copy operation - specify False for the requires_sync parameter
    copy_operation = dict()
    copy_operation = destination_blob.start_copy_from_url(source_url=source_url, requires_sync=False)
    
    # If start_copy_from_url returns copy_status of 'pending', the operation has been started asynchronously
    # You can optionally add logic here to wait for the copy operation to complete

De status van een kopieerbewerking controleren

Als u de status van een asynchrone Copy Blob bewerking wilt controleren, kunt u de methode get_blob_properties peilen en de kopieerstatus controleren.

In het volgende codevoorbeeld ziet u hoe u de status van een kopieerbewerking in behandeling controleert:

def check_copy_status(self, destination_blob: BlobClient):
    # Get the copy status from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status

    return copy_status

Een kopieerbewerking afbreken

Het afbreken van een in behandeling zijnde Copy Blob bewerking resulteert in een doel-blob met een lengte van nul. De metagegevens voor de doel-blob bevatten echter de nieuwe waarden die uit de bron-blob zijn gekopieerd of expliciet zijn ingesteld tijdens de kopieerbewerking. Als u de oorspronkelijke metagegevens van vóór de kopie wilt bewaren, maakt u een momentopname van de doel-blob voordat u een van de kopieermethoden aanroept.

Als u een kopieerbewerking in behandeling wilt afbreken, roept u de volgende bewerking aan:

Met deze methode wordt de bewerking Abort Copy Blob REST API verpakt, waardoor een bewerking in behandeling Copy Blob wordt geannuleerd. In het volgende codevoorbeeld ziet u hoe u een bewerking in behandeling Copy Blob kunt afbreken:

def abort_copy(self, destination_blob: BlobClient):
    # Get the copy operation details from the destination blob properties
    copy_status = destination_blob.get_blob_properties().copy.status
    copy_id = destination_blob.get_blob_properties().copy.id

    # Check the copy status and abort if pending
    if copy_status == 'pending':
        destination_blob.abort_copy(copy_id)
        print(f"Copy operation {copy_id} has been aborted")

Resources

Zie de volgende resources voor meer informatie over het kopiëren van blobs met asynchrone planning met behulp van de Azure Blob Storage-clientbibliotheek voor Python.

Codevoorbeelden

REST API-bewerkingen

De Azure SDK voor Python bevat bibliotheken die zijn gebaseerd op de Azure REST API, zodat u kunt communiceren met REST API-bewerkingen via bekende Python-paradigma's. De clientbibliotheekmethoden die in dit artikel worden behandeld, gebruiken de volgende REST API-bewerkingen:

  • Blob kopiëren (REST API)
  • Blob kopiëren afbreken (REST API)

Clientbibliotheekbronnen

  • Dit artikel maakt deel uit van de ontwikkelaarshandleiding voor Blob Storage voor Python. Zie de volledige lijst met artikelen over ontwikkelaarshandleidingen in Uw Python-app bouwen voor meer informatie.