Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk bemutatja, hogyan másolhat egy blobot aszinkron ütemezéssel a Go-hoz készült Azure Storage-ügyfélmodul használatával. Egy blobot másolhat egy forrásból ugyanabban a tárfiókban, egy másik tárfiókban lévő forrásból, vagy bármely akadálymentes objektumból, amely egy adott URL-címen http GET kéréssel kérhető le. A függőben lévő másolási műveletet is megszakíthatja.
A cikkben ismertetett metódusok a Blob REST API másolása műveletet használják, és akkor használhatók, ha aszinkron ütemezéssel szeretne másolatot készíteni. A legtöbb olyan másolási forgatókönyv esetében, amikor adatokat szeretne áthelyezni egy tárfiókba, és rendelkezik a forrásobjektum URL-címével, olvassa el a Blob másolása forrásobjektum URL-címéről a Go használatával című témakört.
Előfeltételek
- Azure-előfizetés – hozzon létre egyet ingyenesen
- Azure Storage-fiók – tárfiók létrehozása
- Go 1.18+
Saját környezet beállítása
Ha nem rendelkezik meglévő projekttel, ez a szakasz bemutatja, hogyan állíthat be egy projektet a Go Azure Blob Storage-ügyfélmoduljának használatára. A lépések közé tartozik a modul telepítése, az elérési utak hozzáadása import és egy engedélyezett ügyfélobjektum létrehozása. További részletekért tekintse meg az Azure Blob Storage és a Go használatának első lépéseit.
Modulok telepítése
Telepítse az azblob modult a következő paranccsal:
go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob
A Microsoft Entra-azonosítóval való hitelesítéshez (ajánlott) telepítse a azidentity modult a következő paranccsal:
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Importálási útvonalak hozzáadása
A kódfájlban adja hozzá a következő importálási útvonalakat:
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
Ezek az importálási útvonalak az első lépésekhez szükséges minimumot jelölik. A cikkben szereplő néhány példakód további importálási útvonalakat igényelhet. További részletekért és példahasználatért tekintse meg a kódmintákat.
Ügyfélobjektum létrehozása
Ha egy alkalmazást a Blob Storage-hoz szeretne csatlakoztatni, hozzon létre egy ügyfélobjektumot az azblob használatával . NewClient. Az alábbi példa bemutatja, hogyan hozhat létre ügyfélobjektumot DefaultAzureCredential engedélyezés céljából:
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
}
Engedélyezés
Az engedélyezési mechanizmusnak rendelkeznie kell a másolási művelet végrehajtásához vagy a függőben lévő másolat megszakításához szükséges engedélyekkel. A Microsoft Entra-azonosítóval való engedélyezéshez, amelyet ajánlunk, az Azure RBAC beépített Storage Blob Data Közreműködő szerepkörre vagy magasabb szintű szerepkörre van szükség. További információkért lásd a Blob másolása vagy a Blob másolásának megszakítása engedélyezési útmutatóját.
Blobok aszinkron ütemezéssel történő másolása
A Copy Blob művelet aszinkron módon fejeződhet be, és a legjobb munkamennyiség alapján hajtható végre, ami azt jelenti, hogy a művelet nem garantáltan azonnal indul el vagy fejeződik be egy megadott időkereten belül. A másolási művelet a háttérben van ütemezve, és akkor hajtódik végre, amikor a kiszolgálón rendelkezésre állnak az erőforrások. A művelet szinkron módon is befejeződhet, ha a másolat ugyanabban a tárfiókban történik.
A Copy Blob művelet a következő műveletek bármelyikét hajthatja végre:
- Másolja a forrásblobot egy másik nevű célblobba. A célblob lehet ugyanahhoz a blobtípushoz tartozó meglévő blob (blokk, hozzáfűzés vagy oldal), vagy lehet a másolási művelet által létrehozott új blob.
- Másolja a forrásblobot egy célblobba ugyanazzal a névvel, amely a célblobot helyettesíti. Ez a másolási művelet eltávolítja a nem véglegesített blokkokat, és felülírja a cél blob metaadatait.
- Másolja a forrásfájlt az Azure File service-ben egy célblobba. A célblob lehet meglévő blokkblob, vagy a másolási művelet által létrehozott új blokkblob. A fájlok lapblobokra vagy hozzáfűző blobokra másolása nem támogatott.
- Másolj egy pillanatképet az alap blobjára. Ha előléptet egy pillanatképet az alapblob helyére, visszaállíthatja a blob egy korábbi verzióját.
- Pillanatkép másolása másik nevű célblobba. Az eredményként kapott célblob egy írható blob, és nem pillanatkép.
A másolási művelet forrásblobja a következő típusok egyike lehet: blokkblob, hozzáfűző blob, lapblob, blob pillanatkép vagy blobverzió. A másolási művelet mindig a teljes forrásblobot vagy fájlt másolja. A bájtok vagy blokkok tartományának másolása nem támogatott.
Ha a célblob már létezik, annak a forrásblob típusával megegyező blobtípusúnak kell lennie, és a meglévő célblob felülírva lesz. A célblob nem módosítható másolási művelet közben, és a célblobok csak egy kiugró másolási művelettel rendelkezhetnek.
Ha többet szeretne megtudni a műveletről, beleértve a Copy Blob tulajdonságokra, indexcímkékre, metaadatokra és számlázásra vonatkozó információkat, olvassa el a Blob-megjegyzések másolása című témakört.
Blob másolása aszinkron ütemezéssel
Ez a szakasz áttekintést nyújt a Go-hoz készült Azure Storage-ügyfélmodul által biztosított módszerekről a másolási művelet aszinkron ütemezéssel történő végrehajtásához.
A következő metódusok a Blob másolása REST API-műveletet burkolják, és elindítják az adatok aszinkron másolását a forrásblobból.
Blob másolása egy Azure-beli forrásból
Ha egy blobot másol ugyanabban a tárfiókban, a művelet szinkron módon is befejeződhet. A forrásblobhoz való hozzáférés a Microsoft Entra-azonosítón (ajánlott), a közös hozzáférésű jogosultságkódon (SAS) vagy egy fiókkulcson keresztül engedélyezhető. Alternatív szinkron másolási műveletről a Blob másolása forrásobjektum URL-címéről a Go használatával című témakörben olvashat.
Ha a másolási forrás egy másik tárfiókban lévő blob, a művelet aszinkron módon fejeződhet be. A forrásblobnak nyilvánosnak vagy SAS-jogkivonaton keresztül engedélyezettnek kell lennie. Az SAS tokennek tartalmaznia kell az olvasási ('r') engedélyt. Az SAS-jogkivonatokról további információt a Megosztott hozzáférésű jogosultságkódokkal rendelkező hozzáférés delegálása című témakörben talál.
Az alábbi példa egy másik tárfiókból származó forrásblob aszinkron ütemezéssel történő másolásának forgatókönyvét mutatja be. Ebben a példában létrehozunk egy forrás blob URL-címet egy hozzáfűzött felhasználódelegálási SAS-jogkivonattal. A példa feltételezi, hogy saját SAS-t ad meg. A példa azt is bemutatja, hogyan adhatja bérbe a forrásblobot a másolási művelet során, hogy megakadályozza a blob módosítását egy másik ügyféltől. A Copy Blob művelet a másolási művelet indításakor menti ETag a forrásblob értékét. Ha az ETag érték a másolási művelet befejeződése előtt módosul, a művelet meghiúsul. A cél blob Cool hozzáférési szintjét is beállítjuk a StartCopyFromURLOptions struktúra használatával.
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)
}
Az alábbi példa a mintahasználatot mutatja be:
// 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)
Megjegyzés
A felhasználói delegálási SAS-jogkivonatok nagyobb biztonságot nyújtanak, mivel fiókkulcs helyett Microsoft Entra hitelesítő adatokkal vannak aláírva. Felhasználói delegálási SAS-jogkivonat létrehozásához a Microsoft Entra biztonsági tagnak megfelelő engedélyekre van szüksége. Az engedélyezési követelményekkel kapcsolatban lásd: Felhasználódelegálási kulcs lekérése.
Blob másolása az Azure-on kívüli forrásból
Másolási műveletet bármely olyan forrásobjektumon végrehajthat, amely http GET kéréssel kérhető le egy adott URL-címen, beleértve az Azure-on kívüli akadálymentes objektumokat is. Az alábbi példa egy blob akadálymentes forrásobjektum URL-címéről történő másolásának forgatókönyvét mutatja be:
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
}
}
Az alábbi példa a mintahasználatot mutatja be:
externalURL := "<source-url>"
destBlob = destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-2")
copyFromExternalSourceAsync(externalURL, destBlob)
Másolási művelet állapotának ellenőrzése
Az aszinkron Copy Blob művelet állapotának ellenőrzéséhez lekérdezheti a GetProperties metódust , és ellenőrizheti a másolás állapotát.
Az alábbi példakód bemutatja, hogyan ellenőrizheti a másolási művelet állapotát:
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)
}
Másolási művelet megszakítása
A függőben lévő Copy Blob művelet megszakítása nulla hosszúságú célblobot eredményez. A célblob metaadatai azonban a forrásblobból másolt vagy explicit módon beállított új értékeket tartalmaznak a másolási művelet során. Az eredeti metaadatok másolás előtti megőrzéséhez készítsen pillanatképet a célblobról, mielőtt meghívja az egyik másolási metódust.
Függőben lévő másolási művelet megszakításához hívja meg a következő műveletet:
Ez a metódus körbeburkolja az Abort Copy Blob REST API műveletet, amely megszakít egy függőben lévő Copy Blob műveletet. Az alábbi példakód bemutatja, hogyan szakíthat meg függőben lévő Copy Blob műveletet:
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)
}
}
Források
Ha többet szeretne megtudni a blobok aszinkron ütemezéssel történő másolásáról a Go Azure Blob Storage-ügyfélmoduljával, tekintse meg az alábbi erőforrásokat.
Kódminták
REST API-műveletek
Az Azure SDK for Go olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát ismert Go-paradigmákon keresztül. A cikkben tárgyalt módszerek a következő REST API-műveleteket használják:
Ügyfélmodul erőforrásai
Kapcsolódó tartalom
- Ez a cikk a Blob Storage Go-hoz készült fejlesztői útmutatójának része. Ha többet szeretne megtudni, tekintse meg a Go-alkalmazás fejlesztéséhez szükséges útmutatók teljes listáját.