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
- Subskrypcja platformy Azure — utwórz jedną bezpłatnie
- Konto usługi Azure Storage — tworzenie konta magazynu
- Przejdź do wersji 1.18 lub nowszej
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, ©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)
}
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, ©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
}
}
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:
- Kopiowanie obiektu blob (interfejs API REST)
- Przerwanie kopiowania obiektu blob (interfejs API REST)
Zasoby modułu klienta
Powiązana zawartość
- 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.