封存 blob
在此文章
封存層是一個離線層,用於儲存極少存取的 Blob 資料。 封存層提供最低的儲存成本,但資料擷取成本和延遲則高於線上層 (經常性存取層和非經常性存取層)。 資料必須保留在封存層中至少 180 天,否則須支付提早刪除費用。 如需封存層的詳細資訊,請參閱封存存取層 。
當 Blob 位於封存層時,無法加以讀取或修改。 若要讀取或下載封存層中的 Blob,您必須先將其解除凍結至線上層 (經常性存取層或非經常性存取層)。 視您針對解除凍結作業指定的優先順序而定,封存層中的資料最多可能需要 15 小時才能解除凍結。 如需 Blob 解除凍結的詳細資訊,請參閱從封存層將 Blob 解除凍結的概觀 。
警告
封存層中的 Blob 是離線的。 亦即在解除凍結前無法讀取或修改。 解除凍結程序可能需要數小時的時間,而且會產生相關成本。 將資料移至封存層之前,請考慮讓 Blob 資料離線是否會影響您的工作流程。
您可以使用 Azure 入口網站、PowerShell、Azure CLI 或其中一個 Azure 儲存體用戶端程式庫來管理資料封存。
上傳時封存 blob
若要在上傳時封存一或多個 Blob,請直接在封存層中建立 Blob。
若要在 Azure 入口網站上傳一個 blob 或一組 blob 時加以封存,請遵循下列步驟:
瀏覽至目標容器。
選取上傳 按鈕。
選取要上傳的檔案。
展開 [進階] 區段,並將 [存取層] 設定為 [封存] 。
選取上傳 按鈕。
若要在使用 PowerShell 上傳一個 blob 或一組 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 做為目的地,然後將封存層指定為目標層,如下列範例所示。 請記得將括弧中的預留位置值取代為您自己的值:
注意
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。 此範例會排除 SAS 權杖,因為該權杖假設您已使用 Microsoft Entra ID 提供授權認證。 若要了解向儲存體服務提供授權認證的方式,請參閱開始使用 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 移至封存層:
您可以使用設定 Blob 層 作業變更 blob 層。 設定 Blob 層 會將單一 blob 從某一層移至另一層。
請記住,當您使用設定 Blob 層 將 Blob 移至封存層時,您將無法讀取或修改 Blob 資料,直到解除凍結 Blob 為止。 如果您在到達提前刪除間隔之前需要讀取或修改 Blob 資料,請考慮使用複製 Blob 作業,在封存層中建立 Blob 的複本。
您可以使用複製 Blob 作業,將線上層的 Blob 複製到封存層。 您可以呼叫複製 Blob 作業,將 Blob 從線上層 (經常性存取層或非經常性存取層) 複製到封存層。 來源 blob 會留在線上層,您可以繼續在線上層讀取或修改其資料。
藉由變更 blob 層的方式來封存現有的 blob
使用設定 Blob 層 作業,將 Blob 從經常性存取層或非經常性存取層移至封存層。 設定 Blob 層 作業最適合在屆滿提前刪除間隔前,不需要存取封存資料的情況。
設定 Blob 層 作業會變更單一 Blob 的層級。 為了在最佳效能的情況下將一組 Blob 移至封存層,Microsoft 建議執行大量封存作業。 大量封存作業會在單一交易中,將一批設定 Blob 層 呼叫傳送至服務。 如需詳細資訊,請參閱大量封存 。
若要在 Azure 入口網站中將現有的 Blob 移至封存層,請遵循下列步驟:
瀏覽至 blob 的容器。
選取要封存的 blob。
選取 [變更階層] 按鈕。
從 [存取層] 下拉清單選取 [封存] 。
選取 [儲存]。
若要使用 PowerShell 將 Blob 層從經常性存取層或非經常性存取層變更為封存層,請使用 Blob 的 BlobClient 屬性傳回該 Blob 的 .NET 參考,然後在該參考上呼叫 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)
若要使用 Azure CLI 將 Blob 層從經常性存取層或非經常性存取層變更為封存層,請呼叫 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 從經常性存取層或非經常性存取層變更為封存層,請使用 azcopy set-properties 命令,並將 -block-blob-tier
參數設定為 archive
。
注意
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。 此範例會排除 SAS 權杖,因為該權杖假設您已使用 Microsoft Entra ID 提供授權認證。 若要了解向儲存體服務提供授權認證的方式,請參閱開始使用 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 作業,將 Blob 從經常性存取層或非經常性存取層複製到封存層。 來源 Blob 會留在經常性存取層或非經常性存取層,同時在封存層建立目的地 Blob。
複製 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 從線上層複製到封存層,請呼叫 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 從線上層複製到封存層,請指定來源 Blob 的 URI 和目的地 Blob 的 URI。 目的地 Blob 應該具有與來源 Blob 不同的名稱,且不應該已經存在。
注意
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。 此範例會排除 SAS 權杖,因為該權杖假設您已使用 Microsoft Entra ID 提供授權認證。 若要了解向儲存體服務提供授權認證的方式,請參閱開始使用 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 移至封存層時,請使用批次作業以獲得最佳效能。 批次作業會透過單一要求,將多個 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 未經存取或修改並持續特定一段時間後,自動將 Blob 移至封存層。 設定生命週期管理原則之後,Azure 儲存體會每天執行一次。 如需生命週期管理原則的詳細資訊,請參閱透過自動管理資料生命週期將成本最佳化 。
您可以使用 Azure 入口網站、PowerShell、Azure CLI 或 Azure Resource Manager 範本來建立生命週期管理原則。 為了簡單起見,本節說明如何僅在 Azure 入口網站中建立生命週期管理原則。 如需示範如何建立生命週期管理原則的更多範例,請參閱設定生命週期管理原則 。
警告
使用生命週期管理原則將資料移至封存層之前,請確認資料在至少 180 天內不需要刪除或移至另一層。 針對在 180 天期間經過之前已刪除或移至不同層的資料,需要支付提前刪除費用。
此外請記住,必須先解除凍結封存層中的資料,才能讀取或修改資料。 從封存層解除凍結 Blob 可能需要數小時且具有相關聯的成本。
若要建立生命週期管理原則以在 Azure 入口網站中封存 Blob,請遵循下列步驟:
步驟 1:建立規則並指定 Blob 類型
在入口網站中瀏覽至您的儲存體帳戶。
在 [資料管理] 底下,找出 [生命週期管理] 設定。
選取 [新增規則] 按鈕。
在 [詳細資料] 索引標籤上,指定規則的名稱。
指定規則範圍:將規則套用至儲存體帳戶中的所有 Blob ,或 限制具有篩選條件的 Blob 。
選取要套用規則的 Blob 類型,並指定要包含 Blob 快照集或版本。
步驟 2:新增規則條件
根據您的選取項目,您可以為基底 Blob (目前版本)、舊版或 Blob 快照集設定規則。 指定要檢查的兩個條件之一:
物件上次修改於數天前。
物件建立於數天前。
物件上次存取於數天前。
每個規則只能套用其中一個條件,以將特定類型的物件移至封存層。 例如,如果您定義的動作是封存 90 天內未經修改的基底 Blob,則無法同時定義另一個動作,封存 90 天內未經存取的基底 Blob。 同樣地,您可以為每個規則定義一個動作,其中一個條件可封存舊版,另一個用於封存快照集。
接下來,指定修改或存取物件之後要經過的天數。
指定在間隔經過之後,將物件移至封存層。
如果您選擇使用篩選條件來限制受規則影響的 Blob,則可以使用 Blob 前置詞或 Blob 索引比對來指定篩選條件。
步驟 3:確定規則排除解除凍結的 Blob
如果您是透過變更 Blob 層來解除凍結 Blob,則若上次修改時間、建立時間或上次存取時間超過原則設定的閾值,此規則會將 Blob 移回封存層。
如果選取 [上次修改時間] 的規則條件,您可以選取 [跳過在最後時間解除凍結的 Blob] ,然後輸入要在此規則中排除之已解除凍結 Blob 的天數,防止這種情況發生。
注意
只有在您選取 [上次修改時間] 的規則條件時,才會顯示此選項。
選取 [新增] 按鈕,將規則新增至原則。
檢視原則 JSON
建立生命週期管理原則之後,您可以在 [生命週期管理] 頁面上檢視原則的 JSON,方法是從 [清單] 檢視切換為 [程式碼檢視] 。
以下是在上述映像中所建立簡單生命週期管理原則的 JSON:
{
"rules": [
{
"enabled": true,
"name": "sample-archive-rule",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToArchive": {
"daysAfterLastAccessTimeGreaterThan": 90,
"daysAfterLastTierChangeGreaterThan": 7
}
}
},
"filters": {
"blobTypes": [
"blockBlob"
]
}
}
}
]
}
另請參閱