Udostępnij za pośrednictwem


Kopiowanie obiektu blob z planowaniem asynchronicznym przy użyciu języka Go

W tym artykule pokazano, jak skopiować obiekt blob z asynchronicznym planowaniem przy użyciu modułu klienta usługi Azure Storage dla języka Go. Obiekt blob można skopiować ze źródła na tym samym koncie magazynu, ze źródła na innym koncie magazynu lub z dowolnego dostępnego obiektu pobranego za pośrednictwem żądania HTTP GET dla danego adresu URL. Możesz również przerwać oczekującą operację kopiowania.

Metody opisane w tym artykule korzystają z operacji interfejsu API REST kopiowania obiektów blob i mogą być używane, gdy chcesz wykonać kopię za pomocą planowania asynchronicznego. W przypadku większości scenariuszy kopiowania, w których chcesz przenieść dane na konto magazynu i mieć adres URL obiektu źródłowego, zobacz Kopiowanie obiektu blob z adresu URL obiektu źródłowego za pomocą języka Go.

Wymagania wstępne

Konfigurowanie środowiska

Jeśli nie masz istniejącego projektu, w tej sekcji pokazano, jak skonfigurować projekt do pracy z modułem klienta usługi Azure Blob Storage dla języka Go. Kroki obejmują instalację modułu, dodawanie import ścieżek i tworzenie autoryzowanego obiektu klienta. Aby uzyskać szczegółowe informacje, zobacz Wprowadzenie do usługi Azure Blob Storage i Go.

Instalowanie modułów

Zainstaluj moduł azblob przy użyciu następującego polecenia:

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

Aby uwierzytelnić się przy użyciu identyfikatora Entra firmy Microsoft (zalecane), zainstaluj azidentity moduł przy użyciu następującego polecenia:

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

Dodawanie ścieżek importu

W pliku kodu dodaj następujące ścieżki importu:

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

Te ścieżki importu reprezentują minimum wymagane do rozpoczęcia pracy. Niektóre przykłady kodu w tym artykule mogą wymagać dodatkowych ścieżek importu. Aby uzyskać szczegółowe informacje i przykładowe użycie, zobacz Przykłady kodu.

Tworzenie obiektu klienta

Aby połączyć aplikację z usługą Blob Storage, utwórz obiekt klienta przy użyciu polecenia azblob. NewClient. W poniższym przykładzie pokazano, jak utworzyć obiekt klienta przy użyciu DefaultAzureCredential autoryzacji:

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
}

Autoryzacja

Mechanizm autoryzacji musi mieć uprawnienia niezbędne do wykonania operacji kopiowania lub przerwania oczekującej kopii. Aby uzyskać autoryzację przy użyciu identyfikatora Entra firmy Microsoft (zalecane), potrzebujesz wbudowanej kontroli dostępu opartej na rolach platformy Azure współautora danych obiektów blob usługi Storage lub nowszego. Aby dowiedzieć się więcej, zobacz wskazówki dotyczące autoryzacji dotyczące kopiowania obiektu blob lub przerywania kopiowania obiektu blob.

Informacje o kopiowaniu obiektów blob za pomocą planowania asynchronicznego

Operacja Copy Blob może zakończyć się asynchronicznie i jest wykonywana na podstawie najlepszego nakładu pracy, co oznacza, że operacja nie gwarantuje natychmiastowego uruchomienia ani ukończenia w określonym przedziale czasu. Operacja kopiowania jest zaplanowana w tle i wykonywana jako serwer ma dostępne zasoby. Operacja może zakończyć się synchronicznie, jeśli kopia występuje na tym samym koncie magazynu.

Operacja Copy Blob może wykonać dowolną z następujących akcji:

  • Skopiuj źródłowy obiekt blob do docelowego obiektu blob o innej nazwie. Docelowy obiekt blob może być istniejącym obiektem blob tego samego typu obiektu blob (blok, dołączanie lub strona) albo może być nowym obiektem blob utworzonym przez operację kopiowania.
  • Skopiuj źródłowy obiekt blob do docelowego obiektu blob o takiej samej nazwie, który zastępuje docelowy obiekt blob. Ten typ operacji kopiowania usuwa wszystkie niezatwierdzone bloki i zastępuje metadane docelowego obiektu blob.
  • Skopiuj plik źródłowy w usłudze Azure File do docelowego obiektu blob. Docelowy obiekt blob może być istniejącym blokowym obiektem blob lub może być nowym blokowym obiektem blob utworzonym przez operację kopiowania. Kopiowanie z plików do stronicowych obiektów blob lub uzupełnialnych obiektów blob nie jest obsługiwane.
  • Skopiuj migawkę na podstawowy obiekt blob. Promując migawkę do pozycji podstawowego obiektu blob, można przywrócić starszą wersję obiektu blob.
  • Skopiuj migawkę do docelowego obiektu blob o innej nazwie. Wynikowy docelowy obiekt blob jest zapisywalnym obiektem blob, a nie migawką.

Źródłowy obiekt blob operacji kopiowania może być jednym z następujących typów: blokowy obiekt blob, uzupełnialne obiekty blob, stronicowy obiekt blob, migawka obiektu blob lub wersja obiektu blob. Operacja kopiowania zawsze kopiuje cały źródłowy obiekt blob lub plik. Kopiowanie zakresu bajtów lub zestawu bloków nie jest obsługiwane.

Jeśli docelowy obiekt blob już istnieje, musi mieć ten sam typ obiektu blob co źródłowy obiekt blob, a istniejący docelowy obiekt blob zostanie zastąpiony. Nie można zmodyfikować docelowego obiektu blob, gdy operacja kopiowania jest w toku, a docelowy obiekt blob może mieć tylko jedną zaległą operację kopiowania.

Aby dowiedzieć się więcej o Copy Blob operacji, w tym o właściwościach, tagach indeksu, metadanych i rozliczeniach, zobacz Kopiowanie uwag dotyczących obiektu blob.

Kopiowanie obiektu blob za pomocą planowania asynchronicznego

Ta sekcja zawiera omówienie metod udostępnianych przez moduł klienta usługi Azure Storage dla języka Go w celu wykonania operacji kopiowania przy użyciu planowania asynchronicznego.

Następujące metody opakowuje operację interfejsu API REST kopiowania obiektów blob i rozpoczynają asynchroniczną kopię danych ze źródłowego obiektu blob:

Kopiowanie obiektu blob ze źródła na platformie Azure

Jeśli kopiujesz obiekt blob na tym samym koncie magazynu, operacja może zakończyć się synchronicznie. Dostęp do źródłowego obiektu blob można autoryzować za pośrednictwem identyfikatora Entra firmy Microsoft (zalecanego), sygnatury dostępu współdzielonego (SAS) lub klucza konta. Aby uzyskać informacje na temat operacji kopiowania synchronicznego, zobacz Kopiowanie obiektu blob z adresu URL obiektu źródłowego za pomocą języka Go.

Jeśli źródło kopiowania jest obiektem blob na innym koncie magazynu, operacja może zakończyć się asynchronicznie. Źródłowy obiekt blob musi być publiczny lub autoryzowany za pośrednictwem tokenu SAS. Token SAS musi zawierać uprawnienie Odczyt ('r'). Aby dowiedzieć się więcej na temat tokenów SAS, zobacz Delegowanie dostępu za pomocą sygnatur dostępu współdzielonego.

Poniższy przykład przedstawia scenariusz kopiowania źródłowego obiektu blob z innego konta magazynu z asynchronicznym planowaniem. W tym przykładzie utworzymy źródłowy adres URL obiektu blob z dołączonym tokenem SAS delegowania użytkownika. W tym przykładzie przyjęto założenie, że podajesz własną sygnaturę dostępu współdzielonego. W przykładzie pokazano również, jak dzierżawić źródłowy obiekt blob podczas operacji kopiowania, aby zapobiec zmianom obiektu blob z innego klienta. Operacja Copy Blob zapisuje ETag wartość źródłowego obiektu blob po uruchomieniu operacji kopiowania. Jeśli wartość zostanie zmieniona ETag przed zakończeniem operacji kopiowania, operacja zakończy się niepowodzeniem. Ustawiliśmy również warstwę dostępu dla docelowego obiektu blob na Cool użycie struktury 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)
}

W poniższym przykładzie pokazano przykładowe użycie:

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

Uwaga

Tokeny SAS delegowania użytkownika zapewniają większe bezpieczeństwo, ponieważ są podpisane przy użyciu poświadczeń firmy Microsoft Entra zamiast klucza konta. Aby utworzyć token SAS delegowania użytkownika, podmiot zabezpieczeń firmy Microsoft entra potrzebuje odpowiednich uprawnień. Aby uzyskać wymagania dotyczące autoryzacji, zobacz Pobieranie klucza delegowania użytkownika.

Kopiowanie obiektu blob ze źródła spoza platformy Azure

Operację kopiowania można wykonać na dowolnym obiekcie źródłowym, który można pobrać za pośrednictwem żądania HTTP GET dla danego adresu URL, w tym obiektów dostępnych poza platformą Azure. Poniższy przykład przedstawia scenariusz kopiowania obiektu blob z dostępnego adresu URL obiektu źródłowego:

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
    }
}

W poniższym przykładzie pokazano przykładowe użycie:

externalURL := "<source-url>"

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

copyFromExternalSourceAsync(externalURL, destBlob)

Sprawdzanie stanu operacji kopiowania

Aby sprawdzić stan operacji asynchronicznej Copy Blob , możesz sondować metodę GetProperties i sprawdzić stan kopiowania.

Poniższy przykład kodu pokazuje, jak sprawdzić stan operacji kopiowania:

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

Przerywanie operacji kopiowania

Przerwanie oczekującej Copy Blob operacji powoduje utworzenie docelowego obiektu blob o zerowej długości. Jednak metadane docelowego obiektu blob mają nowe wartości skopiowane ze źródłowego obiektu blob lub ustawione jawnie podczas operacji kopiowania. Aby zachować oryginalne metadane przed kopią, przed wywołaniem jednej z metod kopiowania utwórz migawkę docelowego obiektu blob.

Aby przerwać oczekującą operację kopiowania, wywołaj następującą operację:

Ta metoda opakowuje operację interfejsu API REST kopiowania obiektu blob abort, która anuluje oczekującą Copy Blob operację. Poniższy przykład kodu pokazuje, jak przerwać oczekującą Copy Blob operację:

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

Zasoby

Aby dowiedzieć się więcej na temat kopiowania obiektów blob za pomocą planowania asynchronicznego przy użyciu modułu klienta usługi Azure Blob Storage dla języka Go, zobacz następujące zasoby.

Przykłady kodu

Operacje interfejsu API REST

Zestaw Azure SDK dla języka Go zawiera biblioteki oparte na interfejsie API REST platformy Azure, które umożliwiają interakcję z operacjami interfejsu API REST za pomocą znanych paradygmatów języka Go. Metody opisane w tym artykule korzystają z następujących operacji interfejsu API REST:

Zasoby modułu klienta

  • Ten artykuł jest częścią przewodnika dla deweloperów usługi Blob Storage dla języka Go. Aby dowiedzieć się więcej, zobacz pełną listę artykułów z przewodnika dla deweloperów na stronie Tworzenie aplikacji języka Go.