2012年6月7日以降の重要な革新の1つは、Copy Blobの改善でした。 この記事を書くとき、私は開発チームの資料を使用しました。これはここにあります: http : //blogs.msdn.com/b/windowsazurestorage/archive/2012/06/12/introducing-asynchronous-cross-account-copy-blob.aspx 。 私が注目したのは、 ブロブ の コピー 機能を 使用すると 、 Windows Azureの 外部からブロブをコピーできることです( 公開されている場合)。 つまり、Windows Azureに存在する必要はありません。
これはとてもクールです!!!
これにより、座って考えるようになりました。つまり、現在、ファイルをWindows Azure BLOBストレージに転送するオプションがあり、ほとんどの作業はプラットフォーム自体で行われています。 だから、ファイル(オブジェクト)をAmazon S3からWindows Azure BLOBストレージにコピーしようとする簡単なアプリケーションを書くことを考えました。 それは数時間で完了したことが判明しました(S3には特定の時点までアカウントがなかったため、それぞれ、ストアのクライアントライブラリの知識は多少制限されていました)。 しかし、私が言いたいこと: それは本当に機能し、本当に簡単です。
どうしてですか?
1つのクラウドプロバイダーからWindows Azure BLOBストレージにコンテンツをコピーする必要があるいくつかのシナリオを考えました。
Windows Azure Blob Storageは本当に競争力があります
すべての新機能と低価格を備えたWindows Azureストレージは、クラウドストレージサービスを提供する他のクラウドプロバイダーに代わる真の選択肢です。 これが、プロバイダーからWindows Azureストレージに切り替える理由の1つかもしれません。 または、常に移動したかったのですが、ストレージからデータを転送する方法がわかりませんでした。 新しいCopy Blob機能により、この問題を非常に簡単に解決できます。
既存のデータのバックアップとしてのWindows Azure BLOBストレージ
クラウドストレージからデータをバックアップする場所としてBLOBストレージを簡単に使用できるようになりました。 これは以前は可能でしたが、大量のコードが必要なため、かなり苦痛なプロセスでした。
最新のイノベーションにより、非常に簡単になりました。 これで、ソースからWindows Azureのblobにバイトをコピーするコードを記述する必要がなくなりました。 これらはすべてプラットフォームによって行われます。 ソースがどこにあり、どこに転送する必要があるかを言うだけで、コピー機能を呼び出すだけです。
コードを見せてください!!!
OK、十分な話です! コードを見てみましょう。 簡単なコンソールアプリケーション(以下のコード)を作成しましたが、それに進む前に、さらにいくつかのポイントについて説明したいと思います。 。
前提条件
コードを実行する前に、いくつかのアクションを実行する必要があります。
1. ボールトアカウントの作成:新しい機能は、ボールトアカウントが2012年6月7日以降に作成された場合にのみ機能することに注意してください(理由- 注 、翻訳者注を参照)。
2. リポジトリのクライアントライブラリの最新バージョンをダウンロードします。執筆時点で、公式にリリースされたライブラリのバージョンは1.7です。 残念ながら、新しい機能は機能しないため、 GitHubから1.7.1をダウンロードする必要があります 。 ソースをダウンロードしてコンパイルします。
3. オブジェクト/ブロブのパブリック可用性を確認します。 ブロブのコピー機能は、Windows Azureの外部からパブリックにアクセス可能なブロブのみをコピーできます。 したがって、 Amazon S3の場合、オブジェクトに少なくとも匿名ユーザーの読み取りアクセス許可があることを確認する必要があります。
コード
上で言ったように、コードは非常に簡単です。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; namespace CopyAmazonObjectToBlobStorage { class Program { private static string azureStorageAccountName = “"; private static string azureStorageAccountKey = ""; private static string azureBlobContainerName = ""; private static string amazonObjectUrl = ""; private static string azureBlobName = ""; static void Main(string[] args) { CloudStorageAccount csa = new CloudStorageAccount(new StorageCredentialsAccountAndKey(azureStorageAccountName, azureStorageAccountKey), true); CloudBlobClient blobClient = csa.CreateCloudBlobClient(); var blobContainer = blobClient.GetContainerReference(azureBlobContainerName); Console.WriteLine("Trying to create the blob container...."); blobContainer.CreateIfNotExist(); Console.WriteLine("Blob container created...."); var blockBlob = blobContainer.GetBlockBlobReference(azureBlobName); Console.WriteLine("Created a reference for block blob in Windows Azure...."); Console.WriteLine("Blob Uri: " + blockBlob.Uri.AbsoluteUri); Console.WriteLine("Now trying to initiate copy...."); blockBlob.StartCopyFromBlob(new Uri(amazonObjectUrl), null, null, null); Console.WriteLine("Copy started...."); Console.WriteLine("Now tracking blob's copy progress...."); bool continueLoop = true; while (continueLoop) { Console.WriteLine(""); Console.WriteLine("Fetching lists of blobs in Azure blob container...."); var blobsList = blobContainer.ListBlobs(true, BlobListingDetails.Copy); foreach (var blob in blobsList) { var tempBlockBlob = (CloudBlob) blob; var destBlob = blob as CloudBlob; if (tempBlockBlob.Name == azureBlobName) { var copyStatus = tempBlockBlob.CopyState; if (copyStatus != null) { Console.WriteLine("Status of blob copy...." + copyStatus.Status); var percentComplete = copyStatus.BytesCopied / copyStatus.TotalBytes; Console.WriteLine("Total bytes to copy...." + copyStatus.TotalBytes); Console.WriteLine("Total bytes copied...." + copyStatus.BytesCopied); if (copyStatus.Status != CopyStatus.Pending) { continueLoop = false; } } } } Console.WriteLine(""); Console.WriteLine("=============================================="); System.Threading.Thread.Sleep(1000); } Console.WriteLine("Process completed...."); Console.WriteLine("Press any key to terminate the program...."); Console.ReadLine(); } } }
コードは非常に簡単です。 対処方法:Windows Azureストレージにアクセスするための資格情報とソースBLOB URL(Amazon S3内)を指定します。 Windows AzureでBLOBコンテナーを作成し、ソースURLからBLOBのコピーを開始します。 コピー要求を送信した後、アプリケーションはコピープロセスを監視するだけです。 ご覧のとおり、ソースからレシーバにバイトをコピーするコードは1行ではありません。 これらはすべてWindows Azureによって行われます。
Amazon S3のオブジェクトは次のようになります。
オブジェクトがコピーされた後、 Cloud Storage Studioを使用してWindows Azure BLOBストレージに表示されます。
ご覧のとおり、Windows Azureにはデータを簡単に転送する機能があります。 別のクラウドプラットフォームからWindows Azureへの移行を検討しているが、関連するあらゆる種類の問題を心配している場合、1つの問題が少なくなりました。
単一のファイルをAmazon S3からWindows Azure BLOBストレージにコピーする簡単な例を作成しました。 この機能を拡張して、すべてのオブジェクトをAmazon S3のごみ箱からWindows Azure BLOBコンテナーにコピーできます。 次の記事に移りましょう-Copy Blobを使用してAmazon S3からWindows Azure BLOBストレージにカートをコピーする方法。
前提条件
コードを実行する前に、いくつかのアクションを実行する必要があります。
- オブジェクト/ BLOBのパブリック可用性を確認します 。Blobのコピー機能は、Windows Azureの外部からパブリックにアクセス可能なBLOBのみをコピーできます。 したがって、 Amazon S3の場合、オブジェクトに少なくとも匿名ユーザーの読み取りアクセス許可があることを確認する必要があります。
- ボールトアカウントを作成する:新しい機能は、ボールトアカウントが2012年6月7日以降に作成された場合にのみ機能することに注意してください(理由-翻訳者メモを参照してください)。
- リポジトリのクライアントライブラリの最新バージョンをダウンロードします。執筆時点では、ライブラリの公式バージョンは1.7です。 残念ながら、新しい機能は機能しないため、 GitHubから1.7.1をダウンロードする必要があります 。 ソースをダウンロードしてコンパイルします。
- .Net用Amazon SDK : .Net用Amazon SDKを Amazon AWSからダウンロードする必要があります。
- 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 { private static string azureStorageAccountName = “”; private static string azureStorageAccountKey = “”; private static string azureBlobContainerName = “”; private static string amazonAccessKey = “”; private static string amazonSecretKey = “”; private static string amazonBucketName = “”; private static string objectUrlFormat = “https://{0}.s3.amazonaws.com/{1}”; private static Dictionary<string, CopyBlobProgress> CopyBlobProgress; static void Main(string[] args) { // Windows Azure CloudStorageAccount azureCloudStorageAccount = new CloudStorageAccount(new StorageCredentialsAccountAndKey(azureStorageAccountName, azureStorageAccountKey), true); // , . var blobContainer = azureCloudStorageAccount.CreateCloudBlobClient().GetContainerReference(azureBlobContainerName); // , . Console.WriteLine(«Trying to create the blob container....»); blobContainer.CreateIfNotExist(); Console.WriteLine(«Blob container created....»); // Amazon AmazonS3Client amazonClient = new AmazonS3Client(amazonAccessKey, amazonSecretKey); // CopyBlobProgress = new Dictionary<string, CopyBlobProgress>(); string continuationToken = null; bool continueListObjects = true; // ListObjects 1000 , // , . while (continueListObjects) { ListObjectsRequest requestToListObjects = new ListObjectsRequest() { BucketName = amazonBucketName, Marker = continuationToken, MaxKeys = 100, }; Console.WriteLine(«Trying to list objects from S3 Bucket....»); // Amazon S3 var listObjectsResponse = amazonClient.ListObjects(requestToListObjects); // var objectsFetchedSoFar = listObjectsResponse.S3Objects; Console.WriteLine(«Object listing complete. Now starting the copy process....»); //, . , continuation token. continuationToken = listObjectsResponse.NextMarker; foreach (var s3Object in objectsFetchedSoFar) { string objectKey = s3Object.Key; //ListObjects , , S3 Object Key. /, . if (!objectKey.EndsWith(«/»)) { // URL string urlToCopy = string.Format(CultureInfo.InvariantCulture, objectUrlFormat, amazonBucketName, objectKey); // CloudBlockBlob CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(objectKey); var blockBlobUrl = blockBlob.Uri.AbsoluteUri; if (!CopyBlobProgress.ContainsKey(blockBlobUrl)) { CopyBlobProgress.Add(blockBlobUrl, new CopyBlobProgress() { Status = CopyStatus.NotStarted, }); // . try/catch // Amazon S3 . 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....»); // bool checkForBlobCopyStatus = true; while (checkForBlobCopyStatus) { // 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 } }
コードは非常に簡単です。 アプリケーション:
- 必要に応じて、Windows Azureストレージにblobコンテナーを作成します。
- Amazon S3バケットからオブジェクトのリストを取得します。 Amazon S3は1回の関数呼び出しで最大1000個のオブジェクトを返すことができます。そうでない場合は、エンティティの次のサブセットを示すマーカーを取得するために使用される継続トークンが返されます。
- 返されたオブジェクトごとに、URLが生成され、これはBlobのコピー機能に使用されます。
- アプリケーションは、コピープロセスのステータスを確認します。 すべてのコピープロセスの終了後、すべてのオブジェクトがコピーされるまで手順2〜4が繰り返されます。
Amazon S3のコンテンツを管理するために、次のステータスを示すBucket Explorerを使用しました。
コピーが完了すると、 Cloud Storage StudioはWindows Azure BLOBストレージの次のステータスを示しました。
まとめ
Amazon S3のごみ箱からすべてのコンテンツをWindows Azure BLOBストレージにコピーする簡単な例を作成しました。
翻訳者から再開
APIの新機能に関するGauravaの感情は理解できます。正直なところ、2012年6月7日まで、ストレージサービスを使用するためのAPIは機能面で不十分でした。WindowsAzureとAmazonストレージの比較に関するGauravaの翻訳記事シリーズで証明されているように 現在、Windows Azureストレージをバックアップの同じ場所として使用する機能、および冗長性の程度を調整する機能(2つのタイプが利用可能になっている)でさえ、おそらく大変動の結果を回避し、本当に耐えられない(:)サービスを作成します。
翻訳者からのメモ
Windows Azureストレージサービスは、各操作(サービス)の特定のバージョンを示す要求を受け入れることができ、開発者はx-ms-versionヘッダーを使用してバージョンを指定できます。 当然、異なるバージョンの機能や作業のメカニズム(概念ではありません)は異なる場合があります。
SASパラメーターの解釈に使用するバージョンをblobサービスが決定するシステムのルールを考慮する必要があります。
1.要求にx-ms-versionヘッダーが含まれるが、signedversionがない場合、バージョン2009-07-17がSASパラメーターの解釈に使用され、操作はx-ms-versionで指定されたバージョンを使用します。
2.要求にx-ms-versionヘッダーがなく、signedversionがないが、アカウント所有者がSet Blob Service Properties操作を使用してサービスのバージョンをインストールした場合、バージョン2009-07-07がSASパラメーターの解釈に使用されますが、指定されたバージョンが操作に使用されますサービスのアカウント所有者。
3.要求にx-ms-versionヘッダーがない場合、signedversionがなく、アカウント所有者はサービスバージョンをインストールしませんでした。バージョン2009-07-17はSASパラメーターの解釈に使用されます。 コンテナーにパブリック権限があり、バージョン2009-09-19(またはそれ以降)を使用したSet Container ACL操作を使用してアクセス制限が設定されている場合、バージョン2009-09-19が操作に使用されます。
バージョンとそれらがサポートする機能に関する詳細情報 。
Gaurav Mantriによる関連記事の翻訳:
オブジェクト
かご