设置 blob 的访问层
Artículo 10/28/2024
2 colaboradores
Comentarios
En este artículo
可以通过以下任一方式设置 blob 的访问层:
通过为存储帐户设置默认在线访问层。 除非显式重写单个 blob 的设置,否则帐户中的 blob 会继承此访问层。
通过在上传时显式设置 blob 的层。 可以在热、冷、寒或存档层中创建 Blob。
使用“设置 Blob 层”操作更改现有 blob 的层。 通常会使用此操作从较热的层移到较冷的层。
使用“复制 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 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。 此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门 一文,了解如何向存储服务提供授权凭据。
azcopy copy '<local-file-path>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>' --block-blob-tier <blob-tier>
若要使用 AzCopy 将一组 Blob 上传到特定层,请参阅本地目录或本地目录内容,然后将 --recursive=true
追加到命令。
本地目录示例
azcopy copy '<local-directory-path>' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>' --block-blob-tier <blob-tier> --recursive=true
本地目录内容示例
azcopy copy '<local-directory-path>\*' 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<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 的层 。
使用 PowerShell、Azure CLI、AzCopy v10 或 Azure 存储客户端库之一将 blob 移动到其他层。
更改 blob 的层
更改 blob 的层时,调用 Set blob tier 操作(直接或通过生命周期管理 策略调用),或将 azcopy Set -properties 命令与 AzCopy 配合使用,从而将该 blob 及其所有数据移动到目标层。 将 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>"
$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
参数。
重要
使用 AzCopy 更改 Blob 的访问层目前为预览版。
有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Azure 预览版的补充使用条款 。
注意
此示例将路径参数括在单引号 ('') 内。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。 此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门 一文,了解如何向存储服务提供授权凭据。
azcopy set-properties 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>' --block-blob-tier=<tier>
若要更改虚拟目录中所有 Blob 的访问层,请参阅虚拟目录名称(而不是 Blob 名称),然后将 --recursive=true
追加到命令。
azcopy set-properties 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/myvirtualdirectory' --block-blob-tier=<tier> --recursive=true
将 blob 复制到不同的联机层
调用 Copy 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 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 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。 此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门 一文,了解如何向存储服务提供授权凭据。
AzCopy 不支持从存档层中的源 blob 进行复制。
azcopy copy 'https://mystorageeaccount.blob.core.chinacloudapi.cn/mysourcecontainer/myTextFile.txt' 'https://mystorageaccount.blob.core.chinacloudapi.cn/mydestinationcontainer/myTextFile.txt' --block-blob-tier=hot
复制操作是同步的,因此,当此命令返回时,会复制所有文件。
批量分层
若要将 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("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.chinacloudapi.cn/{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 。
后续步骤