Transfer data dengan pustaka Data Movement

Catatan

Artikel ini mencakup panduan untuk bekerja dengan pustaka Azure Storage Data Movement versi 2.0.XX. Versi 2.0.XX saat ini dalam mode pemeliharaan, dan pustaka hanya menerima perbaikan untuk integritas data dan masalah keamanan. Tidak ada fungsionalitas atau fitur baru yang akan ditambahkan, dan versi layanan penyimpanan baru tidak akan didukung oleh pustaka.

Versi beta dari pustaka Pergerakan Data modern saat ini sedang dalam pengembangan. Untuk informasi selengkapnya, lihat Pustaka klien Umum Pergerakan Data Azure Storage untuk .NET di GitHub.

Pustaka Azure Storage Data Movement adalah pustaka sumber terbuka lintas platform yang dirancang untuk pengunggahan, pengunduhan, dan penyalinan blob dan file berperforma tinggi. Pustaka Data Movement menyediakan metode mudah yang tidak tersedia di pustaka klien Azure Storage untuk .NET. Metode ini memberikan kemampuan untuk mengatur jumlah operasi paralel, melacak kemajuan transfer, dengan mudah melanjutkan transfer yang dibatalkan, dan banyak lagi.

Library ini juga menggunakan .NET Core, yang berarti Anda dapat menggunakannya saat membuat aplikasi .NET untuk Windows, Linux, dan macOS. Untuk mempelajari lebih lanjut tentang .NET Core, lihat dokumentasi .NET Core. Pustaka ini juga berfungsi untuk aplikasi .NET Framework tradisional untuk Windows.

Dokumen ini menunjukkan cara membuat aplikasi konsol .NET Core yang berjalan di Windows, Linux, dan macOS dan melakukan skenario berikut:

  • Unggah file dan direktori ke Blob Storage.
  • Tentukan jumlah operasi paralel saat mentransfer data.
  • Lacak kemajuan transfer data.
  • Lanjutkan transfer data yang dibatalkan.
  • Salin file dari URL ke Blob Storage.
  • Salin dari Blob Storage ke Blob Storage.

Prasyarat

Penyiapan

  1. Kunjungi Panduan Instalasi .NET Core untuk menginstal .NET Core SDK. Saat memilih lingkungan Anda, pilih opsi baris perintah.
  2. Dari baris perintah, buat direktori untuk proyek Anda. Navigasi ke direktori ini, lalu ketik dotnet new console -o <sample-project-name> untuk membuat proyek konsol C#.
  3. Buka direktori ini di Visual Studio Code. Langkah ini dapat dengan cepat dilakukan melalui baris perintah dengan mengetik code . di Windows.
  4. Instal ekstensi C# dari Visual Studio Code Marketplace. Hidupkan ulang Visual Studio Code.
  5. Pada titik ini, Anda akan melihat dua perintah. Salah satunya adalah untuk menambahkan "aset yang diperlukan untuk build dan debug." Klik "ya." Perintah lainnya adalah untuk memulihkan dependensi yang belum diatasi. Klik "pulihkan."
  6. Ubah launch.json di bawah .vscode untuk menggunakan terminal eksternal sebagai konsol. Pengaturan ini harus dibaca sebagai "console": "externalTerminal"
  7. Visual Studio Code memungkinkan Anda untuk memperbaiki kesalahan aplikasi .NET Core. Tekan F5 untuk menjalankan aplikasi Anda dan verifikasi bahwa penyetelan Anda berfungsi. Anda akan melihat "Halo Dunia!" dicetak pada konsol.

Tambahkan pustaka Data Movement ke proyek Anda

  1. Tambahkan versi terbaru pustaka Data Movement ke bagian dependencies file <project-name>.csproj Anda. Pada saat ditulis, versi ini adalah "Microsoft.Azure.Storage.DataMovement": "0.6.2"
  2. Perintah akan muncul untuk memulihkan proyek Anda. Klik tombol "pulihkan". Anda juga dapat memulihkan proyek dari baris perintah dengan mengetik perintah dotnet restore di akar direktori proyek Anda.

Ubah <project-name>.csproj:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Storage.DataMovement" Version="0.6.2" />
        </ItemGroup>
    </Project>

Siapkan kerangka aplikasi Anda

Hal pertama yang kita lakukan adalah mengatur kode "kerangka" aplikasi. Kode ini meminta nama akun Storage dan kunci akun dan menggunakan kredensial tersebut untuk membuat objek CloudStorageAccount. Objek ini digunakan untuk berinteraksi dengan akun Storage dalam semua skenario transfer. Kode ini juga meminta kita untuk memilih jenis operasi transfer yang ingin dieksekusi.

Ubah Program.cs:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.DataMovement;

namespace DMLibSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Enter Storage account name:");
            string accountName = Console.ReadLine();

            Console.WriteLine("\nEnter Storage account key:");
            string accountKey = Console.ReadLine();

            string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
            CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);

            ExecuteChoice(account);
        }

        public static void ExecuteChoice(CloudStorageAccount account)
        {
            Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
            int choice = int.Parse(Console.ReadLine());

            if(choice == 1)
            {
                TransferLocalFileToAzureBlob(account).Wait();
            }
            else if(choice == 2)
            {
                TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
            }
            else if(choice == 3)
            {
                TransferUrlToAzureBlob(account).Wait();
            }
            else if(choice == 4)
            {
                TransferAzureBlobToAzureBlob(account).Wait();
            }
        }

        public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
        {

        }

        public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
        {

        }
    }
}

Unggah file lokal ke blob

Tambahkan metode GetSourcePath dan GetBlob ke Program.cs:

public static string GetSourcePath()
{
    Console.WriteLine("\nProvide path for source:");
    string sourcePath = Console.ReadLine();

    return sourcePath;
}

public static CloudBlockBlob GetBlob(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    Console.WriteLine("\nProvide name of new Blob:");
    string blobName = Console.ReadLine();
    CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

    return blob;
}

Ubah metode TransferLocalFileToAzureBlob:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    await TransferManager.UploadAsync(localFilePath, blob);
    Console.WriteLine("\nTransfer operation complete.");
    ExecuteChoice(account);
}

Kode ini meminta jalur ke file lokal, nama kontainer baru atau yang sudah ada, dan nama blob baru. Metode TransferManager.UploadAsync ini melakukan unggahan menggunakan informasi ini.

Tekan F5 untuk menjalankan aplikasi Anda. Anda dapat memastikan bahwa unggahan tersebut terjadi dengan menampilkan akun Storage Anda dengan Microsoft Azure Storage Explorer.

Atur jumlah operasi paralel

Salah satu fitur yang ditawarkan oleh pustaka Data Movement adalah kemampuan untuk mengatur jumlah operasi paralel untuk meningkatkan throughput transfer data. Secara default, pustaka Data Movement menetapkan jumlah operasi paralel menjadi 8 * jumlah inti pada mesin Anda.

Perlu diingat bahwa terlalu banyak operasi paralel di lingkungan bandwidth rendah dapat membanjiri koneksi jaringan dan benar-benar mencegah operasi untuk selesai. Anda harus bereksperimen dengan pengaturan ini untuk menentukan apa yang paling sesuai dengan bandwidth jaringan yang tersedia.

Mari kita tambahkan beberapa kode yang memungkinkan kita untuk mengatur jumlah operasi paralel. Mari kita juga tambahkan kode berapa lama waktu yang dibutuhkan untuk transfer selesai.

Tambahkan metode SetNumberOfParallelOperations ke Program.cs:

public static void SetNumberOfParallelOperations()
{
    Console.WriteLine("\nHow many parallel operations would you like to use?");
    string parallelOperations = Console.ReadLine();
    TransferManager.Configurations.ParallelOperations = int.Parse(parallelOperations);
}

Ubah metode ExecuteChoice untuk menggunakan SetNumberOfParallelOperations:

public static void ExecuteChoice(CloudStorageAccount account)
{
    Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
    int choice = int.Parse(Console.ReadLine());

    SetNumberOfParallelOperations();

    if(choice == 1)
    {
        TransferLocalFileToAzureBlob(account).Wait();
    }
    else if(choice == 2)
    {
        TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
    }
    else if(choice == 3)
    {
        TransferUrlToAzureBlob(account).Wait();
    }
    else if(choice == 4)
    {
        TransferAzureBlobToAzureBlob(account).Wait();
    }
}

Ubah metode TransferLocalFileToAzureBlob untuk menggunakan timer:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Lacak kemajuan transfer

Mengetahui berapa lama waktu yang dibutuhkan data untuk mentransfer sangatlah membantu. Namun, bisa melihat progres transfer selama operasi transfer akan lebih baik lagi. Untuk mencapai skenario ini, kita perlu membuat objek TransferContext. Objek TransferContext datang dalam dua bentuk: SingleTransferContext dan DirectoryTransferContext. Yang pertama adalah untuk mentransfer satu file dan yang terakhir adalah untuk mentransfer direktori file.

Tambahkan metode GetSingleTransferContext dan GetDirectoryTransferContext ke Program.cs:

public static SingleTransferContext GetSingleTransferContext(TransferCheckpoint checkpoint)
{
    SingleTransferContext context = new SingleTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

public static DirectoryTransferContext GetDirectoryTransferContext(TransferCheckpoint checkpoint)
{
    DirectoryTransferContext context = new DirectoryTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

Ubah metode TransferLocalFileToAzureBlob untuk menggunakan GetSingleTransferContext:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    Console.WriteLine("\nTransfer started...\n");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob, null, context);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Lanjutkan transfer yang dibatalkan

Fitur nyaman lain yang ditawarkan oleh pustaka Data Movement adalah kemampuan untuk melanjutkan transfer yang dibatalkan. Mari kita tambahkan beberapa kode yang memungkinkan kita untuk membatalkan sementara transfer dengan mengetik c, lalu melanjutkan transfer 3 detik kemudian.

Ubah TransferLocalFileToAzureBlob:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.UploadAsync(localFilePath, blob, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadAsync(localFilePath, blob, null, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Sampai sekarang, nilai checkpoint kita selalu berupa null. Sekarang, jika kita membatalkan transfer, kita mengambil titik pemeriksaan terakhir transfer, maka gunakan titik pemeriksaan baru ini dalam konteks transfer kita.

Transfer direktori lokal ke penyimpanan Blob

Akan mengecewakan jika pustaka Data Movement hanya dapat mentransfer satu file pada satu waktu. Untungnya, ini tidak terjadi. Pustaka Data Movement menyediakan kemampuan untuk mentransfer direktori file dan semua subdirektorinya. Mari kita tambahkan beberapa kode untuk melakukan hal itu.

Pertama, tambahkan metode GetBlobDirectory ke Program.cs:

public static CloudBlobDirectory GetBlobDirectory(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container. This can be a new or existing Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    CloudBlobDirectory blobDirectory = container.GetDirectoryReference("");

    return blobDirectory;
}

Kemudian, ubah TransferLocalDirectoryToAzureBlobDirectory:

public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
{
    string localDirectoryPath = GetSourcePath();
    CloudBlobDirectory blobDirectory = GetBlobDirectory(account);
    TransferCheckpoint checkpoint = null;
    DirectoryTransferContext context = GetDirectoryTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    UploadDirectoryOptions options = new UploadDirectoryOptions()
    {
        Recursive = true
    };

    try
    {
        task = TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetDirectoryTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Ada beberapa perbedaan antara metode ini dengan metode mengunggah satu file. Kita sekarang menggunakan metode TransferManager.UploadDirectoryAsync dan getDirectoryTransferContext metode telah dibuat. Selain itu, kita sekarang memberikan nilai options untuk unggahan, yang memungkinkan kita untuk menunjukkan bahwa kita ingin menyertakan subdirektori dalam unggahan.

Salin file dari URL ke blob

Sekarang, mari kita tambahkan kode yang memungkinkan kita untuk menyalin file dari URL ke Azure Blob.

Ubah TransferUrlToAzureBlob:

public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
{
    Uri uri = new Uri(GetSourcePath());
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Satu kasus penggunaan penting untuk fitur ini adalah ketika Anda perlu memindahkan data dari layanan cloud lain (misalnya AWS) ke Azure. Selama Anda memiliki URL yang memberi akses ke sumber daya, Anda dapat dengan mudah memindahkan sumber daya tersebut ke Azure Blobs dengan menggunakan metode TransferManager.CopyAsync tersebut. Metode ini juga memperkenalkan parameter CopyMethod . Tabel berikut ini memperlihatkan opsi yang tersedia untuk parameter ini:

Nama anggota Nilai Deskripsi
SyncCopy 0 Unduh data dari sumber ke memori, dan unggah data dari memori ke tujuan. Saat ini hanya tersedia untuk menyalin dari satu sumber daya Azure Storage ke sumber daya lainnya.
ServiceSideAsyncCopy 1 Kirim permintaan penyalinan awal ke Azure Storage untuk membiarkannya melakukan penyalinan; pantau kemajuan operasi salin hingga salinan selesai.
ServiceSideSyncCopy 2 Salin konten setiap gugus dengan Masukkan Blok Dari URL, Tambahkan Blok Dari URL, atau Masukkan Halaman Dari URL.

Menyalin blob

Fitur lain yang disediakan secara unik oleh pustaka Data Movement adalah kemampuan untuk menyalin dari satu sumber daya Azure Storage ke sumber daya lainnya.

Ubah TransferAzureBlobToAzureBlob:

public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
{
    CloudBlockBlob sourceBlob = GetBlob(account);
    CloudBlockBlob destinationBlob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Dalam contoh ini, kita mengatur parameter boolean TransferManager.CopyAsync ke CopyMethod.SyncCopy untuk menunjukkan bahwa kita ingin melakukan salinan sinkron. Ini berarti bahwa sumber daya diunduh ke mesin lokal terlebih dahulu, kemudian diunggah ke Azure Blob. Opsi salinan sinkron adalah cara yang bagus untuk memastikan bahwa operasi salinan Anda memiliki kecepatan yang konsisten. Sebaliknya, kecepatan salinan sisi server asinkron tergantung pada bandwidth jaringan yang tersedia di server, yang dapat berfluktuasi. Namun, salinan sinkron dapat menghasilkan biaya keluar tambahan dibandingkan dengan salinan asinkron. Pendekatan yang disarankan adalah menggunakan salinan sinkron di Azure VM yang berada di wilayah sama dengan akun penyimpanan sumber Anda untuk menghindari biaya keluar.

Aplikasi pergerakan data sekarang selesai. Sampel kode lengkap tersedia di GitHub.

Langkah berikutnya

Dokumentasi referensi pustaka Data Movement Azure Storage.

Tip

Mengelola sumber daya Azure Blob Storage dengan Storage Explorer. Azure Storage Explorer adalah aplikasi mandiri gratis dari Microsoft yang memungkinkan Anda mengelola sumber daya penyimpanan Azure Blob. Menggunakan Azure Storage Explorer, Anda dapat membuat, membaca, memperbarui, dan menghapus kontainer blob dan blob secara visual, serta mengelola akses ke kontainer dan gumpalan gumpalan Anda.