[Azure] C# + Azure.Storage.Blobs v12 - 建立快照,從快照還原,設定讀取 Metadata

2020-12-30

這篇主是要是建立快照,然後取得快照的副本們,之後透過快照去還原,網路上面這資料就少了點,所以在寫測試範例的時候花了一點時間去理解,簡單的說,這可以對某一檔案進行快照,請注意,建立快照時建議加入 meta 資料,這樣你可以根據 meta 資料裡面的值來確保是否還原該資料,你可以放入日期,這樣你就可以快速的將某資料還原到該時間點,當然這也只是我的作法,你可用其他方法來做到..


前置步驟,首先你得安裝新版的 Azure.Storage.Blobs ( https://www.nuget.org/packages/Azure.Storage.Blobs ) 12.7.0 ,不要裝到舊版的,這邊我撰寫案例是用 .net core 3.1;在 Azure Portal  開一個 儲存體帳戶,並且在左側的存取金鑰中拿到 Connection String.




1. 建立快照,並且設定 meta -  先講解案例 我在 test1  這容器中有一個檔案 sample.txt ,在建立快照的時候,我會寫入 metadata ,Key:TAG , Value: SNAPSHOT_1~SNAPSHOT_10 ,因為我會建立10個快照 所以是 SNAPSHOT_1~SNAPSHOT_10

var blobClient = new Azure.Storage.Blobs.BlobClient(connsctionString, "test1", "sample.txt");
for (var i = 1; i <= 10; i++)
{
var meta = new System.Collections.Generic.Dictionary<string, string>();
meta.Add("TAG", "SNAPSHOT_" + i);
var res = blobClient.CreateSnapshot(meta);
Console.WriteLine(res.Value.Snapshot);
}

你也可以透過 Microsoft Azure Storage Explorer 檢視你的快照們




2.透過快照還原,這裡面我會列出,是不是快照,而且將 TAG 印出來,如果是空白就是現在的檔案,這裡面比較 tricky 的地方,就是在還原的時候 必須要帶入 ?snapshot=[snapshot_value]

var blobClient = new Azure.Storage.Blobs.BlobContainerClient(connsctionString, "test1");
foreach (var blobItem in blobClient.GetBlobs(Azure.Storage.Blobs.Models.BlobTraits.All, Azure.Storage.Blobs.Models.BlobStates.Snapshots, "sample.txt"))
{
Console.WriteLine("\t" + blobItem.Name + "," + (blobItem.Metadata.ContainsKey("TAG") ? blobItem.Metadata["TAG"] : "NO_TAG") + "," + blobItem.Snapshot);
//如果判斷 meta : TAG 是 SNAPSHOT_4 就還原它
if (blobItem.Metadata.ContainsKey("TAG") && blobItem.Metadata["TAG"] == "SNAPSHOT_4" && !string.IsNullOrEmpty(blobItem.Snapshot))
{
Azure.Storage.Blobs.BlobClient snapshotBlob = blobClient.GetBlobClient(blobItem.Name);
//還原的網址必須加上 ?snapshot=
var snapshot_uri = snapshotBlob.Uri.ToString() + "?snapshot=" + blobItem.Snapshot;
var liveBlobItem = new Azure.Storage.Blobs.BlobClient(connsctionString, "test1", "sample.txt");
liveBlobItem.StartCopyFromUri(new Uri(snapshot_uri));
}
}



Result :

sample.txt,SNAPSHOT_1,2020-12-30T02:16:00.4653143Z
sample.txt,SNAPSHOT_2,2020-12-30T02:16:00.5443695Z
sample.txt,SNAPSHOT_3,2020-12-30T02:16:00.6024113Z
sample.txt,SNAPSHOT_4,2020-12-30T02:16:00.6684580Z
sample.txt,SNAPSHOT_5,2020-12-30T02:16:00.7234966Z
sample.txt,SNAPSHOT_6,2020-12-30T02:16:00.7795366Z
sample.txt,SNAPSHOT_7,2020-12-30T02:16:00.8365766Z
sample.txt,SNAPSHOT_8,2020-12-30T02:16:00.8936162Z
sample.txt,SNAPSHOT_9,2020-12-30T02:16:00.9486558Z
sample.txt,SNAPSHOT_10,2020-12-30T02:16:01.0197061Z
sample.txt,SNAPSHOT_4,


大概先寫到這,我是覺得可以做一些特殊用途,方便好用。

搞懂後邏輯也簡單。


refernce:

https://stackoverflow.com/questions/65332174/restore-an-azure-blob-snapshot-using-c-sharp-library


當麻許的超技八 2014 | Donma Hsu Design.