最近有個客戶合約終止,要協助它們將 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 指令
寫完,放著執行就可以回家了!