Azure 存储 blob 库存列出了你存储账户中的容器、blob、blob 版本、快照和相关属性。 该服务每天或每周生成逗号分隔值(CSV)或Apache Parquet格式的报告。
利用库存报告来审核存储账户内容的保留状态、法定保留状态或加密状态。 你还可以分析数据的总规模、年龄、层级分布及其他属性。
Blob 库存可以简化业务工作流程,加快数据处理工作的速度。 它提供 列表容器 和 列表块 API 的计划自动化。 库存规则可根据 Blob 类型、前缀或选定的 Blob 属性筛选报告内容。
Azure 存储 blob 清单适用于以下类型的存储帐户:
- 标准常规用途 v2
- 高级块 blob 存储
- 对象存储
清单功能
Azure 存储 blob inventory 支持以下功能和能力。
Blob 和容器的清单报告
你可以生成 Blob 和容器的清单报告。 有关 blob 的报告可以包含基本 blob、快照、内容长度、blob 版本及其相关属性,例如创建时间和上次修改时间。 报告中没有列出空容器。 容器报告描述容器及其相关属性,如不可篡改性策略状态和法律保留状态。
自定义架构
可以选择要在报告中显示的字段。 从支持的字段列表中进行选择。 本文稍后会提供该列表。
CSV 和 Apache Parquet 输出格式
可以生成 CSV 或 Apache Parquet 输出格式的清单报告。
每份清单报告的清单文件和 Azure 事件网格事件
该服务为每个库存报告生成一个清单文件和一个 Azure 事件网格 事件。 文章稍后会详细描述这些物品。
启用清单报告
通过在存储帐户中添加带有一个或多个规则的策略来启用 Blob 清单报告。 有关指导,请参阅启用 Azure 存储 Blob 清单报告。
升级清单策略
如果你在 2021 年 6 月之前配置了 Azure 存储 Blob 清单,请加载该策略,进行任何必要的更改,然后保存。 当你重新加载策略时,服务会将每个规则的目的地、清单文件和 Azure 事件网格 事件设置填充默认值。 你可以改变这些价值观。
每个规则都支持一个目的地容器,而不是在策略层面共享一个目的地。
该服务会为每个规则生成一个清单文件和一个 Azure 事件网格 事件,而不是为策略生成这些内容。
清单策略
要配置库存报告,可以在JSON文档中添加包含一个或多个规则的库存策略。
{
"enabled": true,
"rules": [
{
"enabled": true,
"name": "inventoryrule1",
"destination": "inventory-destination-container",
"definition": {
"filters": {
"blobTypes": ["blockBlob"]
},
"format": "csv",
"objectType": "blob",
"schedule": "daily",
"schemaFields": ["Name"]
}
},
{
"enabled": true,
"name": "inventoryrule2",
"destination": "inventory-destination-container",
"definition": {
"filters": {},
"format": "csv",
"objectType": "container",
"schedule": "weekly",
"schemaFields": ["Name"]
}
}]
}
通过选择 Azure 门户的“Blob 清单”部分中的“代码视图”选项卡,查看清单策略的 JSON。
| 参数名称 | 参数类型 | Notes | Required? |
|---|---|---|---|
enabled |
boolean | 用于禁用整个策略。 当设置为 true( true)时,规则级 enabled 字段会覆盖该参数。 禁用时,对所有规则禁用库存。 |
Yes |
rules |
规则对象的数组 | 一个策略至少需要包含一个规则。 每个策略最多支持 100 个规则。 | Yes |
清单规则
规则捕获用于生成清单报表的筛选条件和输出参数。 每个规则都会创建一个清单报表。 规则可以有重叠的前缀。 Blob 可以出现在多个清单中,具体取决于规则定义。
策略中的每个规则具有多个参数:
| 参数名称 | 参数类型 | Notes | Required? |
|---|---|---|---|
name |
字符串 | 规则名称最多只能包含 256 个字母数字字符(区分大小写)。 名称在策略中必须唯一。 | Yes |
enabled |
boolean | 一个用于启用或禁用规则的标志。 默认值为 true。 | Yes |
definition |
JSON 清单规则定义 | 每个定义均由规则筛选器集组成。 | Yes |
destination |
字符串 | 服务生成所有库存文件的目的地容器。 目标容器必须已经存在。 |
全局“已启用 blob 清单”标志优先于规则中的 enabled 参数。
规则定义
| 参数名称 | 参数类型 | Notes | Required |
|---|---|---|---|
filters |
JSON | 过滤器判断一个斑点还是容器是属于库存的一部分。 | Yes |
format |
字符串 | 确定库存文件的输出格式。 有效的数值为 csv (CSV格式)和 parquet (Apache Parquet格式)。 |
Yes |
objectType |
字符串 | 指示库存规则适用于块状物还是容器。 有效值为 blob 和 container。 |
Yes |
schedule |
字符串 | 指定何时运行该规则。 有效值为 daily 和 weekly。 |
Yes |
schemaFields |
JSON 数组 | 列出要包含在清单中的架构字段。 | Yes |
规则筛选器
请使用以下筛选器自定义斑点库存报告:
| 筛选器名称 | 筛选器类型 | Notes | Required? |
|---|---|---|---|
blobTypes |
预定义的枚举值数组 | 对于启用了分层命名空间的帐户,有效值为appendBlob和blockBlob;对于其他帐户,有效值为pageBlob、blockBlob和appendBlob。 该字段不适用于集装箱库存(objectType: container)。 |
Yes |
creationTime |
Number | 说明了那个斑点是在几天前被创造出来的。 例如,值 3 仅包含在过去三天内创建的 Blob。 |
No |
prefixMatch |
最多10个字符串的数组 | 如果你没有定义 prefixMatch 或提供空前缀,该规则适用于存储账户内的所有 blob。 前缀必须是容器名称前缀或容器名称。 例如,container 或 container1/foo。 |
No |
excludePrefix |
最多10个字符串的数组 | 指定要从库存报告中排除的 Blob 路径。 A excludePrefix 必须是容器名称前缀或容器名称。 当 excludePrefix 为空时,报告会列出名称与任意 prefixMatch 字符串匹配的所有 blob。如果要包含前缀但排除特定子集,请使用过滤器 excludePrefix 。 例如,若要包含 container-a 下的所有 blob,但不包括 prefixMatch 下的 blob,请将 container-a/folder 设置为 container-a,并将 excludePrefix 设置为 container-a/folder。 |
No |
includeSnapshots |
boolean | 指定库存是否包含快照。 默认值为 false。 该字段不适用于集装箱库存(objectType: container)。 |
No |
includeBlobVersions |
boolean | 指定清单是否包含 Blob 版本。 默认值为 false。 该字段不适用于集装箱库存(objectType: container)。 |
No |
includeDeleted |
boolean | 指定清单是否包含已删除的 Blob。 默认值为 false。 在具有层级命名空间的账户中,该过滤器包括软删除状态的文件夹和blob。报告中只会出现明确删除的文件夹和文件。 删除父文件夹后被删除的子文件夹和文件不包括在内。 |
No |
通过选择 Azure 门户的“Blob 清单”部分中的“代码视图”选项卡,查看清单规则的 JSON。 你在规则定义中指定过滤器。
{
"destination": "inventory-destination-container",
"enabled": true,
"rules": [
{
"definition": {
"filters": {
"blobTypes": ["blockBlob", "appendBlob", "pageBlob"],
"prefixMatch": ["inventorytestcontainer1", "inventorytestcontainer2/abcd", "etc"],
"excludePrefix": ["inventorytestcontainer10", "etc/logs"],
"includeSnapshots": false,
"includeBlobVersions": true
},
"format": "csv",
"objectType": "blob",
"schedule": "daily",
"schemaFields": ["Name", "Creation-Time"]
},
"enabled": true,
"name": "blobinventorytest",
"destination": "inventorydestinationContainer"
},
{
"definition": {
"filters": {
"prefixMatch": ["inventorytestcontainer1", "inventorytestcontainer2/abcd", "etc"]
},
"format": "csv",
"objectType": "container",
"schedule": "weekly",
"schemaFields": ["Name", "HasImmutabilityPolicy", "HasLegalHold"]
},
"enabled": true,
"name": "containerinventorytest",
"destination": "inventorydestinationContainer"
}
]
}
Blob 清单支持的自定义架构字段
Note
Data Lake Storage 列显示对启用了分层命名空间功能的帐户的支持。
| Field | Blob 存储(默认支持) | Data Lake Storage |
|---|---|---|
| Name(必填) |
|
|
| Creation-Time |
|
|
| Last-Modified |
|
|
| 最后访问时间1 |
|
|
| ETag |
|
|
| Content-Length |
|
|
| Content-Type |
|
|
| Content-Encoding |
|
|
| Content-Language |
|
|
| Content-CRC64 |
|
|
| Content-MD5 |
|
|
| Cache-Control |
|
|
| Cache-Disposition |
|
|
| BlobType |
|
|
| AccessTier |
|
|
| AccessTierChangeTime |
|
|
| LeaseStatus |
|
|
| LeaseState |
|
|
| ServerEncrypted |
|
|
| CustomerProvidedKeySHA256 |
|
|
| Metadata |
|
|
| Expiry-Time |
|
|
| hdi_isfolder |
|
|
| Owner |
|
|
| Group |
|
|
| Permissions |
|
|
| Acl |
|
|
| Snapshot(在选择将快照包含到报告中时可用且必填) |
|
|
| Deleted |
|
|
| DeletionId |
|
|
| DeletedTime |
|
|
| RemainingRetentionDays |
|
|
| VersionId(在选择将 Blob 版本包含到报告中时可用且必填) |
|
|
| IsCurrentVersion(在选择将 Blob 版本包含到报告中时可用且必需) |
|
|
| TagCount |
|
|
| Tags |
|
|
| CopyId |
|
|
| CopySource |
|
|
| CopyStatus |
|
|
| CopyProgress |
|
|
| CopyCompletionTime |
|
|
| CopyStatusDescription |
|
|
| ImmutabilityPolicyUntilDate |
|
|
| ImmutabilityPolicyMode |
|
|
| LegalHold |
|
|
| RehydratePriority |
|
|
| ArchiveStatus |
|
|
| EncryptionScope |
|
|
| IncrementalCopy |
|
|
| x-ms-blob-sequence-number |
|
|
1默认禁用。 启用访问时间跟踪(可选)。
容器清单支持的自定义架构字段
Note
Data Lake Storage 列显示对启用了分层命名空间功能的帐户的支持。
| Field | Blob 存储(默认支持) | Data Lake Storage |
|---|---|---|
| Name(必填) |
|
|
| Last-Modified |
|
|
| ETag |
|
|
| LeaseStatus |
|
|
| LeaseState |
|
|
| LeaseDuration |
|
|
| Metadata |
|
|
| PublicAccess |
|
|
| DefaultEncryptionScope |
|
|
| DenyEncryptionScopeOverride |
|
|
| HasImmutabilityPolicy |
|
|
| HasLegalHold |
|
|
| ImmutableStorageWithVersioningEnabled |
|
|
| Deleted(仅当选择了“包括已删除的容器”时才显示) |
|
|
| Version(仅当选择了“包括已删除的容器”时才显示) |
|
|
| DeletedTime(仅在选择包含已删除容器时出现) |
|
|
| 剩余保留天数(仅在选择包含已删除容器时显示) |
|
|
清单运行
如果将规则配置为每日运行,则该规则将每天运行。 如果你配置规则每周运行,它会在UTC的每个星期天运行。
一个库存盘点任务在失败前最长可能运行六天。 想了解影响运行时间的因素,请参见 Blob 库存性能特性。
每次运行不会重叠,因此必须完成一次运行,才能开始下一次相同规则的运行。 例如,如果前一天的每日规则运行仍在进行中,服务当天不会启动新的运行。 每周规则都会在每个星期日执行,无论上一次执行成功还是失败。 如果某次运行未能成功完成,请在联系客服前检查后续运行情况。 运行性能可能有所不同,因此后续运行可能会成功完成。
清单策略将完整读取或写入。 不支持部分更新。 每天都会评估清单规则。 如果你在服务评估当天的政策后更改规则定义,服务会在第二天评估你的更新。
清单已完成事件
针对规则完成清单运行后,将生成 BlobInventoryPolicyCompleted 事件。 如果清单运行由于在开始运行之前出现用户错误而失败,则也会发生此事件。 例如,策略无效或目的地容器缺失会触发该事件。 以下 JSON 展示了一个示例 BlobInventoryPolicyCompleted 事件。
{
"topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/BlobInventory/providers/Microsoft.EventGrid/topics/BlobInventoryTopic",
"subject": "BlobDataManagement/BlobInventory",
"eventType": "Microsoft.Storage.BlobInventoryPolicyCompleted",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"data": {
"scheduleDateTime": "2021-05-28T03:50:27Z",
"accountName": "testaccount",
"ruleName": "Rule_1",
"policyRunStatus": "Succeeded",
"policyRunStatusMessage": "Inventory run succeeded, refer manifest file for inventory details.",
"policyRunId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"manifestBlobUrl": "https://testaccount.blob.core.chinacloudapi.cn/inventory-destination-container/2021/05/26/13-25-36/Rule_1/Rule_1-manifest.json"
},
"dataVersion": "1.0",
"metadataVersion": "1",
"eventTime": "2021-05-28T15:03:18Z"
}
下表描述了 BlobInventoryPolicyCompleted 事件的架构。
| Field | 类型 | Description |
|---|---|---|
| scheduleDateTime | 字符串 | 清单规则的计划时间。 |
| accountName | 字符串 | 存储帐户名称。 |
| ruleName | 字符串 | 规则名称。 |
| policyRunStatus | 字符串 | 清单运行状态。 可能值为 Succeeded、PartiallySucceeded 和 Failed。 |
| policyRunStatusMessage | 字符串 | 有关清单运行的状态消息。 |
| policyRunId | 字符串 | 清单运行的策略运行 ID。 |
| manifestBlobUrl | 字符串 | 有关清单运行的清单文件的 Blob URL。 |
库存输出
每个库存规则都会在该规则指定的库存目的地容器中创建一组文件。 库存输出可通过以下路径获得: https://<accountName>.blob.core.chinacloudapi.cn/<inventory-destination-container>/YYYY/MM/DD/HH-MM-SS/<ruleName> 其中:
- accountName 是你的 Azure Blob 存储帐户名称。
- “inventory-destination-container” 是您在清单规则中指定的目标容器。
- YYYY/MM/DD/HH-MM-SS 是库存开始的时间。
- ruleName 是清单规则名称。
清单文件
规则的每个清单运行会生成以下文件:
清单文件:规则的清单运行会生成 CSV 或 Apache Parquet 格式的文件。 每个此类文件包含匹配的对象及其元数据。
Important
如果物品数量较多,库存运行会生成多个文件。 若要了解详细信息,请参阅多个清单文件输出常见问题解答。
采用 Apache Parquet 格式的报告中的日期格式如下:
timestamp_millis [number of milliseconds since 1970-01-01 00:00:00 UTC]。 对于 CSV 格式的文件,第一行始终是架构行。 下图显示了在 Microsoft Excel 中打开的清单 CSV 文件。
Important
清单文件中的 Blob 路径可能不按任何特定的顺序显示。
校验和文件: 校验和文件包含
manifest.json文件内容的 MD5 校验和。 校验和文件的名称为<ruleName>-manifest.checksum。 生成了检验和文件即表示清单规则运行已完成。清单文件:
manifest.json文件包含为该规则生成的库存文件的详细信息。 该文件的名称为<ruleName>-manifest.json。 该文件还记录了规则定义和该规则的库存路径。 以下 JSON 展示了示例manifest.json文件的内容。{ "destinationContainer" : "inventory-destination-container", "endpoint" : "https://testaccount.blob.core.chinacloudapi.cn", "files" : [ { "blob" : "2021/05/26/13-25-36/Rule_1/Rule_1.csv", "size" : 12710092 } ], "inventoryCompletionTime" : "2021-05-26T13:35:56Z", "inventoryStartTime" : "2021-05-26T13:25:36Z", "ruleDefinition" : { "filters" : { "blobTypes" : [ "blockBlob" ], "includeBlobVersions" : false, "includeSnapshots" : false, "prefixMatch" : [ "penner-test-container-100003" ] }, "format" : "csv", "objectType" : "blob", "schedule" : "daily", "schemaFields" : [ "Name", "Creation-Time", "BlobType", "Content-Length", "LastAccessTime", "Last-Modified", "Metadata", "AccessTier" ] }, "ruleName" : "Rule_1", "status" : "Succeeded", "summary" : { "objectCount" : 110000, "totalObjectSize" : 23789775 }, "version" : "1.0" }此文件是在运行开始时创建的。 此文件的“
status”字段设置为“Pending”,直到运行完成。 运行完成后,该字段被设置为完成状态(例如:Succeeded或Failed)。
功能支持情况
启用 Data Lake Storage Gen2、网络文件系统 (NFS) 3.0 协议或 SSH 文件传输协议 (SFTP) 可能会影响对此功能的支持。 如果已启用这些功能中的某一项,请参阅 Azure 存储帐户中的 Blob 存储功能支持,以评估对此功能的支持。
已知问题和限制
本部分介绍了 Azure 存储 blob 清单功能的限制和已知问题。
库存报告的对象数量和数据大小不应与账单进行比较
库存报告不包含元数据、系统日志和属性,所以不要将其与存储账户的计费对象数量和数据大小进行比较。
在某些情况下,库存工作完成时间更长
在以下情况下,盘点工作可能需要更长时间:
你会添加大量新数据。
你第一次运行一条规则或一套规则。
首次库存盘点的耗时可能比后续运行更长。
清单运行会处理启用了分层命名空间的账户中的大量数据。
对于启用了分层命名空间且拥有数亿个 Blob 的账户,库存作业可能需要一天以上才能完成。 有时,清单作业会失败,并且不会创建清单文件。 如果某个作业未成功完成,请检查后续作业以确定它们是否已完成,然后再联系支持人员。
没有针对特定日期以可追溯方式生成报表的选项。
清单作业无法将报表写入具有对象复制策略的容器
对象复制策略可能会阻止清单作业将清单报告写入目标容器。 有些其他场景可以归档报表,或者在报告部分完成时使报表变为不可变,这可能导致库存作业失败。
库存与不可变存储
如果账户中启用了版本级不可变性支持,或者你在库存策略中定义的目标容器上启用了版本级不可变性,你就无法在账户中配置库存策略。
报告可能会排除具有分层命名空间的帐户中的软删除 blob
如果你在启用软删除时删除容器或目录,服务会标记该容器及其所有内容为软删除。 然而,只有容器或目录(以零长度的blob报告)会出现在库存报告中。 即使将策略的 includeDeleted 字段设为 true,报告也不包括已软删除的子 Blob。 这种行为可能导致 Azure 门户中的容量指标与库存报告之间的差异。
只有你明确删除的斑点才会出现在报告中。 要获得所有软删除blob(目录和所有子blob)的完整列表,工作负载应在删除目录本身之前,先删除目录中的每个blob。
处理 Blob 清单中的重复项
Blob 清单在分布式系统上运行,这意味着在极少数情况下,报表中可能会出现重复的 Blob 条目。
如果你的应用场景需要在对清单报告进行后处理时使用唯一的 blob 条目,可以使用 Name 字段仅返回唯一的 blob 条目。
如果您的报告包含 Blob 版本,请同时使用 Name 和 Version ID 字段,以标识并只返回唯一的 Blob 和版本。