設定 Blob 的存取層
在此文章
您可以使用下列任何一種方式來設定 Blob 的存取層:
透過將預設的線上存取層設定為使用儲存體帳戶。 除非您明確覆寫個別 Blob 的設定,否則帳戶中的 Blob 會繼承此存取層。
透過在上傳時明確設定 Blob 階層。 您可以在經常性存取、非經常性存取、極非經常性存取或封存層中建立 Blob。
使用 Set Blob Tier 作業變更現有的 Blob 階層。 一般而言,您會使用此作業,從較常存取層變更為較少存取層。
使用 Copy Blob 作業來複製 Blob。 一般而言,您會使用此作業,從較少存取層變更為較常存取層。
本文說明如何管理線上存取層中的 Blob。 如需關於如何將 Blob 移至封存層的詳細資訊,請參閱封存 Blob (部分機器翻譯)。 如需關於如何從封存層解除凍結 Blob 的詳細資訊,請參閱將封存的 Blob 解除凍結至線上層 (部分機器翻譯)。
如需 Blob 存取層的詳細資訊,請參閱 Blob 資料的存取層 (部分機器翻譯)。
管理儲存體帳戶的預設存取層
一般用途 v2 儲存體帳戶的預設存取層設定會決定依預設建立新 Blob 的線上層。 您可以在建立帳戶時,或藉由更新現有帳戶的設定,來設定一般用途 v2 儲存體帳戶的預設存取層。
當您變更現有一般用途 v2 儲存體帳戶的預設存取層設定時,變更會套用至帳戶中未明確設定存取層的所有 Blob。 變更預設存取層可能會對帳單產生影響。 如需詳細資訊,請參閱預設帳戶存取層設定 。
若要在 Azure 入口網站建立期間設定儲存體帳戶的預設存取層,請遵循下列步驟:
瀏覽至 [儲存體帳戶] 頁面,然後選取 [建立] 按鈕。
填寫 [基本] 索引標籤。
在 [進階] 索引標籤的 [Blob 儲存體] 下方,將 [存取層] 設定為 [經常性存取層] 、[非經常性存取層] 或 [極非經常性存取] 。 預設值為 [經常性存取層] 。
選取 [檢閱 + 建立] 以驗證您的設定,然後建立您的儲存體帳戶。
若要更新 Azure 入口網站中現有儲存體帳戶的預設存取層,請遵循下列步驟:
瀏覽至 Azure 入口網站中的儲存體帳戶。
在 [設定] 底下,選取 [設定] 。
找出 [Blob 存取層 (預設值)] 設定,然後選取 [經常性存取層] 、[非經常性存取層] 或 [極非經常性存取] 。 如果您先前未設定此屬性,則預設設定為 [經常性存取層] 。
儲存您的變更。
若要使用 PowerShell 來變更儲存體帳戶的預設存取層設定,請呼叫 Set-AzStorageAccount 命令,並指定新的預設存取層。
$rgName = <resource-group>
$accountName = <storage-account>
# Change the storage account tier to cool
Set-AzStorageAccount -ResourceGroupName $rgName -Name $accountName -AccessTier Cool
若要使用 PowerShell 來變更儲存體帳戶的預設存取層設定,請呼叫 Set-AzStorageAccount 命令,並指定新的預設存取層。
# Change the storage account tier to cool
az storage account update \
--resource-group <resource-group> \
--name <storage-account> \
--access-tier Cool
在上傳時設定 Blob 的階層
當您將 Blob 上傳至 Azure 儲存體時,您有兩個選項可供您在上傳時設定 Blob 層:
您可以明確指定將用來建立 Blob 的階層。 此設定會覆寫儲存體帳戶的預設存取層。 您可以在上傳至經常性存取、非經常性存取、極非經常性存取或封存層時,設定一個 Blob 或一組 Blob 的階層。
您可以上傳 Blob 而不指定階層。 在此情況下,將會在針對儲存體帳戶指定的預設存取層中建立 Blob (經常性存取層或非經常性存取層)。
如果您要上傳使用加密範圍的新 Blob,則無法變更該 Blob 的存取層。
下列各節說明如何指定將 Blob 上傳至經常性存取層或非經常性存取層。 如需關於在上傳時封存 Blob 的詳細資訊,請參閱上傳時封存 Blob 。
將 Blob 上傳至特定的線上層
若要在經常性存取層、非經常性存取層或極非經常性存取層中建立 Blob,請在建立 Blob 時指定該階層。 上傳時指定的存取層會覆寫儲存體帳戶的預設存取層。
若要從 Azure 入口網站將一個 Blob 或一組 Blob 上傳至特定階層,請遵循下列步驟:
瀏覽至目標容器。
選取上傳 按鈕。
選取要上傳的檔案。
展開 [進階] 區段,並將 [存取層] 設定為 [經常性存取層] 或 [非經常性存取層] 。
選取上傳 按鈕。
若要使用 PowerShell 將一個 Blob 或一組 Blob 上傳至特定階層,請呼叫 Set-AzStorageBlobContent 命令,如下列範例所示。 請記得以自有值來取代括弧中的預留位置值:
$rgName = <resource-group>
$storageAccount = <storage-account>
$containerName = <container>
# tier can be hot, cool, cold, or archive
$tier = <tier>
# 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 cool tier.
Set-AzStorageBlobContent -Container $containerName `
-File "blob1.txt" `
-Blob "blob1.txt" `
-Context $ctx `
-StandardBlobTier Cool
# Upload the contents of a sample-blobs directory to the cool tier, recursively.
Get-ChildItem -Path "C:\sample-blobs" -File -Recurse |
Set-AzStorageBlobContent -Container $containerName `
-Context $ctx `
-StandardBlobTier $tier
若要使用 Azure CLI 將一個 Blob 上傳至特定階層,請呼叫 az storage blob upload 命令,如下列範例所示。 請記得將括弧中的預留位置值取代為您自己的值。 將 <tier>
預留位置取代為 hot
、cool
、cold
或 archive
。
az storage blob upload \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--file <file> \
--tier <tier> \
--auth-mode login
若要使用 Azure CLI 將一組 Blob 上傳至特定階層,請呼叫 az storage blob upload-batch 命令,如下列範例所示。 請記得將括弧中的預留位置值取代為您自己的值。 將 <tier>
預留位置取代為 hot
、cool
、cold
或 archive
。
az storage blob upload-batch \
--destination <container> \
--source <source-directory> \
--account-name <storage-account> \
--tier <tier> \
--auth-mode login
若要使用 AzCopy 將 Blob 上傳至特定層,請使用 azcopy copy 命令並將 --block-blob-tier
參數設定為 hot
、cool
或 archive
。
注意
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。 此範例會排除 SAS 權杖,因為該權杖假設您已使用 Microsoft Entra ID 提供授權認證。 若要了解向儲存體服務提供授權認證的方式,請參閱開始使用 AzCopy 一文。
azcopy copy '<local-file-path>' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>' --block-blob-tier <blob-tier>
若要使用 AzCopy 將一組 Blob 上傳至指定層,請參閱本機目錄或本機目錄內容,然後將 --recursive=true
附加至命令。
本機目錄範例
azcopy copy '<local-directory-path>' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>' --block-blob-tier <blob-tier> --recursive=true
本機目錄內容範例
azcopy copy '<local-directory-path>\*' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>' --block-blob-tier <blob-tier> --recursive=true
將 Blob 上傳至預設層
儲存體帳戶具有一個預設存取層設定,可指出建立新 Blob 的線上層位置。 預設存取層設定可以設定為經常性存取層或非經常性存取層。 這項設定的行為會因儲存體帳戶類型而略有不同:
預設會將新一般用途 v2 儲存體帳戶的預設存取層設定為經常性存取層。 當您建立儲存體帳戶時,或在建立儲存體帳戶之後,您可以變更預設存取層設定。
當您建立舊版 Blob 儲存體帳戶時,您必須在建立儲存體帳戶時,將預設存取層設定指定為經常性存取層或非經常性存取層。 您可以在建立儲存體帳戶之後,變更其預設存取層設定。
若 Blob 未明確獲指派任何階層,系統就會從預設帳戶存取層設定推斷其階層。 您可以使用 Azure 入口網站、PowerShell 或 Azure CLI 來判斷是否推斷 Blob 的存取層。
如果 Blob 的存取層是從預設帳戶存取層設定推斷而來,則 Azure 入口網站會將存取層顯示為 [經常性存取層 (推斷)] 、[非經常性存取層 (推斷)] 或 [極非經常性存取 (推斷)] 。
若要判斷 Blob 的存取層,及其是否從 Azure PowerShell 推斷,請擷取 Blob,然後檢查其 AccessTier 和 AccessTierInferred 屬性。
$rgName = "<resource-group>"
$storageAccount = "<storage-account>"
$containerName = "<container>"
$blobName = "<blob>"
# Get the storage account context.
$ctx = New-AzStorageContext -StorageAccountName $storageAccount -UseConnectedAccount
# Get the blob from the service.
$blob = Get-AzStorageBlob -Context $ctx -Container $containerName -Blob $blobName
# Check the AccessTier and AccessTierInferred properties.
# If the access tier is inferred, that property returns true.
$blob.BlobProperties.AccessTier
$blob.BlobProperties.AccessTierInferred
若要判斷 Blob 的存取層,及其是否從 Azure CLI 推斷,請擷取 Blob,然後檢查其 blobTier 與 blobTierInferred 屬性。
az storage blob show \
--container-name <container> \
--name <blob> \
--account-name <storage-account> \
--query '[properties.blobTier, properties.blobTierInferred]' \
--output tsv \
--auth-mode login
將 Blob 移至不同的線上層
您可以使用下列其中一種方式,將 Blob 移至不同的線上層:
透過變更存取層。
透過將 Blob 複製到不同的線上層。
如需每個選項的詳細資訊,請參閱設定或變更 Blob 的階層 。
使用 PowerShell、Azure CLI、AzCopy v10 或其中一個 Azure 儲存體的用戶端程式庫,將 Blob 移至不同的階層。
變更 Blob 的階層
當您變更 Blob 的階層時,您可以呼叫 Set Blob Tier 作業 (直接或透過生命週期管理t 原則) 或透過 AzCopy 使用 azcopy set-properties 命令,將該 Blob 和其所有資料移至目標層。 當您將 Blob 的階層從較常存取層變更為較少存取層時,此選項通常是最佳選項。
提示
您可以使用儲存體工作 ,根據定義的一組條件,跨多個儲存體帳戶大規模地變更存取層。 儲存體工作是 [Azure 儲存體動作] 中可用的資源;可用於跨多個儲存體帳戶對數百萬個物件執行一般資料作業的無伺服器架構。 若要深入了解,請參閱什麼是 Azure 儲存體動作? 。
若要在 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>"
$tier = "<tier>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Change the blob's access tier.
$blob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
$blob.BlobClient.SetAccessTier($tier, $null, "Standard")
若要使用 Azure CLI 將 Blob 的階層變更為較少存取層,請呼叫 az storage blob set-tier 命令。 請記得以自有值來取代角括弧中的預留位置:
az storage blob set-tier \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--tier <tier> \
--auth-mode login
若要將 Blob 的階層變更為較少存取層,請使用 azcopy set-properties 命令,並設定 -block-blob-tier
參數。
注意
此範例會以單引號 ('') 括住路徑引數。 除了 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=<tier>
若要變更虛擬目錄中所有 Blob 的存取層,請參閱虛擬目錄名稱,而不是 Blob 名稱,然後將 --recursive=true
附加至命令。
azcopy set-properties 'https://<storage-account-name>.blob.core.windows.net/<container-name>/myvirtualdirectory' --block-blob-tier=<tier> --recursive=true
將 Blob 複製到不同的線上層
呼叫 Copy Blob 作業,將 Blob 從某個階層複製到另一個階層。 當您將 Blob 複製到不同的階層時,會將該 Blob 及其所有資料移至目標層。 來源 Blob 會保留在原始層中,並在目標層中建立新的 Blob。 針對將 Blob 移至較常存取層或從封存儲存層解除凍結 Blob 的案例,建議您使用呼叫 Copy 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 hot tier.
Start-AzStorageBlobCopy -SrcContainer $srcContainerName `
-SrcBlob $srcBlobName `
-DestContainer $destContainerName `
-DestBlob $destBlobName `
-StandardBlobTier Hot `
-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 hot \
--auth-mode login
若要使用 AzCopy 將 Blob 從非經常性存取層複製到經常性存取層,請使用 azcopy copy 命令並將 --block-blob-tier
參數設定為 hot
。
注意
此範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。 此範例會排除 SAS 權杖,因為該權杖假設您已使用 Microsoft Entra ID 提供授權認證。 若要了解向儲存體服務提供授權認證的方式,請參閱開始使用 AzCopy 一文。
AzCopy 不支援從封存層中的來源 Blob 進行複製。
azcopy copy 'https://mystorageeaccount.blob.core.windows.net/mysourcecontainer/myTextFile.txt' 'https://mystorageaccount.blob.core.windows.net/mydestinationcontainer/myTextFile.txt' --block-blob-tier=hot
複製作業是同步的,因此當命令傳回時,會複製所有檔案。
大量階層處理
若要將 Blob 移至容器或資料夾中的另一個階層,請列舉 Blob,並對每個 Blob 呼叫 Set Blob Tier 作業。 下列範例示範如何執行這項作業:
# 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("Cold", $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 Cold --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 。
下一步