読者です 読者をやめる 読者になる 読者になる

とある技術の開発日記

Diary of irregular phrase programmer

WindowsAzureモバイルサービスのスケジュールでスナップショットを取得する方法

Azureのモバイルサービスにはスケジューラが用意されいるため定期ジョブが実行できます。

参考:蒼の王座 Windows Azureで定期ジョブを実行する方法

このスケジューラのスクリプトを利用してBlobのスナップショットを作成&復元を行ってみました。

1.ストレージ内に適当なBlobを作成します

今回はスケジューラのスクリプトで以下のコードを実行し、ファイルを作成しました。

function testJob() {

  console.log("starting job testJob....");

  var azure = require('azure');
  var blobService = azure.createBlobService('アカウント名',
        'アクセスキー',
        'http://アカウント名.blob.core.windows.net/');

  var containerName = 'testblob';
  var blob = 'sample.txt';

  createSampleBlob();

  function createSampleBlob () {
    blobService.createBlockBlobFromText(containerName, blob, 'HelloWorld', function(error) {
      if (error) {
        console.log('Error! createSampleBlob :' + error);
      } else {
        console.log('Created SampleBlob');
      }
    });
  }
}

結果はモバイルサービスのログから確認できます。
f:id:airish9:20130623184015j:plain

ストレージの管理画面からでもファイルが作成されている事が解ります。
f:id:airish9:20130623184122j:plain

Blobの内容を見てみるとこんな感じ
f:id:airish9:20130623184219j:plain

2.Blobのスナップショットを作成します
function createSnapshot () {

  blobService.createContainerIfNotExists(containerName, {publicAccessLevel : 'blob'}, function(error) {
    if (error) {
      console.log('Error! CreateContainer : ' + error);
    }
    else {
      blobService.createBlobSnapshot(containerName, blob, function(error2, snapshot) {
        if (error2) {
          console.log('Error CreateSnapshot : ' + error2);
        }
        else {
          console.log('Created Snapshot snapshotId is : ' + snapshot);
        }
      });
    }
  });
}

createBlobSnapshotメソッドを利用してBlobのスナップショットを作成しています。
スナップショットはAzureの管理画面からは確認できないため、listBlobsメソッドを使用して
snapshotの確認とsnapshotIDを取得します。

blobService.listBlobs(containerName, { include: 'snapshots' }, function(error, blobResults) {
  if (error) {
    console.log(error);
  } else {
    console.log('Listing the blobs under the container ' + containerName);

    blobResults.forEach(function (blobResult) {
      console.log('  blob: ' + blobResult.name + '  snapshot: ' + blobResult.snapshot);
    });
  }
});

スケジューラのログを参照するとスナップショットが作成できている事が解ります。
f:id:airish9:20130623184705j:plain

3.Blobの内容を更新する

sample.txtの中身をUpdateHelloWorldに書き換えます。

blobService.createBlockBlobFromText(containerName, blob, 'UpdateHelloWorld', function(error) {
  if (error) {
    console.log('Error! updateSampleBlob :' + error);
  } else {
    console.log('Updated SampleBlob');
  }
});

Blobの内容を見てみると変更されている事が解ります。
f:id:airish9:20130623184903j:plain

4.スナップショットを復元する
var snapshot = '2013-06-23T07:22:30.0040628Z';
blobService.copyBlob(containerName, blob, containerName, blob, {snapshotId: snapshot}, function (error) {
  if (error) {
    console.log('Error copySnapshot : ' + error);
  } else {
    console.log('Copy snapshot ' + blob + ' ' + snapshot + '  => ' + blob);
  }
});

copyBlobメソッドでsnapshotIdを指定することでスナップショットから復元ができます。
Blobの内容を見てみるとスナップショットが復元されている事が確認できます。
f:id:airish9:20130623185116j:plain

このようにcreateBlobSnapshotとcopyBlobを使用する事でバックアップ&リストアを
モバイルサービス経由でスケジューリングする事が可能です。