使用 Python 设置或更改块 blob 的访问层
本文介绍了如何使用适用于 Python 的 Azure 存储客户端库设置或更改块 blob 的访问层。
若要了解如何使用异步 API 更改 Blob 的访问层,请参阅异步更改 blob 的访问层。
先决条件
- Azure 订阅 - 创建试用订阅。
- Azure 存储帐户 - 创建存储帐户
- Python 3.8+
设置你的环境
如果没有现有项目,请查看本部分,其中介绍如何设置项目来使用适用于 Python 的 Azure Blob 存储客户端库。 有关更多详细信息,请参阅 Azure Blob 存储和 Python 入门。
要使用本文中的代码示例,请按照以下步骤设置项目。
安装包
使用 pip install
安装以下包:
pip install azure-storage-blob azure-identity
添加 import 语句
添加以下 import
语句:
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
BlobServiceClient,
BlobClient,
StandardBlobTier,
RehydratePriority
)
授权
授权机制必须具有设置 blob 的访问层所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需要 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 有关详细信息,请参阅设置 Blob 层的授权指南。
创建客户端对象
若要将应用连接到 Blob 存储,请创建 BlobServiceClient 的实例。 以下示例演示如何使用 DefaultAzureCredential
创建客户端对象进行授权:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
credential = DefaultAzureCredential()
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)
还可以为特定容器或 Blob 创建客户端对象,不管是直接创建还是通过 BlobServiceClient
对象创建。 要详细了解如何创建和管理客户端对象,请参阅 创建和管理与数据资源交互的客户端对象。
关于块 blob 访问层
要管理存储需求产生的成本,根据数据的访问频率和所需的保留期来整理数据会很有帮助。 Azure 存储提供不同的访问层,以便你可以基于使用方式,以最具成本效益的方式存储 Blob 数据。
Blob 数据的访问层
Azure 存储访问层包括:
- 热层 - 适用于存储经常访问或修改的数据的联机层。 热层的存储成本最高,但访问成本最低。
- 冷层 - 适用于存储不经常访问或修改的数据的联机层。 冷层中的数据应至少存储 30 天。 与热层相比,冷层的存储成本较低,访问成本较高。
- 寒层 - 适用于存储不经常访问或修改的数据的联机层。 寒层中的数据应至少存储 90 天。 与冷层相比,寒层的存储成本较低,访问成本较高。
- 存档层 - 适用于存储极少访问且延迟要求(以小时计)不严格的数据的脱机层。 存档层中的数据应至少存储 180 天。
若要详细了解访问层,请参阅 Blob 数据的访问层。
当 Blob 位于存档访问层时,则会将其视为处于脱机状态,无法读取或修改。 若要读取或修改存档 Blob 中的数据,必须先将 Blob 解除冻结到联机层。 若要详细了解如何将 Blob 从存档层解除冻结到联机层,请参阅从存档层解除冻结 Blob。
限制
仅允许在块 Blob 上设置访问层。 若要了解有关设置块 Blob 访问层的限制的详细信息,请参阅设置 Blob 层 (REST API)。
注意
要使用 Python 将访问层设置为 Cold
,必须至少使用客户端库版本 12.15.0。
在上传期间设置 Blob 的访问层
通过将 standard_blob_tier
关键字参数传递给 upload_blob 或 upload_blob_from_url,可以在上传时设置 blob 的访问层。
以下代码示例演示如何在上传 blob 时设置访问层:
def upload_blob_access_tier(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
#Upload blob to the cool tier
with open(file=os.path.join(r'file_path', blob_name), mode="rb") as data:
blob_client = blob_client.upload_blob(data=data, overwrite=True, standard_blob_tier=StandardBlobTier.COOL)
要详细了解如何使用 Python 上传 blob,请参阅使用 Python 上传 blob。
更改现有的块 blob 的访问层
可以使用以下函数更改现有块 blob 的访问层:
以下代码示例演示如何将现有 blob 的访问层更改为 Cool
:
def change_blob_access_tier(self, blob_client: BlobClient):
# Change the blob access tier to cool
blob_client.set_standard_blob_tier(StandardBlobTier.COOL)
如果要解除冻结存档的 Blob,可以选择将 rehydrate_priority
关键字参数作为 HIGH
或 STANDARD
传递。
将 blob 复制到不同的访问层
可以通过将访问层指定为复制操作的一部分来更改现有块 Blob 的访问层。 要在复制操作期间更改访问层,请将 standard_blob_tier
关键字参数传递给 start_copy_from_url。 如果要使用复制操作从存档层解除冻结 blob,可以选择将 rehydrate_priority
关键字参数作为 HIGH
或 STANDARD
传递。
下面的代码示例演示如何使用复制操作将存档的 Blob 解除冻结到 Hot
层:
def rehydrate_blob_using_copy(self, source_archive_blob: BlobClient, destination_rehydrated_blob: BlobClient):
# Note: the destination blob must have a different name than the source blob
# Start the copy operation - specify the rehydrate priority and blob access tier
copy_operation = dict()
copy_operation = destination_rehydrated_blob.start_copy_from_url(
source_url=source_archive_blob.url,
standard_blob_tier=StandardBlobTier.HOT,
rehydrate_priority=RehydratePriority.STANDARD,
requires_sync=False)
要详细了解如何使用 Python 复制 blob,请参阅使用 Python 复制 blob。
异步更改 Blob 的访问层
适用于 Python 的 Azure Blob 存储客户端库支持异步更改 Blob 的访问层。 要详细了解项目设置要求,请参阅异步编程。
按照以下步骤使用异步 API 更改 Blob 的访问层:
- 添加以下 import 语句:
import asyncio
from azure.storage.blob import (
StandardBlobTier
)
from azure.identity.aio import DefaultAzureCredential
from azure.storage.blob.aio import (
BlobServiceClient,
BlobClient
)
- 添加代码以使用
asyncio.run
运行程序。 此函数运行传递的协同例程(我们示例中的main()
),并管理asyncio
事件循环。 使用 async/await 语法声明协同例程。 在此示例中,main()
协同例程首先使用async with
创建顶级BlobServiceClient
,然后调用更改 blob 访问层的方法。 请注意,只有顶级客户端需要使用async with
,因为基于它创建的其他客户端会共享同一连接池。
async def main():
sample = BlobAccessTierSamples()
# TODO: Replace <storage-account-name> with an actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
credential = DefaultAzureCredential()
async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
# Change the blob access tier to cool
blob_client = blob_service_client.get_blob_client(container="sample-container", blob="sample-blob.txt")
await sample.change_blob_access_tier(blob_client=blob_client)
if __name__ == '__main__':
asyncio.run(main())
- 添加代码以更改 blob 的访问层。 该代码与同步示例相同,除了该方法使用
async
关键字声明,await
关键字在调用set_standard_blob_tier
方法时使用。
async def change_blob_access_tier(self, blob_client: BlobClient):
# Change the blob access tier to cool
await blob_client.set_standard_blob_tier(StandardBlobTier.COOL)
有了此基本设置,即可使用 async/await 语法将本文中的其他示例实现为协同例程。
资源
要详细了解如何使用适用于 Python 的 Azure Blob 存储客户端库来设置访问层,请参阅以下资源。
REST API 操作
Azure SDK for Python 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 Python 范例与 REST API 操作进行交互。 用于设置访问层的客户端库方法使用以下 REST API 操作:
- Set Blob Tier (REST API)