Dela via


Kopiera en blob med asynkron schemaläggning med Python

Den här artikeln visar hur du kopierar en blob med asynkron schemaläggning med hjälp av Azure Storage-klientbiblioteket för Python. Du kan kopiera en blob från en källa inom samma lagringskonto, från en källa i ett annat lagringskonto eller från alla tillgängliga objekt som hämtas via HTTP GET-begäran på en viss URL. Du kan också avbryta en väntande kopieringsåtgärd.

De klientbiblioteksmetoder som beskrivs i den här artikeln använder åtgärden Kopiera BLOB REST API och kan användas när du vill utföra en kopia med asynkron schemaläggning. De flesta kopieringsscenarier där du vill flytta data till ett lagringskonto och ha en URL för källobjektet finns i Kopiera en blob från en källobjekt-URL med Python.

Förutsättningar

  • Den här artikeln förutsätter att du redan har ett projekt konfigurerat för att fungera med Azure Blob Storage-klientbiblioteket för Python. Mer information om hur du konfigurerar projektet, inklusive paketinstallation, tillägg import av instruktioner och skapande av ett auktoriserat klientobjekt finns i Komma igång med Azure Blob Storage och Python.
  • Auktoriseringsmekanismen måste ha behörighet att utföra en kopieringsåtgärd eller avbryta en väntande kopia. Mer information finns i auktoriseringsvägledningen för följande REST API-åtgärd:

Om att kopiera blobar med asynkron schemaläggning

Åtgärden Copy Blob kan slutföras asynkront och utförs på bästa sätt, vilket innebär att åtgärden inte garanteras starta omedelbart eller slutföras inom en angiven tidsram. Kopieringsåtgärden schemaläggs i bakgrunden och utförs eftersom servern har tillgängliga resurser. Åtgärden kan slutföras synkront om kopian sker inom samma lagringskonto.

En Copy Blob åtgärd kan utföra någon av följande åtgärder:

  • Kopiera en källblob till en målblob med ett annat namn. Målbloben kan vara en befintlig blob av samma blobtyp (block, tillägg eller sida) eller en ny blob som skapas av kopieringsåtgärden.
  • Kopiera en källblob till en målblob med samma namn, vilket ersätter målbloben. Den här typen av kopieringsåtgärd tar bort alla icke-obligatoriska block och skriver över målblobens metadata.
  • Kopiera en källfil i Azure File-tjänsten till en målblob. Målbloben kan vara en befintlig blockblob eller vara en ny blockblob som skapas av kopieringsåtgärden. Kopiering från filer till sidblobar eller tilläggsblobar stöds inte.
  • Kopiera en ögonblicksbild över dess basblob. Genom att befordra en ögonblicksbild till basblobens position kan du återställa en tidigare version av en blob.
  • Kopiera en ögonblicksbild till en målblob med ett annat namn. Den resulterande målbloben är en skrivbar blob och inte en ögonblicksbild.

Källbloben för en kopieringsåtgärd kan vara en av följande typer: blockblob, tilläggsblob, sidblob, blobögonblicksbild eller blobversion. Kopieringsåtgärden kopierar alltid hela källbloben eller filen. Kopiering av ett intervall med byte eller en uppsättning block stöds inte.

Om målbloben redan finns måste den vara av samma blobtyp som källbloben och den befintliga målbloben skrivs över. Målbloben kan inte ändras när en kopieringsåtgärd pågår och en målblob kan bara ha en utestående kopieringsåtgärd.

Mer information om åtgärden, inklusive information om egenskaper, indextaggar, metadata och fakturering finns i Copy Blob Kopiera blobkommentarer.

Kopiera en blob med asynkron schemaläggning

Det här avsnittet ger en översikt över metoder som tillhandahålls av Azure Storage-klientbiblioteket för Python för att utföra en kopieringsåtgärd med asynkron schemaläggning.

Följande metoder omsluter REST API-åtgärden Kopiera blob och påbörjar en asynkron kopia av data från källbloben:

Returnerar start_copy_from_url en ordlista som innehåller copy_status och copy_id. Egenskapen copy_status lyckas om kopian har slutförts synkront eller väntar om kopian har startats asynkront.

Kopiera en blob från en källa i Azure

Om du kopierar en blob i samma lagringskonto kan åtgärden slutföras synkront. Åtkomst till källbloben kan auktoriseras via Microsoft Entra-ID, en signatur för delad åtkomst (SAS) eller en kontonyckel. En alterativ synkron kopieringsåtgärd finns i Kopiera en blob från en url för källobjekt med Python.

Om kopieringskällan är en blob i ett annat lagringskonto kan åtgärden slutföras asynkront. Källbloben måste antingen vara offentlig eller auktoriserad via SAS-token. SAS-token måste innehålla behörigheten Läs ('r'). Mer information om SAS-token finns i Delegera åtkomst med signaturer för delad åtkomst.

I följande exempel visas ett scenario för att kopiera en källblob från ett annat lagringskonto med asynkron schemaläggning. I det här exemplet skapar vi en källblob-URL med en bifogad SAS-token för användardelegering. Exemplet visar hur du genererar SAS-token med hjälp av klientbiblioteket, men du kan också ange en egen. Exemplet visar också hur du lånar källbloben under kopieringsåtgärden för att förhindra ändringar i bloben från en annan klient. Åtgärden Copy Blob sparar värdet för ETag källbloben när kopieringsåtgärden startar. Om värdet ETag ändras innan kopieringsåtgärden är klar misslyckas åtgärden.

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

Kommentar

SAS-token för användardelegering ger större säkerhet eftersom de är signerade med Microsoft Entra-autentiseringsuppgifter i stället för en kontonyckel. För att skapa en SAS-token för användardelegering behöver Microsoft Entra-säkerhetsobjektet lämpliga behörigheter. Auktoriseringskrav finns i Hämta användardelegeringsnyckel.

Kopiera en blob från en källa utanför Azure

Du kan utföra en kopieringsåtgärd på alla källobjekt som kan hämtas via HTTP GET-begäran på en viss URL, inklusive tillgängliga objekt utanför Azure. I följande exempel visas ett scenario för att kopiera en blob från en URL för tillgängligt källobjekt.

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

Kontrollera status för en kopieringsåtgärd

Om du vill kontrollera status för en asynkron Copy Blob åtgärd kan du avsöka metoden get_blob_properties och kontrollera kopieringsstatusen.

I följande kodexempel visas hur du kontrollerar statusen för en väntande kopieringsåtgärd:

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

Avbryt en kopieringsåtgärd

Om du avbryter en väntande Copy Blob åtgärd resulterar det i en målblob med noll längd. Metadata för målbloben har dock de nya värdena kopierade från källbloben eller anges uttryckligen under kopieringsåtgärden. Om du vill behålla de ursprungliga metadata från före kopian skapar du en ögonblicksbild av målbloben innan du anropar någon av kopieringsmetoderna.

Om du vill avbryta en väntande kopieringsåtgärd anropar du följande åtgärd:

Den här metoden omsluter rest-API-åtgärden Avbryt kopieringsblob , vilket avbryter en väntande Copy Blob åtgärd. Följande kodexempel visar hur du avbryter en väntande Copy Blob åtgärd:

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

Resurser

Mer information om hur du kopierar blobar med asynkron schemaläggning med hjälp av Azure Blob Storage-klientbiblioteket för Python finns i följande resurser.

REST API-åtgärder

Azure SDK för Python innehåller bibliotek som bygger på Azure REST API så att du kan interagera med REST API-åtgärder via välbekanta Python-paradigm. De klientbiblioteksmetoder som beskrivs i den här artikeln använder följande REST API-åtgärder:

Kodexempel

Klientbiblioteksresurser