Статьи

Как скопировать корзину Amazon S3 в хранилище BLOB-объектов Azure с помощью «Копировать BLOB-объект»

Вчера я написал сообщение в блоге о том, как можно скопировать объект (файл) из Amazon S3 в хранилище BLOB-объектов Windows Azure, используя улучшенную функциональность « Копировать BLOB-объекты ». Вы можете прочитать этот пост здесь: http://gauravmantri.com/2012/06/14/how-to-copy-an-object-from-amazon-s3-to-windows-azure-blob-storage-using-copy -блоб / . В конце этого поста я упомянул, что функциональность, описанную в этом посте, может быть расширена для копирования всех объектов из корзины в Amazon S3 в хранилище BLOB-объектов Windows Azure, и, если тело не сравнится со мной, я напишу пример приложения для это. Вот и я с этим Улыбка.

Я достаточно подробно говорил об этой функции «Копировать BLOB» в моих предыдущих постах, поэтому мы сразу перейдем к коду (Nuff Talking, я думаю !!!) Улыбка. Я создал небольшое консольное приложение для копирования всех объектов из Bucket в Blob Container.

Предпосылки

Как и в предыдущем посте, есть несколько вещей, которые вам нужно сделать, прежде чем вы сможете запустить код ниже:

  1. Создайте новую учетную запись хранения . Обратите внимание, что эта функция будет работать только в том случае, если ваша учетная запись хранения будет создана после 7 июня 2012 года . Поэтому, если у вас есть учетная запись хранения, которая была создана после этой даты, вы можете использовать эту учетную запись хранения или перейти на новый и улучшенный портал Windows Azure и создать новую учетную запись хранения. Имейте под рукой имя вашей учетной записи и ключ.
  2. Получить последнюю версию клиентской библиотеки хранилища . На момент написания этого блога официально выпущенная версия SDK была 1.7. К сожалению, эта функция недоступна в этой версии. Вам необходимо получить версию 1.7.1, которую вы можете получить с GitHub . Получите исходный код и скомпилируйте его.
  3. Исходные объекты / большие двоичные объекты в Amazon S3 Bucket общедоступны . Как упоминалось в моем предыдущем посте, функция «Копировать большие двоичные объекты» позволяет копировать большие двоичные объекты из-за пределов Windows Azure, которые являются общедоступными. Таким образом, в случае Amazon S3 ваши объекты в корзинах должны иметь как минимум разрешение READ для них анонимному пользователю.
  4. Amazon SDK для .Net . Вам необходимо загрузить Amazon SDK для .Net, который можно загрузить с их веб-сайта по адресу http://aws.amazon.com/sdkfornet/ .
  5. Подготовьте учетные данные Amazon : вам нужно иметь готовые Amazon AccessKey и SecretKey, поскольку они используются для вывода списка объектов из корзины в Amazon S3.

Код

Код действительно прост и показан ниже. Обратите внимание, что приведенный ниже код предназначен только для демонстрации. Не стесняйтесь изменять код в соответствии с вашими требованиями.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Transfer;
using Amazon.S3.Util;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.Globalization;
 
namespace CopyAmazonBucketToBlobStorage
{
    class Program
    {
        //Windows Azure Storage Account Name
        private static string azureStorageAccountName = "<Your Windows Azure Storage Account Name>";
        //Windows Azure Storage Account Key
        private static string azureStorageAccountKey = "<Your Windows Azure Storage Account Key>";
        //Windows Azure Blob Container Name (Target)
        private static string azureBlobContainerName = "<Windows Azure Blob Container Name>";
        //Amazon Access Key
        private static string amazonAccessKey = "<Your Amazon Access Key>";
        //Amazon Secret Key
        private static string amazonSecretKey = "<Your Amazon Secret Key>";
        //Amazon Bucket Name (Source)
        private static string amazonBucketName = "<Amazon Bucket Name>";
        private static string objectUrlFormat = "https://{0}.s3.amazonaws.com/{1}";
        //This dictionary will keep track of progress. The key would be the URL of the blob.
        private static Dictionary<string, CopyBlobProgress> CopyBlobProgress;
 
        static void Main(string[] args)
        {
            //Create a reference of Windows Azure Storage Account
            CloudStorageAccount azureCloudStorageAccount = new CloudStorageAccount(new StorageCredentialsAccountAndKey(azureStorageAccountName, azureStorageAccountKey), true);
            //Get a reference of Blob Container where files (objects) will be copied.
            var blobContainer = azureCloudStorageAccount.CreateCloudBlobClient().GetContainerReference(azureBlobContainerName);
            //Create blob container if needed
            Console.WriteLine("Trying to create the blob container....");
            blobContainer.CreateIfNotExist();
            Console.WriteLine("Blob container created....");
            //Create a reference of Amazon Client
            AmazonS3Client amazonClient = new AmazonS3Client(amazonAccessKey, amazonSecretKey);
            //Initialize dictionary
            CopyBlobProgress = new Dictionary<string, CopyBlobProgress>();
 
            string continuationToken = null;
            bool continueListObjects = true;
            //Since ListObjects return a maximum of 1000 objects in a single call
            //We'll call this function again and again till the time we fetch the
            //list of all objects.
            while (continueListObjects)
            {
                 
                ListObjectsRequest requestToListObjects = new ListObjectsRequest()
                {
                    BucketName = amazonBucketName,
                    Marker = continuationToken,
                    MaxKeys = 100,
                };
                Console.WriteLine("Trying to list objects from S3 Bucket....");
                //List objects from Amazon S3
                var listObjectsResponse = amazonClient.ListObjects(requestToListObjects);
                //Get the list of objects
                var objectsFetchedSoFar = listObjectsResponse.S3Objects;
                Console.WriteLine("Object listing complete. Now starting the copy process....");
                //See if more objects are available. We'll first process the objects fetched
                //and continue the loop to get next set of objects.
                continuationToken = listObjectsResponse.NextMarker;
                foreach (var s3Object in objectsFetchedSoFar)
                {
                    string objectKey = s3Object.Key;
                    //Since ListObjects returns both files and folders, for now we'll skip folders
                    //The way we'll check this is by checking the value of S3 Object Key. If it
                    //end with "/" we'll assume it's a folder.
                    if (!objectKey.EndsWith("/"))
                    {
                        //Construct the URL to copy
                        string urlToCopy = string.Format(CultureInfo.InvariantCulture, objectUrlFormat, amazonBucketName, objectKey);
                        //Create an instance of CloudBlockBlob
                        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(objectKey);
                        var blockBlobUrl = blockBlob.Uri.AbsoluteUri;
                        if (!CopyBlobProgress.ContainsKey(blockBlobUrl))
                        {
                            CopyBlobProgress.Add(blockBlobUrl, new CopyBlobProgress()
                                {
                                    Status = CopyStatus.NotStarted,
                                });
                            //Start the copy process. We would need to put it in try/catch block
                            //as the copy from Amazon S3 will only work with publicly accessible objects.
                            try
                            {
                                Console.WriteLine(string.Format("Trying to copy \"{0}\" to \"{1}\"", urlToCopy, blockBlobUrl));
                                blockBlob.StartCopyFromBlob(new Uri(urlToCopy));
                                CopyBlobProgress[blockBlobUrl].Status = CopyStatus.Started;
                            }
                            catch (Exception exception)
                            {
                                CopyBlobProgress[blockBlobUrl].Status = CopyStatus.Failed;
                                CopyBlobProgress[blockBlobUrl].Error = exception;
                            }
                        }
                    }
                }
                Console.WriteLine("");
                Console.WriteLine("==========================================================");
                Console.WriteLine("");
                Console.WriteLine("Checking the status of copy process....");
                //Now we track the progress
                bool checkForBlobCopyStatus = true;
                while (checkForBlobCopyStatus)
                {
                    //List blobs in the blob container
                    var blobsList = blobContainer.ListBlobs(true, BlobListingDetails.Copy);
                    foreach (var blob in blobsList)
                    {
                        var tempBlockBlob = blob as CloudBlob;
                        var copyStatus = tempBlockBlob.CopyState;
                        if (CopyBlobProgress.ContainsKey(tempBlockBlob.Uri.AbsoluteUri))
                        {
                            var copyBlobProgress = CopyBlobProgress[tempBlockBlob.Uri.AbsoluteUri];
                            if (copyStatus != null)
                            {
                                Console.WriteLine(string.Format("Status of \"{0}\" blob copy....", tempBlockBlob.Uri.AbsoluteUri, copyStatus.Status));
                                switch (copyStatus.Status)
                                {
                                    case Microsoft.WindowsAzure.StorageClient.CopyStatus.Aborted:
                                        if (copyBlobProgress != null)
                                        {
                                            copyBlobProgress.Status = CopyStatus.Aborted;
                                        }
                                        break;
                                    case Microsoft.WindowsAzure.StorageClient.CopyStatus.Failed:
                                        if (copyBlobProgress != null)
                                        {
                                            copyBlobProgress.Status = CopyStatus.Failed;
                                        }
                                        break;
                                    case Microsoft.WindowsAzure.StorageClient.CopyStatus.Invalid:
                                        if (copyBlobProgress != null)
                                        {
                                            copyBlobProgress.Status = CopyStatus.Invalid;
                                        }
                                        break;
                                    case Microsoft.WindowsAzure.StorageClient.CopyStatus.Pending:
                                        if (copyBlobProgress != null)
                                        {
                                            copyBlobProgress.Status = CopyStatus.Pending;
                                        }
                                        break;
                                    case Microsoft.WindowsAzure.StorageClient.CopyStatus.Success:
                                        if (copyBlobProgress != null)
                                        {
                                            copyBlobProgress.Status = CopyStatus.Success;
                                        }
                                        break;
                                }
                            }
                        }
                    }
                    var pendingBlob = CopyBlobProgress.FirstOrDefault(c => c.Value.Status == CopyStatus.Pending);
                    if (string.IsNullOrWhiteSpace(pendingBlob.Key))
                    {
                        checkForBlobCopyStatus = false;
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(1000);
                    }
                }
 
                if (string.IsNullOrWhiteSpace(continuationToken))
                {
                    continueListObjects = false;
                }
                Console.WriteLine("");
                Console.WriteLine("==========================================================");
                Console.WriteLine("");
 
            }
            Console.WriteLine("Process completed....");
            Console.WriteLine("Press any key to terminate the program....");
            Console.ReadLine();
        }
    }
 
    public class CopyBlobProgress
    {
        public CopyStatus Status
        {
            get;
            set;
        }
 
        public Exception Error
        {
            get;
            set;
        }
    }
 
    public enum CopyStatus
    {
        NotStarted,
        Started,
        Aborted,
        Failed,
        Invalid,
        Pending,
        Success
    }
}

Код довольно прост. Что приложение делает:

  1. Создает контейнер больших двоичных объектов в хранилище Windows Azure (при необходимости).
  2. Перечисляет объекты из корзины Amazon S3. Обратите внимание, что Amazon S3 будет возвращать до 1000 объектов одновременно. Он возвращает вам «Следующий маркер», если доступно больше объектов для извлечения. Вам понадобится использовать этот «маркер следующего», чтобы получить следующий набор объектов. В своем блоге я несколько дней назад сравнивал хранилище BLOB-объектов Windows Azure и Amazon S3, где я говорил об этом. Вы можете прочитать об этом там: http://gauravmantri.com/2012/05/09/comparing-windows-azure-blob-storage-and-amazon-simple-storage-service-s3part-i/
  3. Для каждого возвращаемого объекта создается URL-адрес объекта, а затем передается функция «Копировать BLOB-объекты», передавая этот URL-адрес.
  4. Затем приложение проверяет состояние операций копирования. После завершения всех ожидающих операций копирования шаги 2-4 повторяются до тех пор, пока все объекты не будут извлечены из корзины Amazon S3 и скопированы.

Я использовал Bucket Explorer для управления содержимым в Amazon S3. Вот как содержимое выглядит там:

образ

После копирования я вижу эти объекты в хранилище BLOB-объектов Windows Azure с помощью Cloud Storage Studio .

образ

Резюме

Как вы видели, Windows Azure значительно упростила процесс переноса данных в Windows Azure. Если вы планируете перейти с другой облачной платформы на Windows Azure и несколько беспокоитесь о проблемах при подключении, это один из шагов к уменьшению этого трения.

Я создал простой пример, в котором просто скопировал содержимое корзины из Amazon S3 в контейнер больших двоичных объектов в хранилище больших двоичных объектов Windows Azure.

Я надеюсь, что вы нашли эту информацию полезной. Если вы считаете, что я допустил некоторые ошибки и предоставил неверную информацию, пожалуйста, исправьте меня, предоставив комментарий. Я исправлю эти проблемы как можно скорее.

Следите за новостями о Windows Azure. Пока!!!

 

КОНЕЦ