前回のブログから時間が空いてしまったが、今日はブロブ・ストレージについてのTIPSを紹介したいと思う。前提知識としては以下が必要になる点にご注意いただきたい*1。
- ブロブ・ストレージには、ブロックブロブとページブロブが存在する
- ドライブ(Windows Azureストレージ・サービスの一機能)は、ページブロブを利用して実現されている
- ブロブ・ストレージには、「Lease Blob」「Snapshot Blob」「Copy Blob」と呼ばれる機能が存在する
ドライブについての疑問点
先述したとおり、ドライブはページブロブを利用して実現している。ドライブについて調べたところ、 http://www.microsoft.com/japan/windowsazure/whitepapers/ から入手可能な「Windows Azure ドライブ – NTFS クラウド アプリケーションのための永続的なドライブを利用する 」に以下の記述が存在した。
Windows Azure ページ ブロブでは、Windows Azure ドライブで利用する次の機能もサポートしています。
• Lease Blob – ブロブに対するリースの排他的な書き換えが可能になります。これにより、リース ID を知っているクライアントが、そのリース期間中にブロブを更新できる唯一のクライアントとなります。リースを更新する機能も提供されるため、長期リースも可能です。Lease Blob は、Windows Azure ドライブからマウントされた NTFS 形式のページ ブロブに対する排他的アクセスを保持するために使用されます。つまり、ページ ブロブは一度に 1 つの VM インスタンスによってのみマウント可能です。
• Snapshot Blob –読み取り専用バージョンのブロブを作成できます。この機能を利用して、ブロブのバックアップを作成したり、バージョン管理を行うことができます。スナップショットは読み取り専用であり、課金の対象となるのはユニーク ページのみです。スナップショット間で共有されるページや、ページの生成元のブロブについては、追加のストレージ料金は発生しません。
• Copy Blob – ストレージ アカウント内で 1 つのブロブ名から新しいブロブ名に、ブロブまたはスナップショットをコピーすることができます。新しいブロブにスナップショットをコピーする場合、そのブロブは読み取り/書き込みが可能です。
サンプルアプリケーションを利用して検証
以下のサンプルコードを利用してアプリケーションを実行したところ、Snapshot BlobとCopy Blobは問題なく実行できた。どうやらホワイトペーパーの記述の仕方が悪いだけだったらしい。
- HomeController.Copy メソッド(HomeControllerc.sの抜粋)
public ActionResult Copy(string uri) { try { //ブロブの参照を取得 var cloudBlob = blobClient.GetBlobReference(uri); //コピー先ブロブの参照を取得 var copyCloudBlob = blobClient.GetBlobReference(uri + "copy"); //ブロブのコピーを作成 copyCloudBlob.CopyFromBlob(cloudBlob, new BlobRequestOptions() { CopySourceAccessCondition = AccessCondition.None }); TempData["message"] = "コピーの作成に成功しました"; } catch (StorageException) { TempData["message"] = "コピーの作成に失敗しました"; } //一覧ページに戻る return RedirectToAction("Index"); }
- HomeController.SnapShot メソッド(HomeControllerc.sの抜粋)
public ActionResult SnapShot(string uri) { try { //ブロブの参照を取得 var cloudBlob = blobClient.GetBlobReference(uri); //ブロブのスナップショットを作成 cloudBlob.CreateSnapshot(new BlobRequestOptions() { CopySourceAccessCondition = AccessCondition.None }); TempData["message"] = "スナップショットの作成に成功しました"; } catch (StorageException) { TempData["message"] = "スナップショットの作成に失敗しました"; } //一覧ページに戻る return RedirectToAction("Index"); }