【Azure】VHD(BLOB)をリージョンの違うストレージアカウント間でコピーする

Azureの日本リージョンでのサービスが開始したので、東アジアに置いてあったvhdファイルイメージを、東日本のストレージアカウントに移動しましたので、その対応方法書いてみます。

異なるリージョンにあるVHDファイルを基に仮想マシンを追加しようとしたら以下のようなエラーが出ました。

BLOBのアクセス権限をPublicにしても同じだったので、新しいリージョンにストレージアカウントを作成して、リージョン間のコピーでVHDを持ってくる必要があるようです。

スクリプトソース

使ったスクリプトは以下の通りです。

Select-AzureSubscription "サブスクリプション名"

#コピー元のBLOB情報の設定
$srcUri ="http://xxxxx.blob.core.windows.net/vhds/xxxxxxx.VHD"
$srcStorageAcoount = "ストレージアカウント名"
$srcStorageKey = "プライマリアクセスキー"
$srcContext = New-AzureStorageContext -StorageAccountName $srcStorageAcoount -StorageAccountKey $srcStorageKey

#コピー先のBLOB情報の設定
$destStorageAcoount = "ストレージアカウント名"
$destStorageKey = "プライマリアクセスキー"
$destContext = New-AzureStorageContext -StorageAccountName $destStorageAcoount -StorageAccountKey $destStorageKey

#BLOBコピージョブの開始
$copyTask = Start-AzureStorageBlobCopy -SrcUri $srcUri -SrcContext $srcContext -DestContext $destContext -DestContainer "vhds"  -DestBlob "xxxx.vhd" 

#BLOBコピージョブのステータスの監視
$taskStatus = $copyTask | Get-AzureStorageBlobCopyState
While($taskStatus.Status -eq "Pending"){
  Start-Sleep 10 
  $taskStatus = $copyTask | Get-AzureStorageBlobCopyState
  #フォーマットしたステータス情報を表示
  (Get-Date).ToString() + " : " + ("{0:P0}" -f ($taskStatus.BytesCopied / $taskStatus.TotalBytes)) 
}
$taskStatus

ここから詳細書いていきます。


コピー元ストレージアカウント情報を設定

まずはコピー元のストレージアカウントの情報を設定します。Azureポータルからコピー元となるBLOB(今回はVHDファイル)のURIを取得します。


このURIを変数に格納しておきます。

$srcUri ="http://xxxxx.blob.core.windows.net/vhds/xxxxxxx.VHD"

コピー元のストレージアカウントの管理情報も取得しておきましょう。

$srcStorageAcoount = "ストレージアカウント名"
$srcStorageKey = "プライマリアクセスキー"


情報が集まったら、ストレージアカウントのコンテキストオブジェクトを生成します。

$srcContext = New-AzureStorageContext -StorageAccountName $srcStorageAcoount -

StorageAccountKey $srcStorageKey

コピー先の準備

まずコピー先のストレージアカウントにBLOBを格納するコンテナを作成します。
VHDの場合はデフォルトではvhdsとするようなので、今回もvhdsとしています。


コピー元と同じようにコピー先ストレージアカウント情報も取得して変数に格納、コンテキストオブジェクトを生成します。

$destStorageAcoount = "ストレージアカウント名"
$destStorageKey = "プライマリアクセスキー"
$destContext = New-AzureStorageContext -StorageAccountName $destStorageAcoount -StorageAccountKey $destStorageKey

 



BLOBのコピー実行

これで事前準備は完了しました。以下のようにコマンドを実行するとBLOBのコピージョブが開始されます。

$copyTask = Start-AzureStorageBlobCopy -SrcUri $srcUri -SrcContext $srcContext -DestContext 
$destContext -DestContainer "vhds"  -DestBlob "xxxx.vhd" 


実行すると以下のようなメッセージが返ってくるので、Successfulになっていることを確認してください。これでコピージョブが起動されました。

詳細: 20:49:02 - Copy request to blob 'xxxx.vhd' in container 'vhds' has been scheduled with copyId
詳細: Transfer Summary

                                                              • -

Total: 1.
Successful: 1.
Failed: 0.


後はコピージョブのステータスがPendingからSucessになるのを待ちます。

$taskStatus = $copyTask | Get-AzureStorageBlobCopyState
$taskStatus.Status #コピーが完了するとStatusプロパティがPendingからSucessになる

2014/6/29 追記

こちらの書き方の方がシンプルでわかりやすいと思います。
Azure BLOBコピー処理のPowerShellスクリプト - YOMON8.NET