【Azure】Azure Blob 搬移所有 Container

最近有個客戶合約終止,要協助它們將 Azure Blob上的檔案複製一份至地端。

這種大量的處理微軟有提供 AzCopy 來處理,不過,只支援一個一個 Container 搬移。

身為工程師當然就是要說,我是一個一個搬,實際上我們用程式處理!

官網描述的雲端到地端 搬移所有 Container 下的 Blob 方法如下:

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceKey:key /S
  • /Source => 你的 Blob 網址
  • myContainer => 目標 Container
  • /Dest => 地端的路徑,資料夾若不存在會自動建立
  • /SourceKey => 存取金鑰
  • /S => 會複製所有符合指定檔案模式的 Blob 或檔案,包括子資料夾中的 Blob 或檔案。

所以,我們其實只要想辦法列出所有 Container 列表跑迴圈,這個辦法還是在網路上找到的。

參考來源:How to Copy All Containers along with Blobs from one Azure storage account to other storage account

這時候要搬出 PowerShell,將上述的關鍵改成我自己的需求。

$ctx = New-AzureStorageContext -StorageAccountName "storageAccountName" -StorageAccountKey "storageAccountKey"
$containers = Get-AzureStorageContainer -Context $ctx
$FileteContainers = $containers | where {$_.Name -eq "catalog"}
foreach ($c in $FileteContainers) {
	$cmd = "C:\'Program Files (x86)'\'Microsoft SDKs'\Azure\AzCopy\AzCopy.exe /Source:https://myaccount.blob.core.windows.net/" + $c.Name + " /Dest:D:\File2\"+$c.Name+" /SourceKey:Key /S /Y /XO"
	Invoke-Expression $cmd
}
  • 第一行,我們透過 Blob 的帳號名稱、金鑰去建立一個物件(這條路我覺得最快,也有可以登入自己的 Azure 帳號的路)
  • 第二行,取回該帳號下 Blob 的 Container 列表
  • 第三行,因為我有些不需要,所以透過 PowerShell Where-Object 方法去過濾。
  • 第四行,開始跑迴圈
  • 第五行,組 cmd 指令。蠻特別的地方是有些地方要加上單引號,這還沒研究為什麼。
    • /Y  => 隱藏所有 AzCopy 確認提示
    • /XO => 排除較舊的來源資源。 如果最後修改時間比目的地還要舊或同時間,則不會複製資源。
  • 第六行,執行 cmd 指令

寫完,放著執行就可以回家了!