歸檔層是離線層,用來儲存很少被存取的 blob 資料。 歸檔層提供最低的儲存成本,但資料擷取成本與延遲相較於線上層級(熱層與冷層)較高。 資料必須保留在封存層中至少 180 天,否則須支付提早刪除費用。 欲了解更多關於檔案存取層的資訊,請參見 檔案存取層。
當 Blob 位於封存層時,無法加以讀取或修改。 若要讀取或下載位於封存層的 Blob,您必須先將其重新復原至線上層,也就是經常性存取層或非經常性存取層。 視您針對解除凍結作業指定的優先順序而定,封存層中的資料最多可能需要 15 小時才能解除凍結。 如需 Blob 解除凍結的詳細資訊,請參閱從封存層將 Blob 解除凍結的概觀。
Caution
封存層中的 blob 處於離線狀態。 也就是說,在解除凍結之前,無法讀取或修改它。 補水過程可能需要數小時,且有相關費用。 在將資料移到歸檔層之前,請考慮將 blob 資料下線是否會影響你的工作流程。
你可以使用 Azure 入口網站、PowerShell、Azure CLI,或是 Azure 儲存體 的客戶端函式庫來管理資料歸檔。
上傳時將 Blob 歸檔
如果要在上傳時存檔一個或更多的 blob,請直接在歸檔層建立該 blob。
要在從 Azure 入口網站上傳時歸檔一個或一組 blob,請遵循以下步驟:
瀏覽至目標容器。
選取上傳按鈕。
選取要上傳的檔案。
展開 進階 區塊,並將 存取層 級設為 「歸檔」。
選取上傳按鈕。
若要在上傳時以 PowerShell 歸檔一個或一組 blob,請呼叫 Set-AzStorageBlobContent 指令,如下範例所示。 請記得將括弧中的預留位置值取代為您自己的值:
$rgName = <resource-group>
$storageAccount = <storage-account>
$containerName = <container>
# Get context object
$ctx = New-AzStorageContext -StorageAccountName $storageAccount -UseConnectedAccount
# Create new container.
New-AzStorageContainer -Name $containerName -Context $ctx
# Upload a single file named blob1.txt to the archive tier.
Set-AzStorageBlobContent -Container $containerName `
-File "blob1.txt" `
-Blob "blob1.txt" `
-Context $ctx `
-StandardBlobTier Archive
# Upload the contents of a sample-blobs directory to the archive tier, recursively.
Get-ChildItem -Path "C:\sample-blobs" -File -Recurse |
Set-AzStorageBlobContent -Container $containerName `
-Context $ctx `
-StandardBlobTier Archive
若要在上傳時用 Azure CLI 歸檔單一 blob,請呼叫 az storage blob upload 指令,如下範例所示。 請記得將括弧中的預留位置值取代為您自己的值:
az storage blob upload \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--file <file> \
--tier Archive \
--auth-mode login
若要在上傳時以 Azure CLI 封存一組 blob,請呼叫 az storage blob upload-batch 指令,如下範例所示。 請記得將括弧中的預留位置值取代為您自己的值:
az storage blob upload-batch \
--destination <container> \
--source <source-directory> \
--account-name <storage-account> \
--tier Archive \
--auth-mode login
若要在上傳時用 AzCopy 封存單一 blob,請呼叫 azcopy copy 指令。 提供本地檔案作為來源,目標 blob URI 作為目的地,並指定歸檔層作為目標層,如下範例所示。 請記得將括弧中的預留位置值取代為您自己的值:
Note
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令提示字元 (cmd.exe) 外,所有命令提示字元都使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。
這個例子不包含 SAS 憑證,因為它假設你已經透過 Microsoft Entra ID 提供了授權憑證。 請參閱 Get Start with AzCopy 文章,了解如何向儲存服務提供授權憑證。
azcopy copy 'C:\temp\myTextFile.txt' 'https://<storage-account>.blob.core.windows.net/<container>/myTextFile-archived.txt' --blob-type BlockBlob --block-blob-tier Archive
其他範例請參見使用 AzCopy 上傳檔案至 Azure Blob 儲存。
封存現有的 Blob
你可以用兩種方式之一將現有的 blob 移到 archive tier:
你可以用 設定 Blob 層 級操作來更改 blob 的層級。
Set Blob Tier(設定 Blob Tier )會將單一 blob 從一個層移動到另一個層級。
請記得,當你用 Set Blob 層級把 blob 移到 archive tier 時,除非你重新讓 blob 水化,否則你無法讀取或修改 blob 的資料。 如果你可能需要在早期刪除間隔結束前讀取或修改 blob 的資料,可以考慮使用 Copy Blob 操作,在歸檔層建立 blob 的複製。
你可以用 複製 Blob 操作,將線上層級的 blob 複製到 archive 層級。 你可以呼叫 複製 Blob 操作,將 Blob 從線上層級(熱或冷層)複製到 archive 層級。 原始資料塊仍停留在線上層級,你可以繼續在線上層級讀取或修改其資料。
透過變更層級來封存現有 Blob
使用 Set Blob Tier 操作,將 Blob 從 Hot 或 cool 層移到 archive 層。
Set Blob Tier 操作最適合在早期刪除間隔結束前不需要存取歸檔資料的情況。
Set Blob Tier 操作會改變單一 blob 的層級。 為了將一組 blob 移至最佳效能的歸檔層,Microsoft 建議執行批量歸檔操作。 大容量歸檔操作會在單一交易中向服務發送一批 Set Blob Tier 呼叫。 如需詳細資訊,請參閱大量封存。
要將現有的 blob 移至 Azure 入口網站的歸檔層級,請依照以下步驟操作:
導覽至 Blob 的容器。
選取要封存的 Blob。
選擇 「變更分級 」按鈕。
從存取層級下拉式選單中選取「歸檔」。
選取 [儲存]。
要用 PowerShell 將 blob 的層級從熱或冷改為 Archive,請使用 blob 的 BlobClient 屬性回傳 .NET 參考給該 blob,然後呼叫該參考的 SetAccessTier 方法。 請記得以自有值來取代角括弧中的預留位置:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$blobName = "<blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Change the blob's access tier to Archive.
$blob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
$blob.BlobClient.SetAccessTier("Archive", $null)
要將 blob 的層級從 hot 或 cool 改為 Archive,使用 Azure CLI,請呼叫 az storage blob set-tier 命令。 請記得以自有值來取代角括弧中的預留位置:
az storage blob set-tier \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--tier Archive \
--auth-mode login
要將 blob 的層級從熱或冷改為 Archive,請使用 azcopy set-properties 指令並將參數設 -block-blob-tier 為 archive。
Note
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令提示字元 (cmd.exe) 外,所有命令提示字元都使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。
這個例子不包含 SAS 憑證,因為它假設你已經透過 Microsoft Entra ID 提供了授權憑證。 請參閱 Get Start with AzCopy 文章,了解如何向儲存服務提供授權憑證。
azcopy set-properties 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>' --block-blob-tier=archive
若要變更虛擬目錄中所有 Blob 的存取層,請參閱虛擬目錄名稱,而不是 Blob 名稱,然後將 --recursive=true 附加至命令。
azcopy set-properties 'https://<storage-account-name>.blob.core.windows.net/<container-name>/myvirtualdirectory' --block-blob-tier=archive --recursive=true
使用複製作業封存現有的 Blob
使用 複製 Blob 操作,將 Hot 或 cool 層的 blob 複製到 archive 層。 來源 blob 會保留在熱層或冷層,而目的 blob 則是在歸檔層建立。
Copy Blob 作業最適用於這類情境:在提前刪除期限屆滿之前,您可能需要讀取或修改已封存的資料。 您可以在不需要解除凍結封存的 Blob 的情況下存取來源 Blob 的資料。
要用 PowerShell 將 blob 從線上層級複製到 歸檔層級,請呼叫 Start-AzStorageBlobCopy 指令並指定歸檔層級。 請記得以自有值來取代角括弧中的預留位置:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$srcContainerName = "<source-container>"
$destContainerName = "<dest-container>"
$srcBlobName = "<source-blob>"
$destBlobName = "<dest-blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Copy the source blob to a new destination blob in archive tier.
Start-AzStorageBlobCopy -SrcContainer $srcContainerName `
-SrcBlob $srcBlobName `
-DestContainer $destContainerName `
-DestBlob $destBlobName `
-StandardBlobTier Archive `
-Context $ctx
要用 Azure CLI 將 blob 從線上層級複製到 archive 層級,呼叫 az storage blob copy start 指令並指定歸檔層級。 請記得以自有值來取代角括弧中的預留位置:
az storage blob copy start \
--source-container <source-container> \
--source-blob <source-blob> \
--destination-container <dest-container> \
--destination-blob <dest-blob> \
--account-name <storage-account> \
--tier Archive \
--auth-mode login
若要使用 AzCopy 將 blob 從線上層級複製到 archive 層級,請指定來源 blob 的 URI 與目的 blob 的 URI。 目的地 blob 應該和來源 blob 有不同的名稱,而且不應該已經存在。
Note
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令提示字元 (cmd.exe) 外,所有命令提示字元都使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。
這個例子不包含 SAS 憑證,因為它假設你已經透過 Microsoft Entra ID 提供了授權憑證。 請參閱 Get Start with AzCopy 文章,了解如何向儲存服務提供授權憑證。
請記得以自有值來取代角括弧中的預留位置:
azcopy copy 'https://<source-account>.blob.core.windows.net/sample-container/blob1.txt' 'https://<dest-account>.blob.core.windows.net/sample-container/blob1-archived.txt' --blob-type BlockBlob --block-blob-tier Archive
大量封存
若要將容器或資料夾中的 Blob 移至封存層,請列舉 Blob,並對每個 Blob 呼叫「設定 Blob 層級」作業。 下列範例示範如何執行這項作業:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$folderName = "<folder>/"
$ctx = (Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).Context
$blobCount = 0
$Token = $Null
$MaxReturn = 5000
do {
$Blobs = Get-AzStorageBlob -Context $ctx -Container $containerName -Prefix $folderName -MaxCount $MaxReturn -ContinuationToken $Token
if($Blobs -eq $Null) { break }
#Set-StrictMode will cause Get-AzureStorageBlob returns result in different data types when there is only one blob
if($Blobs.GetType().Name -eq "AzureStorageBlob")
{
$Token = $Null
}
else
{
$Token = $Blobs[$Blobs.Count - 1].ContinuationToken;
}
$Blobs | ForEach-Object {
if($_.BlobType -eq "BlockBlob") {
$_.BlobClient.SetAccessTier("Archive", $null)
}
}
}
While ($Token -ne $Null)
az storage blob list --account-name $accountName --account-key $key \
--container-name $containerName --prefix $folderName \
--query "[?properties.blobTier == 'Cool'].name" --output tsv \
| xargs -I {} -P 10 \
az storage blob set-tier --account-name $accountName --account-key $key \
--container-name $containerName --tier Archive --name "{}"
當大量 blob 移至 archive 層時,請使用批次操作以達到最佳效能。 批次作業會透過單一要求,將多個 API 呼叫傳送至服務。
Blob 批次作業支援的子作業包括刪除 Blob 和設定 Blob 層。
若要以批次作業將 Blob 歸檔,請使用 Azure 儲存體用戶端程式庫其中之一。 以下程式碼範例展示了如何使用 .NET 用戶端函式庫執行基本的批次操作:
static async Task BulkArchiveContainerContents(string accountName, string containerName)
{
string containerUri = string.Format("https://{0}.blob.core.windows.net/{1}",
accountName,
containerName);
// Get container client, using Azure AD credentials.
BlobUriBuilder containerUriBuilder = new BlobUriBuilder(new Uri(containerUri));
BlobContainerClient blobContainerClient = new BlobContainerClient(containerUriBuilder.ToUri(),
new DefaultAzureCredential());
// Get URIs for blobs in this container and add to stack.
var uris = new Stack<Uri>();
await foreach (var item in blobContainerClient.GetBlobsAsync())
{
uris.Push(blobContainerClient.GetBlobClient(item.Name).Uri);
}
// Get the blob batch client.
BlobBatchClient blobBatchClient = blobContainerClient.GetBlobBatchClient();
try
{
// Perform the bulk operation to archive blobs.
await blobBatchClient.SetBlobsAccessTierAsync(blobUris: uris, accessTier: AccessTier.Archive);
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
}
}
如需深入解析的範例應用程式示範如何使用批次作業變更階層,請參閱 AzBulkSetBlobTier。
使用生命週期管理原則來封存 Blob
你可以建立生命週期管理原則,在 Blob 於指定期間內未被存取或修改時,自動將其移至封存層,以最佳化很少存取之 Blob 資料的成本。 設定生命週期管理政策後,Azure 儲存體 每天執行一次。 欲了解更多生命週期管理政策,請參閱「 透過自動管理資料生命週期來優化成本」。
你可以使用 Azure 入口網站、PowerShell、Azure CLI 或 Azure Resource Manager 範本來建立生命週期管理政策。 為了簡化起見,本節僅展示如何在 Azure 入口網站建立生命週期管理政策。 欲了解更多如何建立生命週期管理政策的範例,請參見 「設定生命週期管理政策」。
Caution
在使用生命週期管理政策將資料移至歸檔層級前,請確認該資料至少 180 天內不需要刪除或移至其他層級。 在180天期限內被刪除或移至不同層級的資料,將須繳付提前刪除費用。
另外要記得,歸檔層的資料必須先重新水化,才能讀取或修改。 從封存層解除凍結一個 blob 可能需要好幾個小時,且有相關成本。
若要在 Azure 入口網站中建立用於將 Blob 封存的生命週期管理原則,請依照下列步驟操作:
步驟 1:建立規則並指定 blob 類型
在入口網站中導覽至您的儲存體帳戶。
在 資料管理中,找到 生命週期管理 設定。
選擇 「新增規則 」按鈕。
在 「細節 」標籤中,指定規則名稱。
指定規則範圍:要麼對你儲存帳號中的所有 blob 套用規則,要麼用過濾器限制 blobs。
選擇規則要適用的 blob 類型,並指定是否包含 blob 快照或版本。
步驟二:加入規則條件
您可以根據所做的選擇,為基底 Blob(目前版本)、先前版本或 Blob 快照設定規則。 請指定要檢查的兩個條件之一:
- 物件最後一次修改是在幾天前。
- 物件是在幾天前被創造出來的。
- 物件最後一次被存取是在幾天前。
對於每個規則,這些條件中只能套用其中一個,才能將特定類型的物件移至封存層級。 例如,如果你定義了一個動作,將已 90 天未修改的基底 Blob 封存,那麼你也不能同時定義另一個動作,將已 90 天未被存取的基底 Blob 封存。 同樣地,你可以用以下任一條件定義每個規則一個動作來歸檔先前版本,另一個動作用來歸檔快照。
接著,指定物件被修改或存取後需經過的天數。
指定物件在該間隔過後將移至封存層級。
如果您選擇使用篩選條件來限制受規則影響的 Blob,則可以指定篩選條件,使用 Blob 前置詞或 Blob 索引相符條件其中之一。
步驟 3:確保規則排除了解除凍結的 Blob
如果您藉由變更 blob 的層級將其重新水合,當上次修改時間、建立時間或上次存取時間早於原則所設定的門檻時,此規則會將該 blob 移回封存層。
如果您選取了上次修改時間規則條件,則可藉由選取跳過在過去這段期間內已解除凍結的 Blob,再輸入您希望解除凍結的 Blob 從此規則中排除的天數,以避免發生這種情況。
Note
此選項僅在您選擇 「最後修改 規則」條件時出現。
選擇 新增 按鈕以將規則加入政策中。
查看政策 JSON
建立生命週期管理政策後,你可以透過從清單檢視切換到程式碼檢視,在生命週期管理頁面上查看該政策的 JSON。
以下是上圖中建立的簡單生命週期管理政策的 JSON:
{
"rules": [
{
"enabled": true,
"name": "sample-archive-rule",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToArchive": {
"daysAfterLastAccessTimeGreaterThan": 90,
"daysAfterLastTierChangeGreaterThan": 7
}
}
},
"filters": {
"blobTypes": [
"blockBlob"
]
}
}
}
]
}
另請參閱