Bagikan melalui


Menyalin blob dengan penjadwalan asinkron menggunakan Go

Artikel ini memperlihatkan cara menyalin blob dengan penjadwalan asinkron menggunakan modul klien Azure Storage untuk Go. Anda dapat menyalin blob dari sumber dalam akun penyimpanan yang sama, dari sumber di akun penyimpanan yang berbeda, atau dari objek yang dapat diakses yang diambil melalui permintaan HTTP GET pada URL tertentu. Anda juga dapat membatalkan operasi penyalinan yang tertunda.

Metode yang tercakup dalam artikel ini menggunakan operasi Salin Blob REST API, dan dapat digunakan saat Anda ingin melakukan salinan dengan penjadwalan asinkron. Untuk sebagian besar skenario penyalinan tempat Anda ingin memindahkan data ke akun penyimpanan dan memiliki URL untuk objek sumber, lihat Menyalin blob dari URL objek sumber dengan Go.

Prasyarat

Menyiapkan lingkungan Anda

Jika Anda tidak memiliki proyek yang sudah ada, bagian ini memperlihatkan cara menyiapkan proyek untuk bekerja dengan modul klien Azure Blob Storage untuk Go. Langkah-langkahnya termasuk penginstalan modul, menambahkan import jalur, dan membuat objek klien resmi. Untuk detailnya, lihat Mulai menggunakan Azure Blob Storage dan Go.

Menginstal modul

Instal modul azblob menggunakan perintah berikut:

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

Untuk mengautentikasi dengan MICROSOFT Entra ID (disarankan), instal azidentity modul menggunakan perintah berikut:

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

Menambahkan jalur impor

Dalam file kode Anda, tambahkan jalur impor berikut:

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

Jalur impor ini mewakili minimum yang diperlukan untuk memulai. Beberapa contoh kode dalam artikel ini mungkin memerlukan jalur impor tambahan. Untuk detail tertentu dan contoh penggunaan, lihat Sampel kode.

Membuat objek klien

Untuk menyambungkan aplikasi ke Blob Storage, buat objek klien menggunakan azblob. NewClient. Contoh berikut menunjukkan cara membuat objek klien menggunakan DefaultAzureCredential untuk otorisasi:

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
}

Authorization

Mekanisme otorisasi harus memiliki izin yang diperlukan untuk melakukan operasi penyalinan, atau membatalkan salinan yang tertunda. Untuk otorisasi dengan MICROSOFT Entra ID (disarankan), Anda memerlukan peran bawaan Azure RBAC Kontributor Data Blob Penyimpanan atau yang lebih tinggi. Untuk mempelajari lebih lanjut, lihat panduan otorisasi untuk Salin Blob atau Batalkan Salin Blob.

Tentang menyalin blob dengan penjadwalan asinkron

Copy Blob Operasi dapat selesai secara asinkron dan dilakukan berdasarkan upaya terbaik, yang berarti bahwa operasi tidak dijamin untuk segera dimulai atau diselesaikan dalam jangka waktu yang ditentukan. Operasi salin dijadwalkan di latar belakang dan dilakukan karena server memiliki sumber daya yang tersedia. Operasi dapat diselesaikan secara sinkron jika salinan terjadi dalam akun penyimpanan yang sama.

Copy Blob Operasi dapat melakukan salah satu tindakan berikut:

  • Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan dapat berupa blob yang ada dari jenis blob yang sama (blok, tambahkan, atau halaman), atau blob baru yang dibuat oleh operasi salin.
  • Salin blob sumber ke blob tujuan dengan nama yang sama, yang menggantikan blob tujuan. Jenis operasi salin ini menghapus blok yang tidak dikomit dan menimpa metadata blob tujuan.
  • Salin file sumber dalam layanan File Azure ke blob tujuan. Blob tujuan bisa menjadi blob blok yang ada, atau bisa menjadi blob blok baru yang dibuat oleh operasi salin. Menyalin dari file ke blob halaman atau menambahkan blob tidak didukung.
  • Salin snapshot di atas blob dasarnya. Dengan mempromosikan snapshot ke posisi blob dasar, Anda dapat memulihkan versi blob yang lebih lama.
  • Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan yang dihasilkan adalah blob yang dapat ditulis dan bukan snapshot.

Blob sumber untuk operasi salin dapat menjadi salah satu jenis berikut: blob blok, blob penambahan, blob halaman, rekam jepret blob, atau versi blob. Operasi salin selalu menyalin seluruh blob atau file sumber. Menyalin rentang byte atau set blok tidak didukung.

Jika blob tujuan sudah ada, blob harus dari jenis blob yang sama dengan blob sumber, dan blob tujuan yang ada ditimpa. Blob tujuan tidak dapat dimodifikasi saat operasi salin sedang berlangsung, dan blob tujuan hanya dapat memiliki satu operasi salin yang luar biasa.

Untuk mempelajari selengkapnya tentang Copy Blob operasi ini, termasuk informasi tentang properti, tag indeks, metadata, dan penagihan, lihat Menyalin komentar Blob.

Menyalin blob dengan penjadwalan asinkron

Bagian ini memberikan gambaran umum metode yang disediakan oleh modul klien Azure Storage untuk Go untuk melakukan operasi salin dengan penjadwalan asinkron.

Metode berikut membungkus operasi Copy Blob REST API, dan memulai salinan data asinkron dari blob sumber:

Menyalin blob dari sumber dalam Azure

Jika Anda menyalin blob dalam akun penyimpanan yang sama, operasi dapat diselesaikan secara sinkron. Akses ke blob sumber dapat diotorisasi melalui MICROSOFT Entra ID (disarankan), tanda tangan akses bersama (SAS), atau kunci akun. Untuk operasi penyalinan sinkron alteratif, lihat Menyalin blob dari URL objek sumber dengan Go.

Jika sumber salin adalah blob di akun penyimpanan yang berbeda, operasi dapat diselesaikan secara asinkron. Blob sumber harus publik atau diotorisasi melalui token SAS. Token SAS perlu menyertakan izin Baca ('r'). Untuk mempelajari selengkapnya tentang token SAS, lihat Mendelegasikan akses dengan tanda tangan akses bersama.

Contoh berikut menunjukkan skenario untuk menyalin blob sumber dari akun penyimpanan yang berbeda dengan penjadwalan asinkron. Dalam contoh ini, kami membuat URL blob sumber dengan token SAS delegasi pengguna yang ditambahkan. Contoh mengasumsikan Anda menyediakan SAS Anda sendiri. Contohnya juga menunjukkan cara menyewa blob sumber selama operasi salin untuk mencegah perubahan pada blob dari klien yang berbeda. Copy Blob Operasi menyimpan ETag nilai blob sumber saat operasi penyalinan dimulai. ETag Jika nilai diubah sebelum operasi salin selesai, operasi gagal. Kami juga mengatur tingkat akses untuk blob tujuan untuk Cool menggunakan 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)
}

Contoh berikut menunjukkan penggunaan sampel:

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

Catatan

Token SAS delegasi pengguna menawarkan keamanan yang lebih besar, karena ditandatangani dengan kredensial Microsoft Entra alih-alih kunci akun. Untuk membuat token SAS delegasi pengguna, perwakilan keamanan Microsoft Entra memerlukan izin yang sesuai. Untuk persyaratan otorisasi, lihat Mendapatkan Kunci Delegasi Pengguna.

Menyalin blob dari sumber di luar Azure

Anda dapat melakukan operasi salin pada objek sumber apa pun yang dapat diambil melalui permintaan HTTP GET pada URL tertentu, termasuk objek yang dapat diakses di luar Azure. Contoh berikut menunjukkan skenario untuk menyalin blob dari URL objek sumber yang dapat diakses:

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

Contoh berikut menunjukkan penggunaan sampel:

externalURL := "<source-url>"

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

copyFromExternalSourceAsync(externalURL, destBlob)

Memeriksa status operasi penyalinan

Untuk memeriksa status operasi asinkron Copy Blob , Anda dapat melakukan polling metode GetProperties dan memeriksa status penyalinan.

Contoh kode berikut menunjukkan cara memeriksa status operasi penyalinan:

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

Membatalkan operasi salin

Membatalkan operasi yang tertunda Copy Blob menghasilkan blob tujuan dengan panjang nol. Namun, metadata untuk blob tujuan memiliki nilai baru yang disalin dari blob sumber atau diatur secara eksplisit selama operasi salin. Untuk menjaga metadata asli dari sebelum salinan, buat snapshot dari blob tujuan sebelum memanggil salah satu metode salin.

Untuk membatalkan operasi penyalinan yang tertunda, panggil operasi berikut:

Metode ini membungkus operasi Abort Copy Blob REST API, yang membatalkan operasi yang tertunda Copy Blob . Contoh kode berikut menunjukkan cara membatalkan operasi yang tertunda Copy Blob :

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

Sumber

Untuk mempelajari selengkapnya tentang menyalin blob dengan penjadwalan asinkron menggunakan modul klien Azure Blob Storage untuk Go, lihat sumber daya berikut.

Sampel kode

Operasi REST API

Azure SDK for Go berisi pustaka yang dibangun di atas Azure REST API, memungkinkan Anda berinteraksi dengan operasi REST API melalui paradigma Go yang sudah dikenal. Metode yang tercakup dalam artikel ini menggunakan operasi REST API berikut:

Sumber daya modul klien

  • Artikel ini adalah bagian dari panduan pengembang Blob Storage untuk Go. Untuk mempelajari lebih lanjut, lihat daftar lengkap artikel panduan pengembang di Membangun aplikasi Go Anda.