Azure 存储 Blob 清单

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 字符串 指示库存规则适用于块状物还是容器。 有效值为 blobcontainer Yes
schedule 字符串 指定何时运行该规则。 有效值为 dailyweekly Yes
schemaFields JSON 数组 列出要包含在清单中的架构字段。 Yes

规则筛选器

请使用以下筛选器自定义斑点库存报告:

筛选器名称 筛选器类型 Notes Required?
blobTypes 预定义的枚举值数组 对于启用了分层命名空间的帐户,有效值为appendBlobblockBlob;对于其他帐户,有效值为pageBlobblockBlobappendBlob。 该字段不适用于集装箱库存(objectTypecontainer)。 Yes
creationTime Number 说明了那个斑点是在几天前被创造出来的。 例如,值 3 仅包含在过去三天内创建的 Blob。 No
prefixMatch 最多10个字符串的数组 如果你没有定义 prefixMatch 或提供空前缀,该规则适用于存储账户内的所有 blob。 前缀必须是容器名称前缀或容器名称。 例如,containercontainer1/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。 该字段不适用于集装箱库存(objectTypecontainer)。 No
includeBlobVersions boolean 指定清单是否包含 Blob 版本。 默认值为 false。 该字段不适用于集装箱库存(objectTypecontainer)。 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(必填) Yes Yes
Creation-Time Yes Yes
Last-Modified Yes Yes
最后访问时间1 Yes Yes
ETag Yes Yes
Content-Length Yes Yes
Content-Type Yes Yes
Content-Encoding Yes Yes
Content-Language Yes Yes
Content-CRC64 Yes Yes
Content-MD5 Yes Yes
Cache-Control Yes Yes
Cache-Disposition Yes Yes
BlobType Yes Yes
AccessTier Yes Yes
AccessTierChangeTime Yes Yes
LeaseStatus Yes Yes
LeaseState Yes Yes
ServerEncrypted Yes Yes
CustomerProvidedKeySHA256 Yes Yes
Metadata Yes Yes
Expiry-Time No Yes
hdi_isfolder No Yes
Owner No Yes
Group No Yes
Permissions No Yes
Acl No Yes
Snapshot(在选择将快照包含到报告中时可用且必填) Yes Yes
Deleted Yes Yes
DeletionId No Yes
DeletedTime No Yes
RemainingRetentionDays Yes Yes
VersionId(在选择将 Blob 版本包含到报告中时可用且必填) Yes No
IsCurrentVersion(在选择将 Blob 版本包含到报告中时可用且必需) Yes No
TagCount Yes No
Tags Yes No
CopyId Yes Yes
CopySource Yes Yes
CopyStatus Yes Yes
CopyProgress Yes Yes
CopyCompletionTime Yes Yes
CopyStatusDescription Yes Yes
ImmutabilityPolicyUntilDate Yes Yes
ImmutabilityPolicyMode Yes Yes
LegalHold Yes Yes
RehydratePriority Yes Yes
ArchiveStatus Yes Yes
EncryptionScope Yes Yes
IncrementalCopy Yes Yes
x-ms-blob-sequence-number Yes No

1默认禁用。 启用访问时间跟踪(可选)

容器清单支持的自定义架构字段

Note

Data Lake Storage 列显示对启用了分层命名空间功能的帐户的支持。

Field Blob 存储(默认支持) Data Lake Storage
Name(必填) Yes Yes
Last-Modified Yes Yes
ETag Yes Yes
LeaseStatus Yes Yes
LeaseState Yes Yes
LeaseDuration Yes Yes
Metadata Yes Yes
PublicAccess Yes Yes
DefaultEncryptionScope Yes Yes
DenyEncryptionScopeOverride Yes Yes
HasImmutabilityPolicy Yes Yes
HasLegalHold Yes Yes
ImmutableStorageWithVersioningEnabled Yes Yes
Deleted(仅当选择了“包括已删除的容器”时才显示) Yes Yes
Version(仅当选择了“包括已删除的容器”时才显示) Yes Yes
DeletedTime(仅在选择包含已删除容器时出现) Yes Yes
剩余保留天数(仅在选择包含已删除容器时显示) Yes Yes

清单运行

如果将规则配置为每日运行,则该规则将每天运行。 如果你配置规则每周运行,它会在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 字符串 清单运行状态。 可能值为 SucceededPartiallySucceededFailed
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 文件。

    在 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”,直到运行完成。 运行完成后,该字段被设置为完成状态(例如: SucceededFailed)。

功能支持情况

启用 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 版本,请同时使用 NameVersion ID 字段,以标识并只返回唯一的 Blob 和版本。

后续步骤