Kopiera en blob med asynkron schemaläggning med Go
Den här artikeln visar hur du kopierar en blob med asynkron schemaläggning med hjälp av Azure Storage-klientmodulen för Go. 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.
Metoderna som beskrivs i den här artikeln använder rest-API-åtgärden Kopiera blob 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 Go.
Förutsättningar
- Azure-prenumeration – skapa en kostnadsfritt
- Azure Storage-konto – skapa ett lagringskonto
- Gå 1.18+
Konfigurera din miljö
Om du inte har ett befintligt projekt visar det här avsnittet hur du konfigurerar ett projekt så att det fungerar med Azure Blob Storage-klientmodulen för Go. Stegen omfattar modulinstallation, tillägg av import
sökvägar och skapande av ett auktoriserat klientobjekt. Mer information finns i Kom igång med Azure Blob Storage och Go.
Installera moduler
Installera azblob-modulen med följande kommando:
go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob
Om du vill autentisera med Microsoft Entra-ID (rekommenderas) installerar du modulen azidentity
med följande kommando:
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Lägga till importsökvägar
Lägg till följande importsökvägar i kodfilen:
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
Dessa importsökvägar representerar det minsta som krävs för att komma igång. Vissa kodexempel i den här artikeln kan kräva ytterligare importsökvägar. Specifik information och exempelanvändning finns i Kodexempel.
Skapa ett klientobjekt
Om du vill ansluta en app till Blob Storage skapar du ett klientobjekt med azblob . NewClient. I följande exempel visas hur du skapar ett klientobjekt med hjälp av DefaultAzureCredential
för auktorisering:
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
}
Auktorisering
Auktoriseringsmekanismen måste ha de behörigheter som krävs för att utföra en kopieringsåtgärd eller avbryta en väntande kopia. För auktorisering med Microsoft Entra-ID (rekommenderas) behöver du den inbyggda rollen Storage Blob Data Contributor eller senare. Mer information finns i auktoriseringsvägledningen för Kopiera blob eller Avbryt kopieringsblob.
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-klientmodulen för Go 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:
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 (rekommenderas), en signatur för delad åtkomst (SAS) eller en kontonyckel. En alterativ synkron kopieringsåtgärd finns i Kopiera en blob från en källobjekt-URL med Go.
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 förutsätter att du anger din egen SAS. 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. Vi anger också åtkomstnivån för målbloben till Cool
med hjälp av structen 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, ©Options)
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)
}
I följande exempel visas exempelanvändning:
// 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)
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:
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, ©Options)
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
}
}
I följande exempel visas exempelanvändning:
externalURL := "<source-url>"
destBlob = destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-2")
copyFromExternalSourceAsync(externalURL, destBlob)
Kontrollera status för en kopieringsåtgärd
Om du vill kontrollera statusen för en asynkron Copy Blob
åtgärd kan du avsöka metoden GetProperties och kontrollera kopieringsstatusen.
I följande kodexempel visas hur du kontrollerar status för en kopieringsåtgärd:
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)
}
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:
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)
}
}
Resurser
Mer information om hur du kopierar blobar med asynkron schemaläggning med hjälp av Azure Blob Storage-klientmodulen för Go finns i följande resurser.
Kodexempel
REST API-åtgärder
Azure SDK för Go innehåller bibliotek som bygger på Azure REST API så att du kan interagera med REST API-åtgärder via välbekanta Go-paradigm. Metoderna som beskrivs i den här artikeln använder följande REST API-åtgärder:
- Kopiera blob (REST API)
- Avbryt kopieringsblob (REST API)
Klientmodulresurser
Relaterat innehåll
- Den här artikeln är en del av utvecklarguiden för Blob Storage för Go. Mer information finns i den fullständiga listan över utvecklarguideartiklar i Skapa din Go-app.