Delen via


Een blob kopiëren met asynchrone planning met go

In dit artikel wordt beschreven hoe u een blob kopieert met asynchrone planning met behulp van de Azure Storage-clientmodule voor Go. 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 methoden die in dit artikel worden behandeld, maken gebruik van de rest API-bewerking voor kopiëren blob 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 Go.

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-clientmodule voor Go. De stappen omvatten module-installatie, het toevoegen van import paden en het maken van een geautoriseerd clientobject. Zie Aan de slag met Azure Blob Storage en Go voor meer informatie.

Modules installeren

Installeer de azblob-module met behulp van de volgende opdracht:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

Als u wilt verifiëren met Microsoft Entra ID (aanbevolen), installeert u de azidentity module met behulp van de volgende opdracht:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Importpaden toevoegen

Voeg in uw codebestand de volgende importpaden toe:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

Deze importpaden vertegenwoordigen het minimum dat nodig is om aan de slag te gaan. Voor sommige codevoorbeelden in dit artikel zijn mogelijk extra importpaden vereist. Zie Codevoorbeelden voor specifieke details en voorbeeldgebruik.

Een clientobject maken

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

func getServiceClientTokenCredential(accountURL string) *azblob.Client {
    // Create a new service client with token credential
    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(accountURL, credential, nil)
    handleError(err)

    return client
}

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) hebt u ingebouwde Azure RBAC-rol Opslagblobgegevensbijdrager of hoger nodig. Zie de autorisatierichtlijnen voor Copy Blob of Abort Copy Blob voor meer informatie.

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 worden geboden door de Azure Storage-clientmodule voor Go 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:

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 (aanbevolen), een Shared Access Signature (SAS) of een accountsleutel. Zie Een blob kopiëren vanuit een bronobject-URL met Go 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 wordt ervan uitgegaan dat u uw eigen SAS opgeeft. 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. We stellen ook de toegangslaag voor de doel-blob in op Cool het gebruik van de struct StartCopyFromURLOptions .

func copyFromSourceAsync(srcBlob *blockblob.Client, destBlob *blockblob.Client) {
    // Lease the source blob during copy to prevent other clients from modifying it
    blobLeaseClient, err := lease.NewBlobClient(srcBlob, nil)
    handleError(err)

    _, err = blobLeaseClient.AcquireLease(context.TODO(), int32(60), nil)
    handleError(err)

    // Retrieve the SAS token for the source blob and append it to the URL
    sas := "<sas-token>"
    url := srcBlob.URL() + "?" + sas

    // Set copy options
    copyOptions := blob.StartCopyFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    startCopy, err := destBlob.StartCopyFromURL(context.TODO(), url, &copyOptions)
    handleError(err)

    // If startCopy.CopyStatus returns a status of "pending", the operation has started asynchronously
    // You can optionally add logic to poll the copy status and wait for the operation to complete
    // Example:
    copyStatus := *startCopy.CopyStatus
    for copyStatus == blob.CopyStatusTypePending {
        time.Sleep(time.Second * 2)

        properties, err := destBlob.GetProperties(context.TODO(), nil)
        handleError(err)

        copyStatus = *properties.CopyStatus
    }

    // Release the lease on the source blob
    _, err = blobLeaseClient.ReleaseLease(context.TODO(), nil)
    handleError(err)
}

In het volgende voorbeeld ziet u voorbeeldgebruik:

// TODO: replace <storage-account-name> placeholders with actual storage account names
srcURL := "https://<src-storage-account-name>.blob.core.windows.net/"
destURL := "https://<dest-storage-account-name>.blob.core.windows.net/"

credential, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)

srcClient, err := azblob.NewClient(srcURL, credential, nil)
handleError(err)
destClient, err := azblob.NewClient(destURL, credential, nil)
handleError(err)

srcBlob := srcClient.ServiceClient().NewContainerClient("source-container").NewBlockBlobClient("source-blob")
destBlob := destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-1")

copyFromSourceAsync(srcBlob, destBlob)

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:

func copyFromExternalSourceAsync(srcURL string, destBlob *blockblob.Client) {
    // Set copy options
    copyOptions := blob.StartCopyFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    startCopy, err := destBlob.StartCopyFromURL(context.TODO(), srcURL, &copyOptions)
    handleError(err)

    // If startCopy.CopyStatus returns a status of "pending", the operation has started asynchronously
    // You can optionally add logic to poll the copy status and wait for the operation to complete
    // Example:
    copyStatus := *startCopy.CopyStatus
    for copyStatus == blob.CopyStatusTypePending {
        time.Sleep(time.Second * 2)

        properties, err := destBlob.GetProperties(context.TODO(), nil)
        handleError(err)

        copyStatus = *properties.CopyStatus
    }
}

In het volgende voorbeeld ziet u voorbeeldgebruik:

externalURL := "<source-url>"

destBlob = destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-2")

copyFromExternalSourceAsync(externalURL, destBlob)

De status van een kopieerbewerking controleren

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

In het volgende codevoorbeeld ziet u hoe u de status van een kopieerbewerking kunt controleren:

func checkCopyStatus(destBlob *blockblob.Client) {
    // Retrieve the properties from the destination blob
    properties, err := destBlob.GetProperties(context.TODO(), nil)
    handleError(err)

    copyID := *properties.CopyID
    copyStatus := *properties.CopyStatus

    fmt.Printf("Copy operation %s is %s\n", copyID, copyStatus)
}

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:

func abortCopy(destBlob *blockblob.Client) {
    // Retrieve the copy ID from the destination blob
    properties, err := destBlob.GetProperties(context.TODO(), nil)
    handleError(err)

    copyID := *properties.CopyID
    copyStatus := *properties.CopyStatus

    // Abort the copy operation if it's still pending
    if copyStatus == blob.CopyStatusTypePending {
        _, err := destBlob.AbortCopyFromURL(context.TODO(), copyID, nil)
        handleError(err)

        fmt.Printf("Copy operation %s aborted\n", copyID)
    }
}

Resources

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

Codevoorbeelden

REST API-bewerkingen

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

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

Resources voor clientmodules

  • Dit artikel maakt deel uit van de ontwikkelaarshandleiding voor Blob Storage voor Go. Zie de volledige lijst met artikelen over ontwikkelaarshandleidingen in Build your Go app voor meer informatie.