同步兩個儲存體帳戶內的 Blob 容器是個很常見的需求,做法也有非常多種,從單純的在 VM 中啟 Azcopy 服務,到 PaaS 方案的 Azure Data Factory 都可以做得到,但如果什麼東西都不想維護的話,那 Blob Storage 的物件複寫功能肯定是個好選擇。
架構說明
物件複寫可以跨地區、跨租用戶的在兩個 Storage Account 間運作,本篇為展示方便,將會在同一個租用戶下建立為於不同區域的 Storage Account。
注意事項
要使用物件複寫功能必須要先在 Azure Storage Account 上啟用以下兩個功能:
- 在來源端的 Storage 啟用變更摘要。
- 在來源端和目的地端的 Storage 啟用 Blob 版本控制。
要特別注意的是變更摘要與 Blob 版本控制這兩項功能都會產生額外的費用,開啟前還是要自己衡量一下使用量。
建立 Storage Account
來源的 Storage Account 我們選擇建立在東南亞地區,規格使用一般用途 V2。
做為來源的 Storage Account 記得要開啟「版本設定」與「變更摘要」。
建立完成後進到 Storage Account 再建立一個名為「source」的容器。
接著再使用相同規格在美國東部建立目地端 Storage Account 與 Blob 容器就可以了。
編寫複寫原則
Storage Account 建立完成後就能開始設定物件複寫,最簡單的方式是可以透過 Azure Portal 點擊設定完成,但如果有跨租用戶的需求就沒辦法只使用 UI 完成,再加上我覺得使用定義檔的方式比較清楚明瞭,所以一直以來都是使用這個方式。
物件複寫原則的定義檔使用的是 Json 格式,直接看以下範例:
- properties.policyId:固定 default,後續會知道原因。
- properties.sourceAccount & properties.destinationAccount:兩個 Storage Account 的完整識別碼,可以在「設定」→「端點」的頁籤中找到。
- properties.rules[0].ruleId:先保持空字串。
- properties.rules[0].sourceContainer & properties.rules.destinationContainer:兩個 Blob 容器的名稱。
- properties.rules[0].filters.prefixMatch:用來塞選要進行複寫的檔案名稱開頭。
- properties.rules[0].filters.minCreationTime:大於這個時間的檔案才會被複寫。
在目的地端的 Storage Account 上傳定義檔
沒有為什麼,這個流程就是一定要從目的地端開始。進到「資料管理」→「物件複寫」,點選上方的上傳複寫規則,選到剛剛編寫好的 Json 檔,檔案沒問題的話畫面就會像以下這樣:
上傳完成後再如下畫面下載下來:
觀察一下下載的這份 Json 檔:
最大的不同就是剛剛沒填好 properties.policyId 與 properties.rules[0].ruleId 已經被自動填上了,這也是我們需要的。
在來源端的 Storage Account 上傳定義檔
一樣的動作,我們在來源端的「資料管理」→「物件複寫」再上傳一次 Json 檔,但這次要用的是已經被填上 policyId 與 ruleId 的這份。
上傳稍待幾秒後就會看到規則設定完成了。
測試
這個測試就非常簡單了,直接進到來源端的 Blob 容器上傳一個名稱是 t 開頭的檔案。
再進到目地端的 Blob 容器:
觀察兩者的檔案修改時間,因為物件複寫是一個非同步的任務,所以會存在數秒到幾分鐘的時間差,但整體來說抄寫是成功的!👍
總結
物件複寫對於原封不動的同步需求來說非常方便,畢竟設定好後就沒有任何需要維護的東西,同時也附帶了簡單的檔案名稱塞選,但目前沒辦法做到雙向同步是比較可惜的地方,另外如果是更複雜的 ETL 也沒辦法使用這個方式,一切還是要視需求來選擇正確的工具。
留言
張貼留言