PowerShellでAzureストレージアカウント間のBLOBをコピーする

Azureのストレージアカウント間でデータをコピーする方法として、一旦、サーバにBLOBをダウンロードして、別のストレージアカウントにアップロードする方法もありますが、今回は、URL指定でAzureストレージアカウント間で直接コピーするためのPowerShellを書いてみました。

#Azureモジュールのインポート
Import-Module Azure

#宛先のAzureストレージアカウント情報の設定
$protocol = "https" #http or https
$storageAccountName = "xxxxxxxxxxx" #ストレージアカウント名
$primaryKey = "xxxxxxxxxx" #プライマリアクセスキー
$connectionString = "DefaultEndpointsProtocol=$($protocol);AccountName=$($storageAccountName);AccountKey=$($primaryKey)"

#コピー元のBLOBのURL
$sourceBlobUrl = "http://xxxxxxxx.blob.core.windows.net/vhds/xxxx.vhd" 

#コピー先のコンテナとBLOBの名前
$targetContainerName = "vhds"
$targetBlobName = "xxxx.VHD"

#Azureストレージ操作用のクライアント生成
[Microsoft.WindowsAzure.Storage.CloudStorageAccount]$storageAccount = [Microsoft.WindowsAzure.Storage.CloudStorageAccount]::Parse($connectionString)
[Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient]$client = $storageAccount.CreateCloudBlobClient()

#コンテナとBLOBの参照を生成
$container = $client.GetContainerReference($targetContainerName)
$newBlob = $container.GetPageBlobReference($targetBlobName)

#空の情報をアップロードして空のBLOB作成
$newBlob.UploadFromByteArray((New-Object Byte[] 0),0,0)

#コピー元のBLOBからBLOBのデータコピー開始
Write-Host (Get-Date) ": Copy Start"
$newBlob.StartCopyFromBlob($sourceBlobUrl,$null,$null,$null,$null)

#コピーステータス監視
do
{
Start-Sleep -Seconds 30
$copyStatus = $client.GetBlobReferenceFromServer($newBlob.Uri.AbsoluteUri).CopyState.Status
Write-Host (Get-Date) ": Copy Status:" $copyStatus
}while($copyStatus -eq [Microsoft.WindowsAzure.Storage.Blob.CopyStatus]::Pending)
Write-Host (Get-Date) ": Copy Completed"

 
 
 

前にこちらの記事でAzureのBlobのスナップショットをPowerShellから取得する方法を書きました。
こちらと合わせて使うってみると便利です。
【Azure】PowerShellでBLOB上のVHDのSnapshot作成・取得・削除の操作をする - YOMON8.NET