

# 使用 S3 元数据表发现您的数据
<a name="metadata-tables-overview"></a>

Amazon S3 元数据通过自动捕获通用存储桶中对象的元数据，并将其存储在您可以查询的只读、完全托管式 Apache Iceberg 表中，从而加快数据发现速度。这些只读表称为*元数据表*。在通用存储桶中添加、更新或移除对象时，S3 元数据会自动刷新相应的元数据表，以反映最新的更改。

默认情况下，S3 元数据提供三种类型的元数据：
+ [系统定义的元数据](UsingMetadata.md#SysMetadata)，例如对象的创建时间和存储类
+ 自定义元数据，例如标签和对象上传期间包含的[用户定义的元数据](UsingMetadata.md#UserMetadata)
+ 事件元数据，例如何时更新或删除对象，以及发出请求的 AWS 账户

借助 S3 元数据，您可以轻松查找、存储和查询 S3 对象的元数据，这样您就可以快速准备数据，以用于业务分析、内容检索、人工智能和机器学习（AI/ML）模型训练等。

对于每个通用存储桶，可以创建一个元数据表配置，其中包含两个互补的元数据表：
+ **日记表**：默认情况下，元数据表配置包含一个*日记表*，用于捕获存储桶中的对象所发生的事件。日记表近乎实时地记录对数据所做的更改，有助于您识别上传到存储桶的新数据、跟踪最近删除的对象、监控生命周期转换等。日记表记录新对象以及对于对象及其元数据的更新（那些需要 `PUT` 或 `DELETE` 操作的更新）。

  日记表仅捕获在您创建元数据表配置后发生的更改事件（例如上传、更新和删除）的元数据。由于此表是可查询的，因此可以通过简单的 SQL 查询来审计对存储桶的更改。

  每个元数据表配置都需要日记表。（在 S3 元数据的初始版本中，日记表称为“元数据表”。）

  有关在日记表中存储哪些数据的更多信息，请参阅 [S3 元数据日记表架构](metadata-tables-schema.md)。

  为了有助于最大限度地降低存储成本，可以选择启用日记表记录过期。有关更多信息，请参阅 [使日记表记录过期](metadata-tables-expire-journal-table-records.md)。
+ **实时清单表**：（可选）可以将*实时清单表*添加到元数据表配置中。实时清单表提供存储桶中所有对象及其版本的简单、可查询的清单，以便您可以确定数据的最新状态。

  可以使用实时清单表，通过识别要为各种工作负载处理的对象，来简化和加快业务工作流程和大数据作业。例如，可以查询实时清单表来查找存储在特定存储类别中的所有对象、带有特定标签的所有对象，以及未通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密的所有对象等。

  当您为元数据表配置启用实时清单表时，该表将经历一个称为*回填*的过程，在这一过程中，Amazon S3 扫描通用存储桶，以检索存储桶中存在的所有对象的初始元数据。根据存储桶中的对象数量，此过程可能需要若干分钟（至少 15 分钟）到几小时。完成回填过程后，实时清单表的状态将从**正在回填**更改为**活跃**。完成回填后，对于对象的更新通常会在一小时内反映在实时清单表中。

  您需要为回填清单表付费。如果通用存储桶包含超过十亿个对象，则还需要为实时清单表支付每月费用。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

  有关在实时清单表中存储哪些数据的更多信息，请参阅 [S3 元数据实时清单表架构](metadata-tables-inventory-schema.md)。

元数据表存储在 AWS 托管式 S3 表存储桶中，该存储桶提供针对表格数据进行优化的存储。要查询元数据，可以将表存储桶与 Amazon SageMaker 智能湖仓集成。这种集成使用 AWS Glue Data Catalog 和 AWS Lake Formation，支持 AWS 分析服务自动发现和访问表数据。

在将表存储桶与 AWS Glue Data Catalog 集成后，可以使用 AWS 分析服务（如 Amazon Athena、Amazon EMR 和 Amazon Redshift）直接查询元数据表。还可以使用 Amazon Quick 通过查询数据创建交互式控制面板。有关将 AWS 托管式 S3 表存储桶与 Amazon SageMaker 智能湖仓集成的更多信息，请参阅[将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

还可以使用 AWS Glue Iceberg 端点、Amazon S3 表类数据存储服务 Iceberg REST 端点或适用于 Apache Iceberg 的 Amazon S3 表类数据存储服务目录客户端目录，通过 Apache Spark、Apache Trino 和支持 Apache Iceberg 格式的任何其它应用程序来查询元数据表。有关访问元数据表的更多信息，请参阅[访问表数据](s3-tables-access.md)。

有关 S3 元数据定价，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

## 元数据表的工作原理
<a name="metadata-tables-how-they-work"></a>

元数据表由 Amazon S3 管理，而不能由 Amazon S3 本身以外的任何 IAM 主体进行修改。但是，可以删除元数据表。因此，元数据表是只读的，这有助于确保它们正确地反映通用存储桶的内容。

要生成对象元数据并将其存储在 AWS 托管式元数据表中，需要为通用存储桶创建元数据表配置。Amazon S3 设计为持续更新元数据表，以反映对数据的最新更改，只要配置在通用存储桶上处于活动状态即可。

在创建元数据表配置之前，确保您拥有创建和管理元数据表所必需的 AWS Identity and Access Management（IAM）权限。有关更多信息，请参阅 [为配置元数据表设置权限](metadata-tables-permissions.md)。

**元数据表存储、组织和加密**  
创建元数据表配置时，元数据表存储在 AWS 托管式表存储桶中。您的账户和同一区域中的所有元数据表配置都存储在单个 AWS 托管式表存储桶中。这些 AWS 托管式表存储桶命名为 `aws-s3`，并具有以下 Amazon 资源名称（ARN）格式：

`arn:aws:s3tables:region:account_id:bucket/aws-s3`

例如，如果账户 ID 为 123456789012，而通用存储桶位于美国东部（弗吉尼亚州北部）(`us-east-1`)，则 AWS 托管式表存储桶也将在美国东部（弗吉尼亚州北部）(`us-east-1`) 创建并具有以下 ARN：

`arn:aws:s3tables:us-east-1:123456789012:bucket/aws-s3`

默认情况下，AWS 托管式表存储桶通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。创建第一个元数据配置后，可以将 AWS 托管式表存储桶的默认加密设置设为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。有关更多信息，请参阅 [Encryption for AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html#aws-managed-buckets-encryption) 和[在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](s3-tables-kms-specify.md)。

在 AWS 托管式表存储桶中，配置的元数据表通常存储在命名空间中，命名格式如下：

`b_general-purpose-bucket-name`

**注意**  
如果通用存储桶名称包含任何句点，则这些句点将在命名空间名称中转换为下划线 (`_`)。
如果通用存储桶是在 2018 年 3 月 1 日之前创建的，则其名称可能包含大写字母和下划线，长度也可能不超过 255 个字符。如果存储桶名称具有这些特征，则元数据表命名空间将具有不同的格式。通用存储桶名称将以 `b_` 为前缀，截断为 63 个字符，全部转换为小写，并以哈希作为后缀。

元数据表具有以下 Amazon 资源名称（ARN）格式，其中包括元数据表的表 ID：

`arn:aws:s3tables:region-code:account-id:bucket/aws-s3/table/table-id`

例如，美国东部（弗吉尼亚州北部）区域中的元数据表具有如下所示的 ARN：

`arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/a12bc345-67d8-912e-3456-7f89123g4h56`

日记表具有名称 `journal`，而实时清单表具有名称 `inventory`。

创建元数据表配置时，可以选择通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密 AWS 托管式元数据表。如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。只能在创建表的过程中为表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。要为元数据表指定 SSE-KMS，您必须具有特定的权限。有关更多信息，请参阅 [SSE-KMS 的权限](metadata-tables-permissions.md#metadata-kms-permissions)。

元数据表的加密设置优先于默认的存储桶级加密设置。如果不为表指定加密，它将继承存储桶中的默认加密设置。

AWS 托管式表存储桶不计入 S3 表类数据存储服务配额。有关使用 AWS 托管式表存储桶和 AWS 托管式表的更多信息，请参阅 [Working with AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html)。

要监控对元数据表配置的更新，可以使用 AWS CloudTrail。有关更多信息，请参阅 [CloudTrail 日志记录跟踪的 Amazon S3 存储桶级操作](cloudtrail-logging-s3-info.md#cloudtrail-bucket-level-tracking)。

**元数据表维护和记录过期**  
为了使 元数据表保持最佳性能，Amazon S3 会定期对表执行维护活动，例如压缩和未引用文件移除。这些维护活动既有助于最大限度地降低存储元数据表的成本，又有助于优化查询性能。这种表维护是自动进行的，无需您选择加入或持续管理。

**注意**  
您无法控制日记表或清单表快照的过期。对于每个表，Amazon S3 存储至少 1 个快照，最长可存储 24 小时。
为了有助于最大限度地降低成本，可以配置日记表记录过期。默认情况下，日记表记录不会过期，并且日记表记录必须保留至少 7 天。有关更多信息，请参阅 [使日记表记录过期](metadata-tables-expire-journal-table-records.md)。

**Topics**
+ [元数据表的工作原理](#metadata-tables-how-they-work)
+ [元数据表限制和局限性](metadata-tables-restrictions.md)
+ [S3 元数据日记表架构](metadata-tables-schema.md)
+ [S3 元数据实时清单表架构](metadata-tables-inventory-schema.md)
+ [配置元数据表](metadata-tables-configuring.md)
+ [查询元数据表](metadata-tables-querying.md)
+ [对 S3 元数据进行故障排除](metadata-tables-troubleshooting.md)

# 元数据表限制和局限性
<a name="metadata-tables-restrictions"></a>

Amazon S3 元数据具有以下限制和局限性：
+ S3 表数据目前仅在部分区域提供。有关更多信息，请参阅 [S3 元数据 AWS 区域](#metadata-tables-regions)。
+ S3 元数据支持通用存储桶所支持的所有存储类别。对于 S3 Intelligent-Tiering 存储类，元数据表中未显示特定层。
+ 创建元数据表配置时，元数据表存储在 AWS 托管式表存储桶中。不能将配置存储在客户管理的表存储桶中。
+ 目录存储桶、表存储桶或向量存储桶不支持 S3 元数据。您只能为通用存储桶创建元数据表配置。日记表仅捕获在您创建元数据表配置后发生的更改事件（例如上传、更新和删除）的元数据。
+ 您无法控制日记表或清单表快照的过期。对于每个表，Amazon S3 存储至少 1 个快照，最长可存储 24 小时。

  为了有助于最大限度地降低成本，可以配置日记表记录过期。默认情况下，日记表记录不会过期，并且日记表记录必须保留至少 7 天。有关更多信息，请参阅 [使日记表记录过期](metadata-tables-expire-journal-table-records.md)。
+ 您只能为整个通用存储桶创建元数据表配置。您不能在前缀级应用元数据表配置。
+ 您无法暂停和恢复对元数据表的更新。但是，可以删除日记表或实时清单表的关联元数据配置。删除配置并不会删除关联的日记表或清单表。要重新创建配置，必须先删除旧的日记表或清单表，然后 Amazon S3 才能创建新的日记表或清单表。重新启用清单表时，Amazon S3 会创建一个新的清单表，并且您需要再次支付回填新清单表的费用。
+ 元数据表所包含的元数据与通过 S3 清单或 Amazon S3 REST API 提供的元数据不完全相同。例如，元数据表中未提供以下信息：
  + S3 生命周期到期资格或转换状态
  + 对象锁定保留期或治理模式
  + 对象访问控制列表（ACL）信息
  + 复制状态
+ 当您使用 Amazon Athena 或 Amazon Redshift 查询元数据表时，必须用引号 (`"`) 或反勾号 (```) 将元数据表命名空间名称括起来，否则查询可能无法运行。有关示例，请参阅 [元数据表查询示例](metadata-tables-example-queries.md)。
+ 在 Amazon EMR 或其它第三方引擎上使用 Apache Spark 查询元数据表时，建议您使用 Amazon S3 表类数据存储服务 Iceberg REST 端点。如果不使用此端点，查询可能无法成功运行。有关更多信息，请参阅 [使用 Amazon S3 表类数据存储服务 Iceberg REST 端点访问表](s3-tables-integrating-open-source.md)。

## S3 元数据 AWS 区域
<a name="metadata-tables-regions"></a>

S3 元数据目前在以下 AWS 区域中可用：


|  AWS 区域 名称  |  AWS 区域 代码  | 
| --- | --- | 
|  非洲（开普敦）  |  `af-south-1`  | 
|  亚太地区（香港）  |  `ap-east-1`  | 
|  亚太地区（雅加达）  |  `ap-southeast-3`  | 
|  亚太地区（墨尔本）  |  `ap-southeast-4`  | 
|  亚太地区（孟买）  |  `ap-south-1`  | 
|  亚太地区（大阪）  |  `ap-northeast-3`  | 
|  亚太地区（首尔）  |  `ap-northeast-2`  | 
|  亚太地区（新加坡）  |  `ap-southeast-1`  | 
|  亚太地区（悉尼）  |  `ap-southeast-2`  | 
|  亚太地区（东京）  |  `ap-northeast-1`  | 
|  加拿大（中部）  |  `ca-central-1`  | 
|  加拿大西部（卡尔加里）  |  `ca-west-1`  | 
|  欧洲地区（法兰克福）  |  `eu-central-1`  | 
|  欧洲（苏黎世）  |  `eu-central-2`  | 
|  欧洲地区（爱尔兰）  |  `eu-west-1`  | 
|  欧洲地区（伦敦）  |  `eu-west-2`  | 
|  欧洲地区（米兰）  |  `eu-south-1`  | 
|  欧洲地区（巴黎）  |  `eu-west-3`  | 
|  欧洲（西班牙）  |  `eu-south-2`  | 
|  欧洲地区（斯德哥尔摩）  |  `eu-north-1`  | 
|  以色列（特拉维夫）  |  `il-central-1`  | 
|  中东（巴林）  |  `me-south-1`  | 
|  中东（阿联酋）  |  `me-central-1`  | 
|  南美洲（圣保罗）  |  `sa-east-1`  | 
|  美国东部（弗吉尼亚州北部）  |  `us-east-1`  | 
|  美国东部（俄亥俄州）  |  `us-east-2`  | 
|  美国西部（北加利福尼亚）  |  `us-west-1`  | 
|  美国西部（俄勒冈州）  |  `us-west-2`  | 

# S3 元数据日记表架构
<a name="metadata-tables-schema"></a>

日记表近乎实时地记录对数据所做的更改，有助于您识别上传到存储桶的新数据、跟踪最近删除的对象、监控生命周期转换等。日记表记录新对象以及对于对象及其元数据的更新（那些需要 `PUT` 或 `DELETE` 操作的更新）。由于此表是可查询的，因此可以通过简单的 SQL 查询来审计对存储桶的更改。

可以将日记表用于安全、审计和合规使用案例，以跟踪存储桶中已上传、删除和更改的对象。例如，可以查询日记表来回答如下问题：
+ S3 生命周期在过去 24 小时内删除了哪些对象？
+ 最近的 `PUT` 请求来自哪些 IP 地址？
+ 在过去 7 天内，哪些 AWS Key Management Service（AWS KMS）密钥用于 `PUT` 请求？
+ Amazon Bedrock 在过去五天内创建了存储桶中的哪些对象？

Amazon S3 元数据日记表包含行和列。每行代表一个突变事件，该事件在您的通用存储桶中创建、更新或删除了一个对象。这些事件中大多数是用户操作的结果，但其中一些事件是 Amazon S3 代表您执行的操作的结果，例如 S3 生命周期到期或存储类别转换。

S3 元数据日记表与通用存储桶中已发生的更改保持最终一致。在某些情况下，当 S3 元数据收到创建或更新对象的通知时，该对象可能已经在存储桶中被覆盖或删除。在此类情况下，将不再能够检索对象，并且某些列可能会显示一个 NULL 值来指示缺少元数据架构。

下面是名为 `amzn-s3-demo-bucket:` 的通用存储桶的日记表示例：

```
bucket                key                        sequence_number                                                                                          record_type   record_timestamp           version_id   is_delete_marker   size   last_modified_date   e_tag	                           storage_class  is_multipart   encryption_status   is_bucket_key_enabled   kms_key_arn                                                                   checksum_algorithm   object_tags   user_metadata	                                                                                                                 requester      source_ip_address   request_id 
amzn-s3-demo-bucket   Finance/statement1.pdf     80e737d8b4d82f776affffffffffffffff006737d8b4d82f776a00000000000000000000000000000000000000000000000072   CREATE        2024-11-15 23:26:44.899                 FALSE              6223   11/15/2024 23:26     e131b86632dda753aac4018f72192b83    STANDARD	  FALSE          SSE-KMS             FALSE                   arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890df   SSECRC32             {}            {count -> Asia, customs -> false, family -> true, location -> Mary, name -> football, user -> United States}                       111122223333   192.0.2.1           CVK8FWYRW0M9JW65
amzn-s3-demo-bucket   s3-dg.pdf                  80e737d8b4e39f1dbdffffffffffffffff006737d8b4e39f1dbd00000000000000000000000000000000000000000000000072   CREATE        2024-11-15 23:26:44.942                 FALSE              3554   11/15/2024 23:26     9bb49efc2d92c05558ddffbbde8636d5    STANDARD	  FALSE          DSSE-KMS            FALSE                   arn:aws:kms:us-east-1:936810216292:key/0dcebce6-49fd-4cae-b2e2-5512ad281afd   SSESHA1              {}            {}                                                                                                                                 111122223333   192.0.2.1           CVKAQDRAZEG7KXAY
amzn-s3-demo-bucket   Development/Projects.xls   80e737d8b4ed9ac5c6ffffffffffffffff006737d8b4ed9ac5c600000000000000000000000000000000000000000000000072   CREATE        2024-11-15 23:26:44.966                 FALSE              7746   11/15/2024 23:26     729a6863e47fb9955b31bfabce984908    STANDARD	  FALSE          SSE-S3              FALSE                   NULL                                                                          SSECRC32             {}            {count -> Asia, customs -> Canada, family -> Billiards, filter -> true, location -> Europe, name -> Asia, user -> United States}   111122223333   192.0.2.1           CVK7Z6XQTQ90BSRV
```

日记表具有以下架构：


| 列名称 | 必填？ | 数据类型 |   | 
| --- | --- | --- | --- | 
| `bucket` | 是 | 字符串 | 通用存储桶名称。有关更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。 | 
| `key` | 是 | 字符串 | 在存储桶中唯一地标识对象的对象键名称（或键）。有关更多信息，请参阅 [为 Amazon S3 对象命名](object-keys.md)。 | 
| `sequence_number` | 是 | 字符串 | 序列号，它是一个序数，包含在给定对象的记录中。要对相同存储桶和键的记录进行排序，您可以按 `sequence_number` 进行排序。对于给定的存储桶和键，按字典顺序排列的较大 `sequence_number` 值意味着该记录是更近被引入存储桶的。 | 
| `record_type` | 是 | 字符串 | 此记录的类型，为以下值之一：`CREATE`、`UPDATE_METADATA` 或 `DELETE`。 `CREATE` 记录表明已将新对象（或对象的新版本）写入存储桶。 `UPDATE_METADATA` 记录捕获对现有对象的可变元数据（例如存储类或标签）的更改。 `DELETE` 记录表明此对象（或该对象的此版本）已被删除。启用版本控制后，`DELETE` 记录代表删除标记或永久删除。可通过查阅可选的 `is_delete_marker` 列来进一步消除其歧义。 有关更多信息，请参阅 [从启用了版本控制的存储桶中删除对象版本](DeletingObjectVersions.md)。  永久删除在所有列中都带有 `NULL`，但 `bucket`、`key`、`sequence_number`、`record_type`、`record_timestamp` 和 `version_id` 列（即那些标记为“必需”的列）*除外*。  | 
| `record_timestamp` | 是 | 时间戳 NTZ（无时区） | 与此记录关联的时间戳。 | 
| `version_id` | 否 | 字符串 |  对象的版本 ID。在存储桶上启用版本控制后，Amazon S3 会为添加到存储桶的对象指定版本号。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。 在您设置版本控制状态之前存储在存储桶中的对象的版本 ID 为 null。  | 
| `is_delete_marker` | 否 | 布尔值 |  对象的删除标记状态。对于作为删除标记的 DELETE 记录，此值为 `TRUE`。对于永久删除，将忽略此值 (`NULL`)。其它记录类型（CREATE 和 UPDATE\$1METADATA）具有值 `FALSE`。有关更多信息，请参阅 [使用删除标记](DeleteMarker.md)。  为删除标记添加的行的 `record_type` 值为 `DELETE`，而不是 `UPDATE_METADATA`。如果删除标记是因为 S3 生命周期到期而创建的，则 `requester` 值为 `s3.amazonaws.com`。   | 
| `size` | 否 | 长整型 | 以字节为单位的对象大小，不包括未完成的分段上传或对象元数据的大小。如果 `is_delete_marker` 为 `TRUE`，则大小为 `0`。有关更多信息，请参阅 [系统定义的对象元数据](UsingMetadata.md#SysMetadata)。 | 
| `last_modified_date` | 否 | 时间戳 NTZ（无时区） | 对象创建日期或上次修改日期（以较晚者为准）。对于分段上传，对象创建日期是开始分段上传的日期。有关更多信息，请参阅 [系统定义的对象元数据](UsingMetadata.md#SysMetadata)。 | 
| `e_tag` | 否 | 字符串 | 实体标签（ETag），这是对象的哈希。ETag 仅反映对于对象的内容的更改，而不反映对于对象的元数据的更改。ETag 可能是对象数据的 MD5 摘要。ETag 是否为 MD5 摘要取决于对象的创建方式及其加密方式。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html)。 | 
| `storage_class` | 否 | 字符串 | 用于存储对象的存储类。以下值之一：`STANDARD`、`REDUCED_REDUNDANCY`、`STANDARD_IA`、`ONEZONE_IA`、`INTELLIGENT_TIERING`、`GLACIER`、`DEEP_ARCHIVE` 或 `GLACIER_IR`。有关更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。 | 
| `is_multipart` | 否 | 布尔值 | 对象的上传类型。如果对象以分段上传形式上传，则此值为 `TRUE`。否则为 `FALSE`。有关更多信息，请参阅 [在 Amazon S3 中使用分段上传来上传和复制对象](mpuoverview.md)。 | 
| `encryption_status` | 否 | 字符串 | 对象的服务器端加密状态，具体取决于使用哪种加密密钥：具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）、具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）、具有 AWS KMS keys的双层服务器端加密（DSSE-C）或具有客户提供的密钥的服务器端加密（SSE-C）。如果对象未加密，则此值为 null。可能的值为 `SSE-S3`、`SSE-KMS`、`DSSE-KMS`、`SSE-C` 或 null。有关更多信息，请参阅 [利用加密来保护数据](UsingEncryption.md)。 | 
| `is_bucket_key_enabled` | 否 | 布尔值 | 对象的 S3 存储桶密钥启用状态。如果对象将 S3 存储桶密钥用于 SSE-KMS，则此值为 `TRUE`。否则为 `FALSE`。有关更多信息，请参阅 [在对象级别配置 S3 存储桶密钥](configuring-bucket-key-object.md)。 | 
| `kms_key_arn` | 否 | 字符串 |  用于加密对象的 KMS 密钥的 Amazon 资源名称（ARN），适用于 `encryption_status` 为 `SSE-KMS` 或 `DSSE-KMS` 的行。如果对象未使用 SSE-KMS 或 DSSE-KMS 进行加密，则值为 null。有关更多信息，请参阅[使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)和[使用具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）](UsingDSSEncryption.md)。  如果某行代表的对象版本在处理删除或覆盖事件时不再存在，则即使 `encryption_status` 列的值为 `SSE-KMS` 或 `DSSE-KMS`，`kms_key_arn` 也将包含 null 值。   | 
| `checksum_algorithm` | 否 | 字符串 | 用于为对象创建校验和的算法，为以下值之一：`CRC64NVME`、`CRC32`、`CRC32C`、`SHA1` 或 `SHA256`。如果不存在校验和，则此值为 null。有关更多信息，请参阅 [使用支持的校验和算法](checking-object-integrity-upload.md#using-additional-checksums)。 | 
| `object_tags` | 否 | Map <String, String> |  与对象关联的对象标签。对象标签存储为键值对的映射。如果对象没有对象标签，则会存储空映射 (`{}`)。有关更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。  如果 `record_type` 值为 `DELETE`，则 `object_tags` 列包含 null 值。如果 `record_type` 值为 `CREATE` 或 `UPDATE_METADATA`，则表示在处理删除或覆盖事件时已不再存在的对象版本的行在 `object_tags` 列中将包含 null 值。   | 
| `user_metadata` | 否 | Map <String, String> |  与对象关联的用户元数据。用户元数据存储为键值对的映射。如果对象没有用户元数据，则会存储空映射 (`{}`)。有关更多信息，请参阅 [用户定义的对象元数据](UsingMetadata.md#UserMetadata)。  如果 `record_type` 值为 `DELETE`，则 `user_metadata` 列包含 null 值。如果 `record_type` 值为 `CREATE` 或 `UPDATE_METADATA`，则表示在处理删除或覆盖事件时已不再存在的对象版本的行在 `user_metadata` 列中将包含 null 值。   | 
| `requester` | 否 | 字符串 | 提出请求的请求者或 AWS 服务 主体的 AWS 账户 ID。例如，如果请求者是 S3 生命周期，则此值为 `s3.amazonaws.com`。 | 
| `source_ip_address` | 否 | 字符串 | 请求的源 IP 地址。对于由用户请求生成的记录，此列包含请求的源 IP 地址。对于 Amazon S3 或其它 AWS 服务 代表用户采取的操作，此列包含 null 值。 | 
| `request_id` | 否 | 字符串 | 与请求关联的请求 ID。 | 

# S3 元数据实时清单表架构
<a name="metadata-tables-inventory-schema"></a>

实时清单表提供存储桶中所有对象及其版本的简单、可查询的清单，以便您可以确定数据的最新状态。对于对象的更新通常会在一小时内反映在清单表中。

可以使用此表，通过确定要为各种工作负载处理的对象，从而简化和加快业务工作流程和大数据作业。例如，可以查询清单表来执行以下操作：
+ 查找存储在 S3 Glacier Deep Archive 存储类别中的所有对象。
+ 创建对象标签的分配或查找不带标签的对象。
+ 查找所有未使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密的对象。

为元数据表配置启用清单表时，该表将经历一个称为*回填*的过程，在此过程中，Amazon S3 扫描通用存储桶，以检索存储桶中所有对象的初始元数据。根据存储桶中的对象数量，此过程可能需要若干分钟（至少 15 分钟）到几小时。完成回填过程后，清单表的状态将从**正在回填**更改为**活跃**。完成回填后，对于对象的更新通常会在一小时内反映在清单表中。

**注意**  
您需要为回填清单表付费。如果通用存储桶包含超过十亿个对象，您还需要为清单表支付每月费用。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

Amazon S3 元数据清单表包含行和列。每行代表通用存储桶中一个对象的当前状态。清单表提供存储桶中所有对象的简单、可查询的清单，以便您可以确定数据的当前状态。

下面是名为 `amzn-s3-demo-bucket:` 的通用存储桶的清单表示例：

```
bucket                key                        sequence_number                                                                                          version_id   is_delete_marker   size   last_modified_date   e_tag	                          storage_class   is_multipart   encryption_status   is_bucket_key_enabled   kms_key_arn                                                                   checksum_algorithm   object_tags   user_metadata	                                                                                                                  
amzn-s3-demo-bucket   Finance/statement1.pdf     80e737d8b4d82f776affffffffffffffff006737d8b4d82f776a00000000000000000000000000000000000000000000000072                FALSE              6223   11/15/2024 23:26     e131b86632dda753aac4018f72192b83    STANDARD	  FALSE          SSE-KMS             FALSE                   arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890df   SSECRC32             {}            {count -> Asia, customs -> false, family -> true, location -> Mary, name -> football, user -> United States}                      
amzn-s3-demo-bucket   s3-dg.pdf                  80e737d8b4e39f1dbdffffffffffffffff006737d8b4e39f1dbd00000000000000000000000000000000000000000000000072                FALSE              3554   11/15/2024 23:26     9bb49efc2d92c05558ddffbbde8636d5    STANDARD	  FALSE          DSSE-KMS            FALSE                   arn:aws:kms:us-east-1:936810216292:key/0dcebce6-49fd-4cae-b2e2-5512ad281afd   SSESHA1              {}            {}                                                                                                                                
amzn-s3-demo-bucket   Development/Projects.xls   80e737d8b4ed9ac5c6ffffffffffffffff006737d8b4ed9ac5c600000000000000000000000000000000000000000000000072                FALSE              7746   11/15/2024 23:26     729a6863e47fb9955b31bfabce984908    STANDARD	  FALSE          SSE-S3              FALSE                   NULL                                                                          SSECRC32             {}            {count -> Asia, customs -> Canada, family -> Billiards, filter -> true, location -> Europe, name -> Asia, user -> United States}
```

清单表具有以下架构：


| 列名称 | 必填？ | 数据类型 |   | 
| --- | --- | --- | --- | 
|  `bucket`  | 是 | 字符串 | 通用存储桶名称。有关更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。 | 
|  `key`  | 是 | 字符串 | 在存储桶中唯一地标识对象的对象键名称（或键）。有关更多信息，请参阅 [为 Amazon S3 对象命名](object-keys.md)。 | 
|  `sequence_number`  | 是 | 字符串 |  序列号，它是一个序数，包含在给定对象的记录中。要对相同存储桶和键的记录进行排序，您可以按 `sequence_number` 进行排序。对于给定的存储桶和键，按字典顺序排列的较大 `sequence_number` 值意味着该记录是更近被引入存储桶的。  | 
|  `version_id`  | 否 | 字符串 |  对象的版本 ID。在存储桶上启用版本控制后，Amazon S3 会为添加到存储桶的对象指定版本号。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。 在您设置版本控制状态之前存储在存储桶中的对象的版本 ID 为 null。  | 
|  `is_delete_marker`  | 否 | 布尔值 |  对象的删除标记状态。如果对象是删除标记，则此值为 `True`。否则为 `False`。有关更多信息，请参阅 [使用删除标记](DeleteMarker.md)。  为删除标记添加的行的 `record_type` 值为 `DELETE`，而不是 `UPDATE_METADATA`。如果删除标记是因为 S3 生命周期到期而创建的，则 `requester` 值为 `s3.amazonaws.com`。   | 
|  `size`  | 否 | 长整型 |  以字节为单位的对象大小，不包括未完成的分段上传或对象元数据的大小。如果 `is_delete_marker` 为 `True`，则大小为 `0`。有关更多信息，请参阅 [系统定义的对象元数据](UsingMetadata.md#SysMetadata)。  | 
|  `last_modified_date`  | 否 | 时间戳 NTZ（无时区） |  对象创建日期或上次修改日期（以较晚者为准）。对于分段上传，对象创建日期是开始分段上传的日期。有关更多信息，请参阅 [系统定义的对象元数据](UsingMetadata.md#SysMetadata)。  | 
|  `e_tag`  | 否 | 字符串 |  实体标签（ETag），这是对象的哈希。ETag 仅反映对于对象的内容的更改，而不反映对于对象的元数据的更改。ETag 可能是对象数据的 MD5 摘要。ETag 是否为 MD5 摘要取决于对象的创建方式及其加密方式。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html)。  | 
|  `storage_class`  | 否 | 字符串 |  用于存储对象的存储类。以下值之一：`STANDARD`、`REDUCED_REDUNDANCY`、`STANDARD_IA`、`ONEZONE_IA`、`INTELLIGENT_TIERING`、`GLACIER`、`DEEP_ARCHIVE` 或 `GLACIER_IR`。有关更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。  | 
|  `is_multipart`  | 否 | 布尔值 |  对象的上传类型。如果对象以分段上传形式上传，则此值为 `True`。否则为 `False`。有关更多信息，请参阅 [在 Amazon S3 中使用分段上传来上传和复制对象](mpuoverview.md)。  | 
|  `encryption_status`  | 否 | 字符串 |  对象的服务器端加密状态，具体取决于使用哪种加密密钥：具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）、具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）、具有 AWS KMS keys的双层服务器端加密（DSSE-C）或具有客户提供的密钥的服务器端加密（SSE-C）。如果对象未加密，则此值为 null。可能的值为 `SSE-S3`、`SSE-KMS`、`DSSE-KMS`、`SSE-C` 或 null。有关更多信息，请参阅 [利用加密来保护数据](UsingEncryption.md)。  | 
|  `is_bucket_key_enabled`  | 否 | 布尔值 |  对象的 S3 存储桶密钥启用状态。如果对象将 S3 存储桶密钥用于 SSE-KMS，则此值为 `True`。否则为 `False`。有关更多信息，请参阅 [在对象级别配置 S3 存储桶密钥](configuring-bucket-key-object.md)。  | 
|  `kms_key_arn`  | 否 | 字符串 |  用于加密对象的 KMS 密钥的 Amazon 资源名称（ARN），适用于 `encryption_status` 为 `SSE-KMS` 或 `DSSE-KMS` 的行。如果对象未使用 SSE-KMS 或 DSSE-KMS 进行加密，则值为 null。有关更多信息，请参阅[使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)和[使用具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）](UsingDSSEncryption.md)。  如果某行代表的对象版本在处理删除或覆盖事件时不再存在，则即使 `encryption_status` 列的值为 `SSE-KMS` 或 `DSSE-KMS`，`kms_key_arn` 也将包含 null 值。   | 
|  `checksum_algorithm`  | 否 | 字符串 |  用于为对象创建校验和的算法，为以下值之一：`CRC64-NVME`、`CRC32`、`CRC32C`、`SHA1` 或 `SHA256`。如果不存在校验和，则此值为 null。有关更多信息，请参阅 [使用支持的校验和算法](checking-object-integrity-upload.md#using-additional-checksums)。  | 
|  `object_tags`  | 否 | Map <String, String> |  与对象关联的对象标签。对象标签存储为键值对的映射。如果对象没有对象标签，则会存储空映射 (`{}`)。有关更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。  如果 `record_type` 值为 `DELETE`，则 `object_tags` 列包含 null 值。如果 `record_type` 值为 `CREATE` 或 `UPDATE_METADATA`，则表示在处理删除或覆盖事件时已不再存在的对象版本的行在 `object_tags` 列中将包含 null 值。   | 
|  `user_metadata`  | 否 | Map <String, String> |  与对象关联的用户元数据。用户元数据存储为键值对的映射。如果对象没有用户元数据，则会存储空映射 (`{}`)。有关更多信息，请参阅 [用户定义的对象元数据](UsingMetadata.md#UserMetadata)。  如果 `record_type` 值为 `DELETE`，则 `user_metadata` 列包含 null 值。如果 `record_type` 值为 `CREATE` 或 `UPDATE_METADATA`，则表示在处理删除或覆盖事件时已不再存在的对象版本的行在 `user_metadata` 列中将包含 null 值。   | 

# 配置元数据表
<a name="metadata-tables-configuring"></a>

Amazon S3 元数据通过自动捕获通用存储桶中对象的元数据，并将其存储在您可以查询的只读、完全托管式 Apache Iceberg 表中，从而加快数据发现速度。这些只读表称为*元数据表*。在通用存储桶中添加、更新和移除对象时，S3 元数据会自动刷新相应的元数据表，以反映最新的更改。

借助 S3 元数据，您可以轻松查找、存储和查询 S3 对象的元数据，这样您就可以快速准备数据，以用于业务分析、人工智能和机器学习（AI/ML）模型训练等。

要生成对象元数据并将其存储在 AWS 托管式元数据表中，需要为通用存储桶创建元数据表配置。Amazon S3 设计为持续更新元数据表，以反映对数据的最新更改，只要配置在存储桶上处于活动状态即可。此外，Amazon S3 会持续优化您的元数据表，以有助于降低存储成本并提高分析查询性能。

要创建元数据表配置，确保您拥有创建和管理元数据表所必需的 AWS Identity and Access Management（IAM）权限。

要监控对元数据表配置的更新，可以使用 AWS CloudTrail。有关更多信息，请参阅 [CloudTrail 日志记录跟踪的 Amazon S3 存储桶级操作](cloudtrail-logging-s3-info.md#cloudtrail-bucket-level-tracking)。

**Topics**
+ [为配置元数据表设置权限](metadata-tables-permissions.md)
+ [创建元数据表配置](metadata-tables-create-configuration.md)
+ [控制对元数据表的访问](metadata-tables-access-control.md)
+ [使日记表记录过期](metadata-tables-expire-journal-table-records.md)
+ [启用或禁用实时清单表](metadata-tables-enable-disable-inventory-tables.md)
+ [查看元数据表配置](metadata-tables-view-configuration.md)
+ [删除元数据表配置](metadata-tables-delete-configuration.md)
+ [删除元数据表](metadata-tables-delete-table.md)

# 为配置元数据表设置权限
<a name="metadata-tables-permissions"></a>

要创建元数据表配置，您必须拥有必要的 AWS Identity and Access Management（IAM）权限，才能创建和管理元数据表配置，以及创建和管理元数据表及用于存储元数据表的表存储桶。

要创建和管理您的元数据表配置，您必须具有以下权限：
+ `s3:CreateBucketMetadataTableConfiguration`：此权限可让您为通用存储桶创建元数据表配置。要创建元数据表配置，还需要其它权限，包括 S3 表类数据存储服务权限，如以下各节所述。有关所需权限的摘要，请参阅[存储桶操作和权限](using-with-s3-policy-actions.md#using-with-s3-policy-actions-related-to-buckets)。
+ `s3:GetBucketMetadataTableConfiguration`：此权限可让您检索有关元数据表配置的信息。
+ `s3:DeleteBucketMetadataTableConfiguration`：此权限可让您删除元数据表配置。
+ `s3:UpdateBucketMetadataJournalTableConfiguration`：此权限可让您更新日记表配置以使日记表记录过期。
+ `s3:UpdateBucketMetadataInventoryTableConfiguration`：此权限可让您更新清单表配置以启用或禁用清单表。要更新清单表配置，还需要其它权限，包括 S3 表类数据存储服务权限。有关所需权限的列表，请参阅[存储桶操作和权限](using-with-s3-policy-actions.md#using-with-s3-policy-actions-related-to-buckets)。
**注意**  
`s3:CreateBucketMetadataTableConfiguration`、`s3:GetBucketMetadataTableConfiguration` 和 `s3:DeleteBucketMetadataTableConfiguration` 权限用于 V1 和 V2 S3 元数据配置。对于 V2，相应 API 操作的名称为 `CreateBucketMetadataConfiguration`、`GetBucketMetadataConfiguration` 和 `DeleteBucketMetadataConfiguration`。

要创建和使用表和表存储桶，您必须具有某些 `s3tables` 权限。要创建元数据表配置，您至少必须具有以下 `s3tables` 权限：
+ `s3tables:CreateTableBucket`：此权限可让您创建 AWS 托管式表存储桶。您的账户和同一区域中的所有元数据表配置都存储在名为 `aws-s3` 的单个 AWS 托管式表存储桶中。有关更多信息，请参阅[元数据表的工作原理](metadata-tables-overview.md#metadata-tables-how-they-work)和 [Working with AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html)。
+ `s3tables:CreateNamespace`：此权限可让您在表存储桶中创建命名空间。元数据表通常使用 `b_general_purpose_bucket_name` 命名空间。有关元数据表命名空间的更多信息，请参阅[元数据表的工作原理](metadata-tables-overview.md#metadata-tables-how-they-work)。
+ `s3tables:CreateTable`：此权限可让您创建元数据表。
+ `s3tables:GetTable`：此权限可让您检索有关元数据表的信息。
+ `s3tables:PutTablePolicy`：此权限可让您添加或更新元数据表策略。
+ `s3tables:PutTableEncryption`：此权限可让您为元数据表设置服务器端加密。如果您要使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密元数据表，则需要额外的权限。有关更多信息，请参阅 [SSE-KMS 的权限](#metadata-kms-permissions)。
+ `kms:DescribeKey`：此权限可让您检索有关 KMS 密钥的信息。
+ `s3tables:PutTableBucketPolicy`：此权限可让您创建或更新新的表存储桶策略。

有关所有表和表存储桶权限的详细信息，请参阅 [S3 表类数据存储服务的访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html)。

**重要**  
如果您还想将表存储桶与 AWS 分析服务集成，以便您能够查询元数据表，则需要额外的权限。有关更多信息，请参阅[集成 Amazon S3 表类数据存储服务与 AWS 分析服务](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)。

**SSE-KMS 的权限**  
要使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密元数据表，您必须拥有额外的权限。

1. 用户或 AWS Identity and Access Management（IAM）角色需要以下权限。可以使用 IAM 控制台来授予这些权限：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. `s3tables:PutTableEncryption`，用于配置表加密

   1. `kms:DescribeKey`（对于所使用的 AWS KMS 密钥）

1. 在 KMS 密钥的资源策略中，您需要以下权限。可以使用 AWS KMS 控制台来授予这些权限：[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms)。

   1. 向 `metadata.s3.amazonaws.com` 和 `maintenance.s3tables.amazonaws.com` 授予 `kms:GenerateDataKey` 权限。

   1. 向 `metadata.s3.amazonaws.com` 和 `maintenance.s3tables.amazonaws.com` 授予 `kms:Decrypt` 权限。

   1. 向发起调用的 AWS 主体授予 `kms:DescribeKey` 权限。

除了这些权限外，还要确保用于加密表的客户自主管理型 KMS 密钥仍然存在、处于活动状态且与通用存储桶位于同一区域。

**示例策略**  
要创建和使用元数据表和表存储桶，可以使用以下示例策略。在本策略中，您要对其应用元数据表配置的通用存储桶称为 `amzn-s3-demo-bucket`。要使用此策略，请将 `user input placeholders` 替换为您自己的信息。

创建元数据表配置时，元数据表存储在 AWS 托管式表存储桶中。您的账户和同一区域中的所有元数据表配置都存储在名为 `aws-s3` 的单个 AWS 托管式表存储桶中。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PermissionsToWorkWithMetadataTables",
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucketMetadataTableConfiguration",
                "s3:GetBucketMetadataTableConfiguration",
                "s3:DeleteBucketMetadataTableConfiguration",
                "s3:UpdateBucketMetadataJournalTableConfiguration",
                "s3:UpdateBucketMetadataInventoryTableConfiguration",
                "s3tables:*",
                "kms:DescribeKey"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket",
                "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3",
                "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/*"
            ]
        }
    ]
}
```

------

要查询元数据表，可以使用以下示例策略。如果元数据表已使用 SSE-KMS 进行加密，则您将需要如下所示的 `kms:Decrypt` 权限。要使用此策略，请将 `user input placeholders` 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PermissionsToQueryMetadataTables",
            "Effect": "Allow",
            "Action": [
                "s3tables:GetTable",
                "s3tables:GetTableData",
                "s3tables:GetTableMetadataLocation",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3",
                "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/*"
            ]
        }
    ]
}
```

------

# 创建元数据表配置
<a name="metadata-tables-create-configuration"></a>

要生成 Amazon S3 元数据并将其存储在完全托管式 Apache Iceberg 元数据表中，需要为通用存储桶创建元数据表配置。Amazon S3 设计为持续更新元数据表，以反映对数据的最新更改，只要配置在存储桶上处于活动状态即可。此外，Amazon S3 会持续优化您的元数据表，以有助于降低存储成本并提高分析查询性能。

对于每个通用存储桶，可以创建一个元数据表配置，其中包含两个互补的元数据表：
+ **日记表**：默认情况下，元数据表配置包含一个*日记表*，用于捕获存储桶中的对象所发生的事件。日记表近乎实时地记录对数据所做的更改，有助于您识别上传到存储桶的新数据、跟踪最近删除的对象、监控生命周期转换等。日记表记录新对象以及对于对象及其元数据的更新（那些需要 `PUT` 或 `DELETE` 操作的更新）。

  日记表仅捕获在您创建元数据表配置后发生的更改事件（例如上传、更新和删除）的元数据。由于此表是可查询的，因此可以通过简单的 SQL 查询来审计对存储桶的更改。

  每个元数据表配置都需要日记表。（在 S3 元数据的初始版本中，日记表称为“元数据表”。）

  有关在日记表中存储哪些数据的更多信息，请参阅 [S3 元数据日记表架构](metadata-tables-schema.md)。

  为了有助于最大限度地降低存储成本，可以选择启用日记表记录过期。有关更多信息，请参阅 [使日记表记录过期](metadata-tables-expire-journal-table-records.md)。
+ **实时清单表**：（可选）可以将*实时清单表*添加到元数据表配置中。实时清单表提供存储桶中所有对象及其版本的简单、可查询的清单，以便您可以确定数据的最新状态。

  可以使用实时清单表，通过识别要为各种工作负载处理的对象，来简化和加快业务工作流程和大数据作业。例如，可以查询实时清单表来查找存储在特定存储类别中的所有对象、带有特定标签的所有对象，以及未通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密的所有对象等。

  当您为元数据表配置启用实时清单表时，该表将经历一个称为*回填*的过程，在这一过程中，Amazon S3 扫描通用存储桶，以检索存储桶中存在的所有对象的初始元数据。根据存储桶中的对象数量，此过程可能需要若干分钟（至少 15 分钟）到几小时。完成回填过程后，实时清单表的状态将从**正在回填**更改为**活跃**。完成回填后，对于对象的更新通常会在一小时内反映在实时清单表中。

  您需要为回填实时清单表付费。如果通用存储桶包含超过十亿个对象，则还需要为实时清单表支付每月费用。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

  有关在实时清单表中存储哪些数据的更多信息，请参阅 [S3 元数据实时清单表架构](metadata-tables-inventory-schema.md)。

元数据表具有以下 Amazon 资源名称（ARN）格式，其中包括元数据表的表 ID：

`arn:aws:s3tables:region-code:account-id:bucket/aws-s3/table/table-id`

例如，美国东部（弗吉尼亚州北部）区域中的元数据表具有如下所示的 ARN：

`arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/a12bc345-67d8-912e-3456-7f89123g4h56`

日记表具有名称 `journal`，而实时清单表具有名称 `inventory`。

创建元数据表配置时，元数据表存储在 AWS 托管式表存储桶中。您的账户和同一区域中的所有元数据表配置都存储在单个 AWS 托管式表存储桶中。这些 AWS 托管式表存储桶命名为 `aws-s3`，并具有以下 Amazon 资源名称（ARN）格式：

`arn:aws:s3tables:region:account_id:bucket/aws-s3`

例如，如果账户 ID 为 123456789012，而通用存储桶位于美国东部（弗吉尼亚州北部）(`us-east-1`)，则 AWS 托管式表存储桶也将在美国东部（弗吉尼亚州北部）(`us-east-1`) 创建并具有以下 ARN：

`arn:aws:s3tables:us-east-1:123456789012:bucket/aws-s3`

默认情况下，AWS 托管式表存储桶通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。创建第一个元数据配置后，可以将 AWS 托管式表存储桶的默认加密设置设为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。有关更多信息，请参阅 [Encryption for AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html#aws-managed-buckets-encryption) 和[在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](s3-tables-kms-specify.md)。

在 AWS 托管式表存储桶中，配置的元数据表通常存储在命名空间中，命名格式如下：

`b_general-purpose-bucket-name`

有关元数据表命名空间的更多信息，请参阅[元数据表的工作原理](metadata-tables-overview.md#metadata-tables-how-they-work)。

创建元数据表配置时，可以选择通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密 AWS 托管式元数据表。如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。只能在创建表的过程中为表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。要为元数据表指定 SSE-KMS，您必须具有特定的权限。有关更多信息，请参阅 [SSE-KMS 的权限](metadata-tables-permissions.md#metadata-kms-permissions)。

元数据表的加密设置优先于默认的存储桶级加密设置。如果不为表指定加密，它将继承存储桶中的默认加密设置。

AWS 托管式表存储桶不计入 S3 表类数据存储服务配额。有关使用 AWS 托管式表存储桶和 AWS 托管式表的更多信息，请参阅 [Working with AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html)。

您可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 创建元数据表配置。

**注意**  
如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，我们建议您删除并重新创建配置，以便您可以使日记表记录过期并创建清单表。有关更多信息，请参阅 [对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](#metadata-tables-migration)。
如果您已删除元数据表配置，并且想要为同一个通用存储桶重新创建配置，则必须先从 AWS 托管式表存储桶中手动删除旧的日记表和清单表。否则，创建新的元数据表配置将失败，因为这些表已经存在。要删除元数据表，请参阅[删除元数据表](metadata-tables-delete-table.md#delete-metadata-table-procedure)。  
删除元数据表配置仅删除配置。即使您删除元数据表配置，AWS 托管式表存储桶和元数据表也仍然存在。

**先决条件**  
在创建元数据表配置之前，请确保已满足以下先决条件：
+ 在创建元数据表配置之前，确保您拥有创建和管理元数据表所必需的 AWS Identity and Access Management（IAM）权限。有关更多信息，请参阅 [为配置元数据表设置权限](metadata-tables-permissions.md)。
+ 如果计划使用 Amazon Athena 或其它 AWS 查询引擎来查询元数据表，请确保将 AWS 托管式表存储桶与 AWS 分析服务集成。有关更多信息，请参阅 [将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

  如果已经在该区域中集成了现有的表存储桶，则也会自动集成 AWS 托管式表存储桶。要确定该区域中表存储桶的集成状态，请打开 Amazon S3 控制台，然后在左侧导航窗格中选择**表存储桶**。在**与 AWS 分析服务集成**下，检查区域以及集成状态是否显示为**已启用**。

## 创建元数据表配置
<a name="create-metadata-config-procedure"></a>

### 使用 S3 控制台
<a name="create-metadata-config-console"></a>

**创建元数据表配置**

在创建元数据表配置之前，请确保您已查看并满足[先决条件](#metadata-table-config-prereqs)，并且已经查看了[元数据表限制和局限性](metadata-tables-restrictions.md)。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择要为其创建元数据表配置的通用存储桶。
**注意**  
请确保此通用存储桶位于表存储桶可用的 AWS 区域。表存储桶仅在美国东部（弗吉尼亚州北部）、美国东部（俄亥俄州）和美国西部（俄勒冈州）区域中提供。

1. 在存储桶的详细信息页面上，选择**元数据**选项卡。

1. 在**元数据**选项卡上，选择**创建元数据配置**。

1. 在**创建元数据配置**页面的**日记表**下，可以选择是否通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）对表进行加密。默认情况下，日记表通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）来进行加密。

   如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。
**重要**  
只能在创建表的过程中为元数据表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。
   + 要使用 SSE-S3（默认）加密日记表，请选择**不指定加密类型**。
   + 要使用 SSE-KMS 加密日记表，请选择**指定加密类型**。在**加密类型**下，选择**使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）**。在 **AWS KMS 密钥**下，从现有 KMS 密钥中进行选择，或者输入 KMS 密钥 ARN。如果您还没有 KMS 密钥，请选择**输入 KMS 密钥 ARN**，然后选择**创建 KMS 密钥**。

     确保您已为 SSE-KMS 设置必要的权限。有关更多信息，请参阅 [SSE-KMS 的权限](metadata-tables-permissions.md#metadata-kms-permissions)。

1. （可选）默认情况下，日记表中的记录不会过期。为了有助于最大限度地降低日记表的存储成本，请对于**记录过期**选择**已启用**。

   如果启用日记表记录过期，则可以设置保留日记表记录的天数。要设置**记录距离过期的天数**值，可以指定介于 `7` 和 `2147483647` 之间的任意整数。例如，要将日记表记录保留一年，请将此值设置为 `365`。

   记录将在符合过期条件后的 24 到 48 小时内过期。
**重要**  
日记表记录过期后无法恢复。

   在**日记表记录将在指定天数后过期**下，选中复选框。

1. （可选）如果要将清单表添加到元数据表配置中，请在**实时清单表**下，对于**配置状态**选择**已启用**。

   可以选择是否通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来对表进行加密。默认情况下，清单表将通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。

   如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。
**重要**  
只能在创建表的过程中为元数据表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。
   + 要使用 SSE-S3（默认）加密清单表，请选择**不指定加密类型**。
   + 要使用 SSE-KMS 加密清单表，请选择**指定加密类型**。在**加密类型**下，选择**使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）**。在 **AWS KMS 密钥**下，从现有 KMS 密钥中进行选择，或者输入 KMS 密钥 ARN。如果您还没有 KMS 密钥，请选择**输入 KMS 密钥 ARN**，然后选择**创建 KMS 密钥**。

     确保您已为 SSE-KMS 设置必要的权限。有关更多信息，请参阅 [SSE-KMS 的权限](metadata-tables-permissions.md#metadata-kms-permissions)。

1. 选择**创建元数据表配置**。

如果元数据表配置已取得成功，则元数据表的名称和 ARN 以及 AWS 托管式表存储桶和命名空间的名称将显示在**元数据**选项卡上。

如果您选择为元数据表配置启用清单表，则该表将经历一个称为*回填*的过程，在此过程中，Amazon S3 扫描通用存储桶，以检索存储桶中存在的所有对象的初始元数据。根据存储桶中的对象数量，此过程可能需要若干分钟（至少 15 分钟）到几小时。完成回填过程后，清单表的状态将从**正在回填**更改为**活跃**。完成回填后，对于对象的更新通常会在一小时内反映在清单表中。

要监控对元数据表配置的更新，可以使用 AWS CloudTrail。有关更多信息，请参阅 [CloudTrail 日志记录跟踪的 Amazon S3 存储桶级操作](cloudtrail-logging-s3-info.md#cloudtrail-bucket-level-tracking)。

### 使用 AWS CLI
<a name="create-metadata-config-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

或者，可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、预先经过身份验证的 Shell，您可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 创建元数据表配置**

在创建元数据表配置之前，请确保您已查看并满足[先决条件](#metadata-table-config-prereqs)，并且已经查看了[元数据表限制和局限性](metadata-tables-restrictions.md)。

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。

1. 创建包含元数据表配置的 JSON 文件并将其保存（例如 `metadata-config.json`）。以下是一个示例配置：

   必须指定是启用还是禁用日记表记录过期。如果选择启用记录过期，还必须指定日记表记录将在多少天后过期。要设置 `Days` 值，可以指定介于 `7` 和 `2147483647` 之间的任意整数。例如，要将日记表记录保留一年，请将此值设置为 `365`。

   （可选）可以选择配置清单表。

   对于日记表和清单表，（可选）可以指定加密配置。默认情况下，元数据表通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密，可以通过将 `SseAlgorithm` 设置为 `AES256` 来指定此加密方式。

   要通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）对元数据表进行加密，请将 `SseAlgorithm` 设置为 `aws:kms`。还必须将 `KmsKeyArn` 设置为通用存储桶所在区域中客户自主管理型 KMS 密钥的 ARN。

   ```
   {
     "JournalTableConfiguration": {
        "RecordExpiration": {          
          "Expiration": "ENABLED",
         "Days": 10
       },
       "EncryptionConfiguration": {  
         "SseAlgorithm": "AES256"
       }
     },
     "InventoryTableConfiguration": { 
       "ConfigurationState": "ENABLED",
       "EncryptionConfiguration": {   
         "SseAlgorithm": "aws:kms",
         "KmsKeyArn": "arn:aws:kms:us-east-2:account-id:key/key-id"
       }
     }
   }
   ```

1. 使用以下命令将元数据表配置应用于通用存储桶（例如 `amzn-s3-demo-bucket`）：

   ```
   aws s3api create-bucket-metadata-configuration \
   --bucket amzn-s3-demo-bucket \
   --metadata-configuration file://./metadata-config.json \
   --region us-east-2
   ```

1. 要验证配置是否已创建，请使用以下命令：

   ```
   aws s3api get-bucket-metadata-configuration \
   --bucket amzn-s3-demo-bucket \
   --region us-east-2
   ```

要监控对元数据表配置的更新，可以使用 AWS CloudTrail。有关更多信息，请参阅 [CloudTrail 日志记录跟踪的 Amazon S3 存储桶级操作](cloudtrail-logging-s3-info.md#cloudtrail-bucket-level-tracking)。

### 使用 REST API
<a name="create-metadata-config-rest-api"></a>

可以发送 REST 请求来创建元数据表配置。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [https://docs.aws.amazon.com//AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html](https://docs.aws.amazon.com//AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html)。

### 使用 AWS SDK
<a name="create-metadata-config-sdk"></a>

可以使用 AWS SDK 在 Amazon S3 中创建元数据表配置。有关信息，请参阅《Amazon S3 API Reference》**中的 [list of supported SDKs](https://docs.aws.amazon.com//AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html#API_CreateBucketMetadataConfiguration_SeeAlso)。

## 对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表
<a name="metadata-tables-migration"></a>

如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，我们建议您删除并重新创建配置，以便您可以使日记表记录过期并创建清单表。在删除旧配置与创建新配置之间对通用存储桶所做的任何更改都不会记录在任一日记表中。

要从旧的元数据配置迁移到新配置，请执行以下操作：

1. 删除现有的元数据表配置。如需分步指导，请参阅 [删除元数据表配置](metadata-tables-delete-configuration.md)。

1. 创建新的元数据表配置。如需分步指导，请参阅 [创建元数据表配置](#metadata-tables-create-configuration)。

如果在迁移配置时需要帮助，请联系 AWS 支持。

创建新的元数据配置后，将有两个日记表。如果不再需要旧的日记表，则可以将其删除。如需分步指导，请参阅 [删除元数据表](metadata-tables-delete-table.md)。如果您保留了旧的日记表并想将其与新的日记表联接，请参阅[将自定义元数据与 S3 元数据表相联接](metadata-tables-join-custom-metadata.md)以了解如何联接两个表的示例。

迁移后，可以执行以下操作：

1. 要查看配置，现在可以使用 `GetBucketMetadataConfiguration` API 操作。要确定配置是旧的还是新的，可以查看 `GetBucketMetadataConfiguration` API 响应的以下属性。AWS 托管式存储桶类型 (`"aws"`) 表示新配置，而客户管理的存储桶类型 (`"customer"`) 表示旧配置。

   ```
   "MetadataTableConfigurationResult": {
               "TableBucketType": ["aws" | "customer"]
   ```

   有关更多信息，请参阅 [查看元数据表配置](metadata-tables-view-configuration.md)。
**注意**  
可以对旧的或新的元数据表配置使用 `GetBucketMetadataConfiguration` 和 `DeleteBucketMetadataConfiguration` API 操作。但是，如果尝试对新配置使用 `GetBucketMetadataTableConfiguration` 和 `DeleteBucketMetadataTableConfiguration` API 操作，则会收到 HTTP `405 Method Not Allowed` 错误。  
确保更新流程以使用新的 API 操作（`CreateBucketMetadataConfiguration`、`GetBucketMetadataConfiguration` 和 `DeleteBucketMetadataConfiguration`），而不是旧的 API 操作。

1. 如果计划使用 Amazon Athena 或其它 AWS 查询引擎来查询元数据表，请确保将 AWS 托管式表存储桶与 AWS 分析服务集成。如果已经在该区域中集成了现有的表存储桶，则也会自动集成 AWS 托管式表存储桶。有关更多信息，请参阅 [将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

# 控制对元数据表的访问
<a name="metadata-tables-access-control"></a>

要控制对 Amazon S3 元数据表的访问权限，可以使用附加到表存储桶和元数据表的 AWS Identity and Access Management（IAM）基于资源的策略。换句话说，您可以在表存储桶级和表级控制对元数据表的访问权限。

有关控制对表存储桶和表的访问权限的更多信息，请参阅 [S3 表类数据存储服务的访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html)。

**重要**  
创建或更新表存储桶或表策略时，请确保不限制 Amazon S3 服务主体 `metadata.s3.amazonaws.com` 和 `maintenance.s3tables.amazonaws.com` 写入表存储桶或元数据表。  
如果 Amazon S3 无法写入表存储桶或元数据表，则必须删除元数据配置，删除元数据表，然后创建新配置。如果配置中有清单表，则必须创建新的清单表，并且将再次向您收取回填新清单表的费用。

还可以通过 AWS Lake Formation 控制对元数据表中行和列的访问权限。有关更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Managing Lake Formation permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-permissions.html) 和 [Data filtering and cell-level security in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html)。

# 使日记表记录过期
<a name="metadata-tables-expire-journal-table-records"></a>

默认情况下，日记表中的记录不会过期。为了有助于最大限度地降低日记表的存储成本，可以启用日记表记录过期。

**注意**  
如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，则无法对该配置启用日记表记录过期。我们建议您删除配置并重新创建配置，以便可以使日记表记录过期并创建清单表。有关更多信息，请参阅 [对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](metadata-tables-create-configuration.md#metadata-tables-migration)。

如果启用日记表记录过期，则可以设置保留日记表记录的天数。要设置此值，请指定介于 `7` 和 `2147483647` 之间的任意整数。例如，要将日记表记录保留一年，请将此值设置为 `365`。

**重要**  
日记表记录过期后无法恢复。

记录会在符合过期条件后的 24 到 48 小时内过期。将从最新的快照中移除日记表记录。可通过表维护操作来移除已删除记录的数据和存储。

如果已启用日记表记录过期，则可以随时将其禁用，以停止使日记表记录过期。

可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 来使日记表记录过期。

## 如何使日记表记录过期
<a name="metadata-tables-expire-journal-table-records-procedure"></a>

### 使用 S3 控制台
<a name="metadata-tables-expire-journal-table-records-console"></a>

**使日记表记录过期**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择通用存储桶，其中包含元数据表配置以及您要使其中的记录过期的日记表。

1. 在存储桶的详细信息页面上，选择**元数据**选项卡。

1. 在**元数据**选项卡上，选择**编辑**，然后选择**编辑日记表记录过期设置**。

1. 在**编辑日记表记录过期设置**页面上，在**记录过期**下选择**已启用**。

1. 设置保留日记表记录的天数。要设置**记录距离过期的天数**值，请指定介于 `7` 和 `2147483647` 之间的任意整数。例如，要将日记表记录保留一年，请将此值设置为 `365`。
**重要**  
日记表记录过期后无法恢复。

1. 在**日记表记录将在指定天数后过期**下，选中复选框。

1. 选择**保存更改**。

如果要禁用日记表记录过期，请重复上述步骤，但在步骤 6 中选择**已禁用**而不是**已启用**。

### 使用 AWS CLI
<a name="metadata-tables-expire-journal-table-records-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

还可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、经过预验证的 Shell，可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 来使日记表记录过期**

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。

1. 创建包含日记表配置的 JSON 文件并将其保存（例如 `journal-config.json`）。以下是一个示例配置：

   要设置 `Days` 值，请指定介于 `7` 和 `2147483647` 之间的任意整数。例如，要将日记表记录保留一年，请将此值设置为 `365`。

   ```
   {
     "RecordExpiration": {
       "Expiration": "ENABLED",
       "Days": 10
     }
   }
   ```

   要禁用日记表记录过期，请改为创建以下示例配置。如果 `Expiration` 设置为 `DISABLED`，则不得在配置中指定 `Days` 值。

   ```
   {
     "RecordExpiration": {
       "Expiration": "DISABLED"
     }
   }
   ```

1. 使用以下命令使通用存储桶（例如 `amzn-s3-demo-bucket`）的日记表中的记录过期：

   ```
   aws s3api update-bucket-metadata-journal-table-configuration \
   --bucket amzn-s3-demo-bucket \
   --journal-table-configuration file://./journal-config.json \
   --region us-east-2
   ```

### 使用 REST API
<a name="metadata-tables-expire-journal-table-records-rest-api"></a>

可以发送 REST 请求来使日记表记录过期。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html)。

### 使用 AWS SDK
<a name="metadata-tables-expire-journal-table-records-sdk"></a>

在 Amazon S3 中可以使用 AWS SDK 来使日记表记录过期。有关信息，请参阅 [list of supported SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html#API_UpdateBucketMetadataJournalTableConfiguration_SeeAlso)。

# 启用或禁用实时清单表
<a name="metadata-tables-enable-disable-inventory-tables"></a>

默认情况下，元数据表配置包含一个*日记表*，该表记录存储桶中的对象发生的事件。每个元数据表配置都需要日记表。

或者，可以将*实时清单表*添加到元数据表配置中。实时清单表提供存储桶中所有对象及其版本的简单、可查询的清单，以便您可以确定数据的最新状态。

**注意**  
如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，则无法对该配置启用清单表。我们建议您删除配置并重新创建配置，以便可以创建清单表并使日记表记录过期。有关更多信息，请参阅 [对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](metadata-tables-create-configuration.md#metadata-tables-migration)。

清单表包含存储桶中所有对象的最新元数据。可以使用此表，通过确定要为各种工作负载处理的对象，从而简化和加快业务工作流程和大数据作业。例如，可以查询清单表来执行以下操作：
+ 查找存储在 S3 Glacier Deep Archive 存储类别中的所有对象。
+ 创建对象标签的分配或查找不带标签的对象。
+ 查找所有未使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密的对象。
+ 比较两个不同时间点的清单表，以了解带有特定标签的对象的增长情况。

如果您选择为元数据表配置启用清单表，则该表将经历一个称为*回填*的过程，在此过程中，Amazon S3 扫描通用存储桶，以检索存储桶中存在的所有对象的初始元数据。根据存储桶中的对象数量，此过程可能需要若干分钟（至少 15 分钟）到几小时。完成回填过程后，清单表的状态将从**正在回填**更改为**活跃**。完成回填后，对于对象的更新通常会在一小时内反映在清单表中。

**注意**  
您需要为回填清单表付费。如果通用存储桶包含超过十亿个对象，您还需要为清单表支付每月费用。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。
无法暂停对清单表的更新，然后继续更新。但是，可以禁用清单表配置。禁用清单表不会将其删除。将为记录保留清单表，直到决定将其删除。  
如果已禁用清单表，之后想重新启用它，则必须先从 AWS 托管式表存储桶中删除旧的清单表。当重新启用清单表配置时，Amazon S3 会创建一个新的清单表，并且您需要再次支付回填新清单表的费用。

可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 来启用或禁用清单表。

**先决条件**  
如果已禁用清单表，现在想重新启用它，则必须先从 AWS 托管式表存储桶中手动删除旧的清单表。否则，由于表存储桶中已存在清单表，因此重新启用清单表将失败。要删除清单表，请参阅[删除元数据表](metadata-tables-delete-table.md#delete-metadata-table-procedure)。

当重新启用清单表配置时，Amazon S3 会创建一个新的清单表，并且您需要再次支付回填新清单表的费用。

## 启用或禁用清单表
<a name="metadata-tables-enable-disable-inventory-tables-procedure"></a>

### 使用 S3 控制台
<a name="metadata-tables-enable-disable-inventory-tables-console"></a>

**启用或禁用清单表**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择通用存储桶，该存储桶具有要为其启用或禁用清单表的元数据表配置。

1. 在存储桶的详细信息页面上，选择**元数据**选项卡。

1. 在**元数据**选项卡上，选择**编辑**，然后选择**编辑清单表配置**。

1. 在**编辑清单表配置**页面上，在**清单表**下方选择**已启用**或**已禁用**。
**注意**  
在选择**已启用**之前，请确保您已查看并符合[先决条件](#inventory-table-config-prereqs)。
   + 如果选择了**已启用**，则可以选择是否通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来对表进行加密。默认情况下，清单表将通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。

     如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。
**重要**  
只能在创建表的过程中为元数据表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。
     + 要使用 SSE-S3（默认）加密清单表，请选择**不指定加密类型**。
     + 要使用 SSE-KMS 加密清单表，请选择**指定加密类型**。在**加密类型**下，选择**使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）**。在 **AWS KMS 密钥**下，从现有 KMS 密钥中进行选择，或者输入 KMS 密钥 ARN。如果您还没有 KMS 密钥，请选择**输入 KMS 密钥 ARN**，然后选择**创建 KMS 密钥**。
   + 如果选择了**已禁用**，则在**禁用清单表后，该表将不再更新，也无法继续更新**下，选中该复选框。

1. 选择**保存更改**。

### 使用 AWS CLI
<a name="metadata-tables-enable-disable-inventory-tables-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

或者，可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、预先经过身份验证的 Shell，您可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 启用或禁用清单表**

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。
**注意**  
在启用清单配置之前，请确保您已查看并符合[先决条件](#inventory-table-config-prereqs)。

1. 创建包含清单表配置的 JSON 文件并将其保存（例如 `inventory-config.json`）。以下是一个用于启用新清单表的示例配置。

   如果要启用清单表，则可以选择指定加密配置。默认情况下，元数据表通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密，可以通过将 `SseAlgorithm` 设置为 `AES256` 来指定此加密方式。

   要通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密清单表，请将 `SseAlgorithm` 设置为 `aws:kms`。还必须将 `KmsKeyArn` 设置为通用存储桶所在区域中客户自主管理型 KMS 密钥的 ARN。

   ```
   {
     "ConfigurationState": "ENABLED",
     "EncryptionConfiguration": {       
       "SseAlgorithm": "aws:kms",
       "KmsKeyArn": "arn:aws:kms:us-east-2:account-id:key/key-id"
     }  
   }
   ```

   如果要禁用现有清单表，请使用以下配置：

   ```
   {
     "ConfigurationState": "DISABLED"  }  
   }
   ```

1. 使用以下命令更新通用存储桶（例如 `amzn-s3-demo-bucket`）的清单表配置：

   ```
   aws s3api update-bucket-metadata-inventory-table-configuration \
   --bucket amzn-s3-demo-source-bucket \
   --inventory-table-configuration file://./inventory-config.json \
   --region us-east-2
   ```

### 使用 REST API
<a name="metadata-tables-enable-disable-inventory-tables-rest-api"></a>

可以发送 REST 请求来启用或禁用清单表。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html)。

### 使用 AWS SDK
<a name="metadata-tables-enable-disable-inventory-tables-sdk"></a>

在 Amazon S3 中可以使用 AWS SDK 来启用或禁用清单表。有关信息，请参阅 [list of supported SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html#API_UpdateBucketMetadataInventoryTableConfiguration_SeeAlso)。

# 查看元数据表配置
<a name="metadata-tables-view-configuration"></a>

如果为通用存储桶创建了元数据表配置，则可以查看有关该配置的信息，例如清单表是否已启用，或者是否启用了日记表记录过期。还可以查看日记表和清单表的状态。

可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 来查看通用存储桶的元数据表配置。

## 查看元数据表配置
<a name="metadata-tables-view-configuration-procedure"></a>

### 使用 S3 控制台
<a name="metadata-tables-view-configuration-console"></a>

**查看元数据表配置**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择包含要查看的元数据表配置的通用存储桶。

1. 在存储桶的详细信息页面上，选择**元数据**选项卡。

1. 在**元数据**选项卡上，向下滚动到**元数据配置**部分。在**日记表**和**清单表**部分，可以查看这些配置的各种信息，例如它们的 Amazon 资源名称（ARN）、表的状态以及是否启用了日记表记录过期或清单表。

### 使用 AWS CLI
<a name="metadata-tables-view-configuration-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

或者，可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、预先经过身份验证的 Shell，您可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 查看元数据表配置**

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。

1. 使用以下命令查看通用存储桶（例如 `amzn-s3-demo-bucket`）的元数据表配置：

   ```
   aws s3api get-bucket-metadata-configuration \
   --bucket amzn-s3-demo-bucket \
   --region us-east-2
   ```

1. 查看此命令的输出，以查看元数据表配置的状态。例如：

   ```
   {
       "GetBucketMetadataConfigurationResult": {
           "MetadataConfigurationResult": {
               "DestinationResult": {
                   "TableBucketType": "aws",
                   "TableBucketArn": "arn:aws:s3tables:us-east-2:111122223333:bucket/aws-managed-s3-111122223333-us-east-2",
                   "TableNamespace": "b_general-purpose-bucket-name"
               },
               "JournalTableConfigurationResult": {
                   "TableStatus": "ACTIVE",
                   "TableName": "journal",
                   "TableArn": "arn:aws:s3tables:us-east-2:111122223333:bucket/aws-managed-s3-111122223333-us-east-2/table/0f01234c-fe7a-492f-a4c7-adec3864ea85",
                   "EncryptionConfiguration": {
                       "SseAlgorithm": "AES256"
                   },
                   "RecordExpiration": {
                       "Expiration": "ENABLED",
                       "Days": 10
                   }
               },
               "InventoryTableConfigurationResult": {
                   "ConfigurationState": "ENABLED",
                   "TableStatus": "BACKFILL_COMPLETE",
                   "TableName": "inventory",
                   "TableArn": "arn:aws:s3tables:us-east-2:111122223333:bucket/aws-managed-s3-111122223333-us-east-2/table/e123456-b876-4e5e-af29-bb055922ee4d",
                   "EncryptionConfiguration": {
                       "SseAlgorithm": "AES256"
                   }
               }
           }
       }
   }
   ```

### 使用 REST API
<a name="metadata-tables-view-configuration-rest-api"></a>

可以发送 REST 请求来查看元数据表配置。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html)。

**注意**  
可以将 V2 `GetBucketMetadataConfiguration` API 操作与 V1 或 V2 元数据表配置结合使用。但是，如果尝试将 V1 `GetBucketMetadataTableConfiguration` API 操作与 V2 配置结合使用，则会收到 HTTP `405 Method Not Allowed` 错误。

### 使用 AWS SDK
<a name="metadata-tables-view-configuration-sdk"></a>

在 Amazon S3 中可以使用 AWS SDK 查看元数据表配置。有关信息，请参阅 [list of supported SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html#API_GetBucketMetadataTableConfiguration_SeeAlso)。

# 删除元数据表配置
<a name="metadata-tables-delete-configuration"></a>

如果您想停止更新 Amazon S3 通用存储桶的元数据表配置，可以删除附加到存储桶的元数据表配置。删除元数据表配置仅删除配置。即使您删除元数据表配置，AWS 托管式表存储桶和元数据表也仍然存在。但是，将不再更新元数据表。

**注意**  
如果删除元数据表配置，并想为同一个通用存储桶重新创建配置，则必须先从 AWS 托管式表存储桶中手动删除旧的日记表和清单表。否则，创建新的元数据表配置将失败，因为这些表已经存在。要删除元数据表，请参阅[删除元数据表](metadata-tables-delete-table.md)。

要删除元数据表，请参阅[删除元数据表](metadata-tables-delete-table.md#delete-metadata-table-procedure)。要删除表存储桶，请参阅[删除表存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-delete.html)和《Amazon S3 API Reference》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucket.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucket.html)。

您可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 删除元数据表配置。

## 删除元数据表配置
<a name="delete-metadata-config-procedure"></a>

### 使用 S3 控制台
<a name="delete-metadata-config-console"></a>

**删除元数据表配置**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 选择要从中移除元数据表配置的通用存储桶。

1. 在存储桶的详细信息页面上，选择**元数据**选项卡。

1. 在**元数据**选项卡上，选择**删除**。

1. 在**删除元数据配置**对话框中，输入 **confirm** 以确认要删除该配置。然后选择**删除**。

### 使用 AWS CLI
<a name="delete-metadata-config-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

或者，可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、预先经过身份验证的 Shell，您可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 删除元数据表配置**

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。

1. 使用以下命令从通用存储桶中删除元数据表配置（例如 `amzn-s3-demo-bucket`）：

   ```
   aws s3api delete-bucket-metadata-configuration \
   --bucket amzn-s3-demo-bucket \
   --region us-east-2
   ```

1. 要验证配置是否已删除，请使用以下命令：

   ```
   aws s3api get-bucket-metadata-configuration \
   --bucket amzn-s3-demo-bucket \
   --region us-east-2
   ```

### 使用 REST API
<a name="delete-metadata-config-rest-api"></a>

可以发送 REST 请求来删除元数据表配置。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html)。

**注意**  
可以将 V2 `DeleteBucketMetadataConfiguration` API 操作与 V1 或 V2 元数据表配置结合使用。但是，如果尝试将 V1 `DeleteBucketMetadataTableConfiguration` API 操作与 V2 配置结合使用，则会收到 HTTP `405 Method Not Allowed` 错误。

### 使用 AWS SDK
<a name="delete-metadata-config-sdk"></a>

可以使用 AWS SDK 在 Amazon S3 中删除元数据表配置。有关信息，请参阅 [list of supported SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html#API_DeleteBucketMetadataConfiguration_SeeAlso)。

# 删除元数据表
<a name="metadata-tables-delete-table"></a>

如果想要删除为 Amazon S3 通用存储桶创建的元数据表，则可以从 AWS 托管式表存储桶中删除这些元数据表。

**重要**  
删除表是永久性的，无法撤消。在删除表之前，请确保您已备份所有重要数据。
在删除元数据表之前，建议您先删除通用存储桶中的关联元数据表配置。有关更多信息，请参阅 [删除元数据表配置](metadata-tables-delete-configuration.md)。

要删除 AWS 托管式表存储桶，请参阅[删除表存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-delete.html)和《Amazon S3 API Reference》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucket.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucket.html)。在删除 AWS 托管式表存储桶之前，建议先删除与该存储桶关联的所有元数据表配置。还必须先删除存储桶中的所有元数据表。

可以使用 AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 删除元数据表。

## 删除元数据表
<a name="delete-metadata-table-procedure"></a>

### 使用 AWS CLI
<a name="delete-metadata-table-cli"></a>

要运行以下命令，您必须安装并配置 AWS CLI。如果未安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)。

或者，可以从控制台中使用 AWS CloudShell 运行 AWS CLI 命令。AWS CloudShell 是一个基于浏览器、预先经过身份验证的 Shell，您可以直接从 AWS 管理控制台中启动它。有关更多信息，请参阅《AWS CloudShell 用户指南》**中的 [What is CloudShell?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 和 [Getting started with AWS CloudShell](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)。

**使用 AWS CLI 删除元数据表配置**

要使用以下示例命令，请将 `user input placeholders` 替换为您自己的信息。

1. 使用以下命令从 AWS 托管式表存储桶中删除元数据表：

   ```
   aws s3tables delete-table \
   --table-bucket-arn arn:aws:s3tables:us-east-2:111122223333:bucket/aws-s3 \
   --namespace b_general-purpose-bucket-name \
   --name journal \
   --region us-east-2
   ```

1. 要验证表是否已删除，请使用以下命令：

   ```
   aws s3tables get-table \
   --table-bucket-arn arn:aws:s3tables:us-east-2:111122223333:bucket/aws-s3 \
   --namespace b_general-purpose-bucket-name \
   --name journal \
   --region us-east-2
   ```

### 使用 REST API
<a name="delete-metadata-table-rest-api"></a>

可以发送 REST 请求来删除元数据表配置。有关更多信息，请参阅《Amazon S3 API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTable.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTable.html)。

### 使用 AWS SDK
<a name="delete-metadata-table-sdk"></a>

可以使用 AWS SDK 在 Amazon S3 中删除元数据表配置。有关信息，请参阅《Amazon S3 API Reference》**中的 [list of supported SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTable.html#API_s3TableBuckets_DeleteTable_SeeAlso)。

# 查询元数据表
<a name="metadata-tables-querying"></a>

Amazon S3 元数据表存储在 AWS 托管式 S3 表存储桶中，该存储桶提供针对表格数据进行优化的存储。要查询元数据，可以将表存储桶与 Amazon SageMaker 智能湖仓集成。这种集成使用 AWS Glue Data Catalog 和 AWS Lake Formation，支持 AWS 分析服务自动发现和访问表数据。

在将表存储桶与 AWS Glue Data Catalog 集成后，可以使用 AWS 分析服务（如 Amazon Athena、Amazon EMR 和 Amazon Redshift）直接查询元数据表。还可以使用 Amazon Quick 通过查询数据创建交互式控制面板。

有关将 AWS 托管式 S3 表存储桶与 Amazon SageMaker 智能湖仓集成的更多信息，请参阅[将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

还可以使用 AWS Glue Iceberg REST 端点、Amazon S3 表类数据存储服务 Iceberg REST 端点或适用于 Apache Iceberg 的 Amazon S3 表类数据存储服务目录客户端目录，通过 Apache Spark、Apache Trino 和支持 Apache Iceberg 格式的任何其它应用程序来查询元数据表。有关访问元数据表的更多信息，请参阅[访问表数据](s3-tables-access.md)。

可以使用任何支持 Apache Iceberg 格式的查询引擎来分析元数据表。例如，可以查询元数据表来执行以下操作：
+ 发现存储使用规律和趋势
+ 审计对象间的 AWS Key Management Service（AWS KMS）加密密钥使用情况
+ 通过用户定义的元数据和对象标签搜索对象
+ 了解对象元数据随时间的变化
+ 了解何时更新或删除对象，包括发出请求的 AWS 账户 ID 或 IP 地址

还可以联接 S3 托管式元数据表和自定义元数据表，从而可以跨多个数据集进行查询。

## 查询定价注意事项
<a name="metadata-tables-querying-pricing"></a>

在元数据表上运行查询需支付额外费用。有关更多信息，请参阅您使用的查询引擎的定价信息。

有关提高查询的成本效益的信息，请参阅[优化元数据表查询性能](metadata-tables-optimizing-query-performance.md)。

**Topics**
+ [查询定价注意事项](#metadata-tables-querying-pricing)
+ [用于查询元数据表的权限](metadata-tables-bucket-query-permissions.md)
+ [使用 AWS 分析服务查询元数据表](metadata-tables-bucket-integration.md)
+ [使用开源查询引擎查询元数据表](metadata-tables-bucket-integration-open-source.md)
+ [优化元数据表查询性能](metadata-tables-optimizing-query-performance.md)
+ [元数据表查询示例](metadata-tables-example-queries.md)

# 用于查询元数据表的权限
<a name="metadata-tables-bucket-query-permissions"></a>

在可以查询 S3 元数据日记表和实时清单表之前，您必须拥有某些 S3 表类数据存储服务权限。如果元数据表已通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密，您还必须拥有用于解密表数据的 `kms:Decrypt` 权限。

创建元数据表配置时，元数据表存储在 AWS 托管式表存储桶中。您的账户和同一区域中的所有元数据表配置都存储在名为 `aws-s3` 的单个 AWS 托管式表存储桶中。

要查询元数据表，可以使用以下示例策略。要使用此策略，请将 `user input placeholders` 替换为您自己的信息。

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"PermissionsToQueryMetadataTables",
         "Effect":"Allow",
         "Action":[
             "s3tables:GetTable",
             "s3tables:GetTableData",
             "s3tables:GetTableMetadataLocation",
             "kms:Decrypt"
         ],
         "Resource":[
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3",
            "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-s3/table/*",
            "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
         ]
       }
    ]
}
```

# 使用 AWS 分析服务查询元数据表
<a name="metadata-tables-bucket-integration"></a>

可以使用诸如 Amazon Athena、Amazon Redshift 和 Amazon EMR 等 AWS 分析服务查询 S3 托管式元数据表。

在可以运行查询之前，必须首先将您的 AWS 账户和区域中的 [AWS 托管式 S3 表存储桶与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

## 使用 Amazon Athena 查询元数据表
<a name="metadata-tables-bucket-integration-athena"></a>

在[集成 AWS 托管式 S3 表存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)与 AWS 分析服务之后，可以开始在 Athena 中查询元数据表。在查询中，执行以下操作：
+ 将目录指定为 `s3tablescatalog/aws-s3`，并将数据库指定为 `b_general_purpose_bucket_name`（这通常是元数据表的命名空间）。
+ 确保将元数据表命名空间名称用引号 (`"`) 或反勾号 (```) 括起来，否则查询可能无法运行。

有关更多信息，请参阅[使用 Athena 查询 Amazon S3 表类数据存储服务](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-athena.html)。

还可以在 Athena 中从 Amazon S3 控制台运行查询。

### 使用 S3 控制台和 Amazon Athena
<a name="query-metadata-table-console"></a>

以下过程使用 Amazon S3 控制台访问 Athena 查询编辑器，以便您可以使用 Amazon Athena 查询表。

**查询元数据表**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在**通用存储桶**选项卡上，选择存储桶，其中包含要查询的元数据表的元数据配置。

1. 在存储桶详细信息页面上，选择**元数据**选项卡。

1. 选择**使用 Athena 查询表**，然后为日记表或清单表选择一个示例查询。

1. Amazon Athena 控制台打开，Athena 查询编辑器随即出现，其中包含为您加载的示例 查询。根据您的用例需要修改此查询。

   在查询编辑器中，**目录**字段应填充 **s3tablescatalog/aws-s3**。**数据库**字段应填充用于存储表的命名空间（例如，**b\$1*general-purpose-bucket-name***）。
**注意**  
如果在**目录**和**数据库**字段中看不到这些值，请确保已在该区域中将 AWS 托管式表存储桶与 AWS 分析服务集成。有关更多信息，请参阅 [将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

1. 要运行查询，请选择 **Run**（运行）。
**注意**  
如果您在尝试在 Athena 中运行查询时收到错误“权限不足，无法执行查询。主体对指定的资源没有任何权限”，则必须向您授予对于表的必需 Lake Formation 权限。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](grant-permissions-tables.md#grant-lf-table)。  
此外，确保您拥有查询元数据表的适当 AWS Identity and Access Management（IAM）权限。有关更多信息，请参阅 [用于查询元数据表的权限](metadata-tables-bucket-query-permissions.md)。
如果您在尝试运行查询时收到错误“Iceberg 无法访问所请求的资源”，请转到 AWS Lake Formation 控制台，并确保您已授予自己对您创建的表存储桶目录和数据库（命名空间）的权限。授予这些权限时请勿指定表。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](grant-permissions-tables.md#grant-lf-table)。

## 使用 Amazon Redshift 查询元数据表
<a name="metadata-tables-bucket-integration-redshift"></a>

在[集成 AWS 托管式 S3 表存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)与 AWS 分析服务集成后，请执行以下操作：
+ [创建资源链接](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html#database-link-tables)，该链接指向元数据表命名空间（通常为 `b_general_purpose_bucket_name`）。
+ 确保将元数据表命名空间名称用引号 (`"`) 或反勾号 (```) 括起来，否则查询可能无法运行。

完成后，可以开始在 Amazon Redshift 控制台中查询元数据表。有关更多信息，请参阅[使用 Amazon Redshift 访问 Amazon S3 表类数据存储服务](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-redshift.html)。

## 使用 Amazon EMR 查询元数据表
<a name="metadata-tables-bucket-integration-emr"></a>

要使用 Amazon EMR 查询元数据表，需要创建为 Apache Iceberg 配置的 Amazon EMR 集群，然后使用 Apache Spark 连接到元数据表。可以通过将 AWS 托管式 S3 表存储桶与 AWS 分析服务集成，或者使用适用于 Iceberg 的开源 Amazon S3 表类数据存储服务目录客户端目录，来对此进行设置。

**注意**  
在 Amazon EMR 或其它第三方引擎上使用 Apache Spark 查询元数据表时，建议您使用 Amazon S3 表类数据存储服务 Iceberg REST 端点。如果不使用此端点，查询可能无法成功运行。有关更多信息，请参阅 [使用 Amazon S3 表类数据存储服务 Iceberg REST 端点访问表](s3-tables-integrating-open-source.md)。

 有关更多信息，请参阅[使用 Amazon EMR 访问 Amazon S3 表类数据存储服务](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-emr.html)。

# 使用开源查询引擎查询元数据表
<a name="metadata-tables-bucket-integration-open-source"></a>

可以使用开源查询引擎（例如 Apache Spark）查询 S3 托管式元数据表。在 Amazon EMR 或其它第三方引擎上使用 Apache Spark 查询元数据表时，建议您使用 Amazon S3 表类数据存储服务 Iceberg REST 端点。如果不使用此端点，查询可能无法成功运行。有关更多信息，请参阅 [使用 Amazon S3 表类数据存储服务 Iceberg REST 端点访问表](s3-tables-integrating-open-source.md)。

# 优化元数据表查询性能
<a name="metadata-tables-optimizing-query-performance"></a>

由于 S3 元数据基于 Apache Iceberg 表格式，因此，可以使用特定的时间范围来优化日记表查询的性能和[成本](#metadata-tables-optimizing-query-performance)。

例如，以下 SQL 查询提供了 S3 通用存储桶中新对象的敏感级别：

```
SELECT key, object_tags['SensitivityLevel'] 
FROM "b_general-purpose-bucket-name"."journal"
WHERE record_type = 'CREATE'
GROUP BY object_tags['SensitivityLevel']
```

此查询将扫描整个日记表，运行可能需要很长时间。要提高性能，您可以包括 `record_timestamp` 列以专注于特定的时间范围。我们还建议使用完全限定的表名称，您可以在 Amazon S3 控制台中通用存储桶的**元数据**选项卡上的元数据配置详情页面上找到该名称。以下是上一个查询的更新版本，它查看了过去一个月的新对象：

```
SELECT key, object_tags['SensitivityLevel'] 
FROM b_general-purpose-bucket-name"."aws-s3.b_general-purpose-bucket-name.journal"
WHERE record_type = 'CREATE'
AND record_timestamp > (CURRENT_TIMESTAMP – interval '1' month)
GROUP BY object_tags['SensitivityLevel']
```

要提高对清单表的查询性能，请确保仅查询所需的最少列。

# 元数据表查询示例
<a name="metadata-tables-example-queries"></a>

以下示例说明如何使用标准 SQL 查询从 S3 元数据表中获取不同类型的信息。

使用这些示例时请记住：
+ 这些示例是为与 Amazon Athena 结合使用而编写的。您可能需要修改示例才能使用其它查询引擎。
+ 确保您了解如何[优化查询](metadata-tables-optimizing-query-performance.md)。
+ 将 `b_general-purpose-bucket-name` 替换为命名空间的名称。
+ 有关支持的列的完整列表，请参阅 [S3 元数据日记表架构](metadata-tables-schema.md)和 [S3 元数据实时清单表架构](metadata-tables-inventory-schema.md)。

**Contents**
+ [日记表示例查询](#metadata-tables-example-queries-journal-tables)
  + [按文件扩展名查找对象](#metadata-tables-example-query-object-pattern)
  + [列出对象删除操作](#metadata-tables-example-query-delete-events)
  + [列出您的对象使用的 AWS KMS 加密密钥](#metadata-tables-example-query-objects-using-kms-key)
  + [列出不使用 KMS 密钥的对象](#metadata-tables-example-query-objects-not-using-kms-key)
  + [列出过去 7 天内用于 `PUT` 操作的 AWS KMS 加密密钥](#metadata-tables-example-query-objects-using-kms-key-puts)
  + [列出 S3 生命周期在过去 24 小时内删除的对象](#metadata-tables-example-query-objects-deleted-lifecycle)
  + [查看 Amazon Bedrock 提供的元数据](#metadata-tables-example-query-bedrock)
  + [了解对象的当前状态](#metadata-tables-example-query-current-state)
+ [清单表示例查询](#metadata-tables-example-queries-inventory-tables)
  + [发现使用特定标签的数据集](#metadata-tables-example-query-datasets-specific-tags)
  + [列出未使用 SSE-KMS 加密的对象](#metadata-tables-example-query-objects-not-kms-encrypted)
  + [列出未加密的对象](#metadata-tables-example-query-objects-not-encrypted)
  + [列出 Amazon Bedrock 生成的对象](#metadata-tables-example-query-objects-generated-bedrock)
  + [将清单表与日记表进行协调](#metadata-tables-example-query-generate-latest-inventory)
  + [查找对象的当前版本](#metadata-tables-example-query-latest-version)
+ [将自定义元数据与 S3 元数据表相联接](metadata-tables-join-custom-metadata.md)
+ [使用 Amazon Quick 实现元数据表数据可视化](metadata-tables-quicksight-dashboards.md)

## 日记表示例查询
<a name="metadata-tables-example-queries-journal-tables"></a>

可以使用以下示例查询来查询日记表。

### 按文件扩展名查找对象
<a name="metadata-tables-example-query-object-pattern"></a>

以下查询返回具有特定文件扩展名（在本例中为 `.jpg`）的对象：

```
SELECT key FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE key LIKE '%.jpg'
AND record_type = 'CREATE'
```

### 列出对象删除操作
<a name="metadata-tables-example-query-delete-events"></a>

以下查询返回对象删除事件，包括发出请求的 AWS 账户 ID 或 AWS 服务主体：

```
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, requester, source_ip_address, version_id
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE record_type = 'DELETE';
```

### 列出您的对象使用的 AWS KMS 加密密钥
<a name="metadata-tables-example-query-objects-using-kms-key"></a>

以下查询返回用于加密对象的 AWS Key Management Service（AWS KMS）密钥的 ARN：

```
SELECT DISTINCT kms_key_arn
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal";
```

### 列出不使用 KMS 密钥的对象
<a name="metadata-tables-example-query-objects-not-using-kms-key"></a>

以下查询返回未使用 AWS KMS 密钥加密的对象：

```
SELECT DISTINCT kms_key_arn
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE encryption_status NOT IN ('SSE-KMS', 'DSSE-KMS')
AND record_type = 'CREATE';
```

### 列出过去 7 天内用于 `PUT` 操作的 AWS KMS 加密密钥
<a name="metadata-tables-example-query-objects-using-kms-key-puts"></a>

以下查询返回用于加密对象的 AWS Key Management Service（AWS KMS）密钥的 ARN：

```
SELECT DISTINCT kms_key_arn 
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE record_timestamp > (current_date - interval '7' day)
AND kms_key_arn is NOT NULL;
```

### 列出 S3 生命周期在过去 24 小时内删除的对象
<a name="metadata-tables-example-query-objects-deleted-lifecycle"></a>

以下查询返回 S3 生命周期在最后一天过期的对象：

```
SELECT bucket, key, version_id, last_modified_date, record_timestamp, requester
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE requester = 's3.amazonaws.com'
AND record_type = 'DELETE' 
AND record_timestamp > (current_date - interval '1' day)
```

### 查看 Amazon Bedrock 提供的元数据
<a name="metadata-tables-example-query-bedrock"></a>

某些 AWS 服务（例如 [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)）将对象上传到 Amazon S3。您可以查询这些服务提供的对象元数据。例如，以下查询包含用于确定 Amazon Bedrock 是否有对象上传到通用存储桶的 `user_metadata` 列：

```
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, user_metadata
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
WHERE record_type = 'CREATE'
AND user_metadata['content-source'] = 'AmazonBedrock';
```

如果 Amazon Bedrock 将对象上传到存储桶，则 `user_metadata` 列将在查询结果中显示与该对象关联的以下元数据：

```
user_metadata
{content-additional-params -> requestid="CVK8FWYRW0M9JW65", signedContentSHA384="38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", content-model-id -> bedrock-model-arn, content-source -> AmazonBedrock}
```

### 了解对象的当前状态
<a name="metadata-tables-example-query-current-state"></a>

以下查询有助于您确定对象的当前状态。该查询可识别每个对象的最新版本，筛选掉已删除的对象，并根据序列号标记每个对象的最新版本。结果按 `bucket`、`key` 和 `sequence_number` 列排序。

```
WITH records_of_interest as (
   -- Start with a query that can narrow down the records of interest.
    SELECT * from "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal"
),

version_stacks as (
   SELECT *,
          -- Introduce a column called 'next_sequence_number', which is the next larger
          -- sequence_number for the same key version_id in sorted order.
          LEAD(sequence_number, 1) over (partition by (bucket, key, coalesce(version_id, '')) order by sequence_number ASC) as next_sequence_number
   from records_of_interest
),

-- Pick the 'tip' of each version stack triple: (bucket, key, version_id).
-- The tip of the version stack is the row of that triple with the largest sequencer.
-- Selecting only the tip filters out any row duplicates.
-- This isn't typical, but some events can be delivered more than once to the table
-- and include rows that might no longer exist in the bucket (since the
-- table contains rows for both extant and extinct objects).
-- In the next subquery, eliminate the rows that contain deleted objects.
current_versions as (
    SELECT * from version_stacks where next_sequence_number is NULL
),

-- Eliminate the rows that are extinct from the bucket by filtering with
-- record_type. An object version has been deleted from the bucket if its tip is
-- record_type==DELETE.
existing_current_versions as (
    SELECT * from current_versions where not (record_type = 'DELETE' and is_delete_marker = FALSE)
),

-- Optionally, to determine which of several object versions is the 'latest',
-- you can compare their sequence numbers. A version_id is the latest if its
-- tip's sequencer is the largest among all other tips in the same key.
with_is_latest as (
    SELECT *,
           -- Determine if the sequence_number of this row is the same as the largest sequencer for the key that still exists.
           sequence_number = (MAX(sequence_number) over (partition by (bucket, key))) as is_latest_version
    FROM existing_current_versions
)

SELECT * from with_is_latest
ORDER BY bucket, key, sequence_number;
```

## 清单表示例查询
<a name="metadata-tables-example-queries-inventory-tables"></a>

可以使用以下示例查询来查询清单表。

### 发现使用特定标签的数据集
<a name="metadata-tables-example-query-datasets-specific-tags"></a>

以下查询返回使用指定标签的数据集：

```
SELECT * 
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."inventory"
WHERE object_tags['key1'] = 'value1'
AND object_tags['key2'] = 'value2';
```

### 列出未使用 SSE-KMS 加密的对象
<a name="metadata-tables-example-query-objects-not-kms-encrypted"></a>

以下查询返回未使用 SSE-KMS 加密的对象。

```
SELECT key, encryption_status 
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."inventory"
WHERE encryption_status != 'SSE-KMS';
```

### 列出未加密的对象
<a name="metadata-tables-example-query-objects-not-encrypted"></a>

以下查询返回未加密的对象：

```
SELECT bucket, key, version_id  
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."inventory"
WHERE encryption_status IS NULL;
```

### 列出 Amazon Bedrock 生成的对象
<a name="metadata-tables-example-query-objects-generated-bedrock"></a>

以下查询列出了由 Amazon Bedrock 生成的对象：

```
SELECT DISTINCT bucket, key, sequence_number, user_metadata
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."inventory"
WHERE user_metadata['content-source'] = 'AmazonBedrock';
```

### 将清单表与日记表进行协调
<a name="metadata-tables-example-query-generate-latest-inventory"></a>

以下查询生成一个类似清单表的列表，该列表包含存储桶的当前内容。更确切地说，生成的列表将清单表的最新快照与日记表中的最新事件相结合。

要使此查询生成最准确的结果，日记表和清单表都必须处于“活动”状态。

我们建议将此查询用于所含对象数少于十亿（10^9）的通用存储桶。

此示例查询将以下简化应用于列表结果（与清单表相比）：
+ **列忽略**：列 `bucket`、`is_multipart`、`encryption_status`、`is_bucket_key_enabled`、`kms_key_arn` 和 `checksum_algorithm` 不是最终结果的一部分。将可选列集保持在最低限度可以提高性能。
+ **包含所有记录**：查询返回所有对象键和版本，包括空版本（在未进行版本控制或暂停版本控制的存储桶中）和删除标记。有关如何筛选结果以仅显示您感兴趣的键的示例，请参阅查询末尾的 `WHERE` 子句。
+ **加速协调**：在极少数情况下，查询可能会临时报告不再位于存储桶中的对象。一旦清单表的下一个快照变为可用，就会消除这些差异。这种行为是在性能与准确性之间进行权衡。

要在 Amazon Athena 中运行此查询，请确保为包含日记表和清单表的通用存储桶元数据配置选择 `s3tablescatalog/aws-s3` 目录和 `b_general-purpose-bucket-name` 数据库。

```
WITH inventory_time_cte AS (
    SELECT COALESCE(inventory_time_from_property, inventory_time_default) AS inventory_time FROM
    (
      SELECT * FROM
        (VALUES (TIMESTAMP '2024-12-01 00:00')) AS T (inventory_time_default)
      LEFT OUTER JOIN
        (
         SELECT from_unixtime(CAST(value AS BIGINT) / 1000.0) AS inventory_time_from_property FROM "journal$properties"
         WHERE key = 'aws.s3metadata.oldest-uncoalesced-record-timestamp' LIMIT 1
        )
      ON TRUE
    )
),

working_set AS (
    SELECT
        key,
        sequence_number,
        version_id,
        is_delete_marker,
        size,
        COALESCE(last_modified_date, record_timestamp) AS last_modified_date,
        e_tag,
        storage_class,
        object_tags,
        user_metadata,
        (record_type = 'DELETE' AND NOT COALESCE(is_delete_marker, FALSE)) AS _is_perm_delete
    FROM journal j
    CROSS JOIN inventory_time_cte t
    WHERE j.record_timestamp > (t.inventory_time - interval '15' minute)

    UNION ALL

    SELECT
        key,
        sequence_number,
        version_id,
        is_delete_marker,
        size,
        last_modified_date,
        e_tag,
        storage_class,
        object_tags,
        user_metadata,
        FALSE AS _is_perm_delete
    FROM inventory i
),

updated_inventory AS (
    SELECT * FROM (
        SELECT *,
            MAX(sequence_number) OVER (PARTITION BY key, version_id) AS _supremum_sn
        FROM working_set
    )
    WHERE sequence_number = _supremum_sn
)

SELECT
    key,
    sequence_number,
    version_id,
    is_delete_marker,
    size,
    last_modified_date,
    e_tag,
    storage_class,
    object_tags,
    user_metadata
FROM updated_inventory
-- This filter omits only permanent deletes from the results. Delete markers will still be shown.
WHERE NOT _is_perm_delete
-- You can add additional filters here. Examples:
--    AND object_tags['department'] = 'billing'
--    AND starts_with(key, 'reports/')
ORDER BY key ASC, sequence_number DESC;
```

### 查找对象的当前版本
<a name="metadata-tables-example-query-latest-version"></a>

以下查询使用清单表来生成新的输出表，该输出表显示哪些对象版本是当前版本。输出表特意设计成与 S3 清单报告类似。输出表包含一个 `is_latest` 字段，用于指示对象是否为当前版本。`is_latest` 字段等同于 [S3 清单报告](storage-inventory.md#storage-inventory-contents)中的 **IsLatest** 字段。

此查询适用于 [S3 版本控制](Versioning.md)处于已启用版本控制或已暂停版本控制状态的通用存储桶。

**先决条件**  
此查询将结果输出到新的 S3 表中以支持进一步查询，与在屏幕上输出行相比，其性能更高。因此，在运行此查询之前，请确保您满足以下条件。如果您选择不将结果输出到新表，则可以跳过这些步骤。
+ 您必须有一个现有的客户管理的表存储桶，该存储桶具有现有的命名空间作为输出新表的地方。有关更多信息，请参阅[创建表存储桶](s3-tables-buckets-create.md)和[创建命名空间](s3-tables-namespace-create.md)。
+ 要查询新的输出表，必须设置用于查询该表的访问方法。有关更多信息，请参阅 [访问表数据](s3-tables-access.md)。如果您想使用 Amazon Athena 等 AWS 分析服务来查询输出表，则客户管理的表存储桶必须与 AWS 分析服务集成。有关更多信息，请参阅 [Amazon S3 表类数据存储服务与 AWS 分析服务集成概述](s3-tables-integration-overview.md)。

要使用此查询，请将 `amzn-s3-demo-table-bucket` 替换为您要在其中创建新输出表的客户管理的现有表存储桶的名称。将 *`existing_namespace`* 替换为表存储桶中您要在其中创建输出表的命名空间的名称。将 *`new_table`* 替换为要用于输出表的名称。确保输出表的名称符合[表命名规则](s3-tables-buckets-naming.md#naming-rules-table)。

要在 Amazon Athena 中运行此查询，请确保为包含清单表的通用存储桶元数据配置选择 `s3tablescatalog/aws-s3` 目录和 `b_general-purpose-bucket-name` 数据库。

```
-- If you don't want to output the results to a new table, remove the following two lines 
-- (everything before the WITH clause). 
CREATE TABLE "s3tablescatalog/amzn-s3-demo-table-bucket"."existing_namespace"."new_table" 
as (
WITH 
my_inventory AS (
  SELECT 
        bucket,
        key,
        version_id,
        sequence_number,
        is_delete_marker,
        size,
        last_modified_date,
        storage_class
  FROM inventory
-- For prefix filtering, use a WHERE clause with % at the end.
--     WHERE key LIKE 'prefix%'
  ),
 
inventory_with_is_latest as (
SELECT *,
       ROW_NUMBER() OVER (
         PARTITION BY key 
         ORDER BY sequence_number DESC
       ) = 1 AS is_latest
FROM my_inventory
    )

SELECT
        bucket,
        key,
        version_id,
        sequence_number,
        is_delete_marker,
        size,
        last_modified_date,
        storage_class,
        is_latest

FROM inventory_with_is_latest

-- If you want only the current version of each key, uncomment the following WHERE clause.
-- WHERE is_latest = TRUE
-- If you aren't outputting the results to a new table, remove the next line: 
);
```

# 将自定义元数据与 S3 元数据表相联接
<a name="metadata-tables-join-custom-metadata"></a>

可以分析 AWS 托管式元数据表和客户（自行管理的）元数据表中的数据。通过使用标准 SQL `JOIN` 运算符，您可以查询来自这些多个来源的数据。

以下示例 SQL 查询在 AWS 托管式日记表 (`"journal"`) 和自行管理的元数据表 (`my_self_managed_metadata_table`) 之间查找匹配的记录。该查询还会根据 `CREATE` 事件筛选信息，这些事件表明已将新对象（或对象的新版本）写入存储桶。(有关更多信息，请参阅 [S3 元数据日记表架构](metadata-tables-schema.md)。)

```
SELECT *
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."journal" a
JOIN "my_namespace"."my_self_managed_metadata_table" b
ON a.bucket = b.bucket AND a.key = b.key AND a.version_id = b.version_id
WHERE a.record_type = 'CREATE';
```

以下示例 SQL 查询在 AWS 托管式清单表 (`"inventory"`) 和自行管理的元数据表 (`my_self_managed_metadata_table`) 之间查找匹配的记录：

```
SELECT *
FROM "s3tablescatalog/aws-s3"."b_general-purpose-bucket-name"."inventory" a
JOIN "my_namespace"."my_self_managed_metadata_table" b
ON a.bucket = b.bucket AND a.key = b.key AND a.version_id = b.version_id;
```

# 使用 Amazon Quick 实现元数据表数据可视化
<a name="metadata-tables-quicksight-dashboards"></a>

借助 Amazon Quick，可以创建交互式控制面板，以分析和可视化有关 S3 托管式元数据表的 SQL 查询结果。Quick 控制面板有助于您监控统计数据、跟踪更改并获得有关元数据表的操作见解。

有关日记表的控制面板可能会向您显示：
+ 与删除对象相比，对象上传的百分比是多少？
+ S3 生命周期在过去 24 小时内删除了哪些对象？
+ 最近的 `PUT` 请求来自哪些 IP 地址？

有关清单表的控制面板可能会向您显示：
+ 有多少个对象属于不同的存储类？
+ 与大型对象相比，小型对象占存储数据的百分比是多少？
+ 我的存储桶中有哪些类型的对象？

[集成 S3 表存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)与 AWS 分析服务后，可以从元数据表中创建数据集，然后通过从查询引擎中使用 SPICE 或直接 SQL 查询，来在 Amazon Quick 中使用这些数据集。Quick 支持将 Amazon Athena 和 Amazon Redshift 作为数据来源。

有关更多信息，请参阅[使用 Amazon Quick 实现表数据可视化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-quicksight.html)。

# 对 S3 元数据进行故障排除
<a name="metadata-tables-troubleshooting"></a>

使用以下信息可协助您诊断和修复在使用 Amazon S3 元数据时可能遇到的常见问题。

## 我无法删除我的 AWS 托管式表存储桶和元数据表
<a name="metadata-tables-troubleshooting-cannot-delete-aws-managed-bucket-or-tables"></a>

在删除元数据表之前，必须先删除通用存储桶中的关联元数据表配置。有关更多信息，请参阅 [删除元数据表配置](metadata-tables-delete-configuration.md)。

在删除 AWS 托管式表存储桶之前，必须先删除与此存储桶关联的所有元数据表配置以及该存储桶中的所有元数据表。有关更多信息，请参阅[删除元数据表配置](metadata-tables-delete-configuration.md)和[删除元数据表](metadata-tables-delete-table.md)。

## 我无法设置或更改我的 AWS 托管式元数据表的加密设置
<a name="metadata-tables-troubleshooting-cannot-change-encryption"></a>

创建元数据表配置时，可以选择通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密 AWS 托管式元数据表。如果您选择使用 SSE-KMS，则必须提供与通用存储桶位于同一区域的客户自主管理型 KMS 密钥。只能在创建表的过程中为表设置加密类型。创建 AWS 托管式表后，无法更改其加密设置。要为元数据表指定 SSE-KMS，您必须具有特定的权限。有关更多信息，请参阅 [SSE-KMS 的权限](metadata-tables-permissions.md#metadata-kms-permissions)。

元数据表的加密设置优先于默认的存储桶级加密设置。如果不为表指定加密，它将继承存储桶中的默认加密设置。

默认情况下，AWS 托管式表存储桶通过使用 Amazon S3 托管式密钥的服务器端加密（SSE-S3）进行加密。创建第一个元数据配置后，可以将 AWS 托管式表存储桶的默认加密设置设为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。有关更多信息，请参阅 [Encryption for AWS managed table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-aws-managed-buckets.html#aws-managed-buckets-encryption) 和[在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](s3-tables-kms-specify.md)。

## 当我尝试重新创建元数据表配置时，出现错误
<a name="metadata-tables-troubleshooting-cannot-recreate-configuration"></a>

删除元数据表配置仅删除配置。即使您删除元数据表配置，AWS 托管式表存储桶和元数据表也仍然存在。

如果删除元数据表配置，并想为同一个通用存储桶重新创建配置，则必须先从 AWS 托管式表存储桶中手动删除旧的日记表和清单表。否则，创建新的元数据表配置将失败，因为这些表已经存在。

要删除元数据表，请参阅[删除元数据表](metadata-tables-delete-table.md)。

## 我无法在配置中启用清单表
<a name="metadata-tables-troubleshooting-cannot-enable-inventory"></a>

如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，则无法对该配置启用清单表。我们建议您删除配置并重新创建配置，以便可以创建清单表并使日记表记录过期。有关更多信息，请参阅 [对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](metadata-tables-create-configuration.md#metadata-tables-migration)。

## 我无法在配置中启用日记表记录过期
<a name="metadata-tables-troubleshooting-cannot-enable-record-expiration"></a>

如果您在 2025 年 7 月 15 日之前创建了 S3 元数据配置，则无法对该配置启用日记表记录过期。我们建议您删除配置并重新创建配置，以便可以使日记表记录过期并创建清单表。有关更多信息，请参阅 [对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](metadata-tables-create-configuration.md#metadata-tables-migration)。

## 我无法查询元数据表
<a name="metadata-tables-troubleshooting-cannot-query-metadata-tables"></a>

如果您无法查询元数据表，请确认以下各项：
+ 当您使用 Amazon Athena 或 Amazon Redshift 查询元数据表时，必须用引号 (`"`) 或反勾号 (```) 将元数据表命名空间名称括起来，否则查询可能无法运行。
+ 在 Amazon EMR 或其它第三方引擎上使用 Apache Spark 查询元数据表时，建议您使用 Amazon S3 表类数据存储服务 Iceberg REST 端点。如果不使用此端点，查询可能无法成功运行。有关更多信息，请参阅 [使用 Amazon S3 表类数据存储服务 Iceberg REST 端点访问表](s3-tables-integrating-open-source.md)。
+ 确保您拥有查询元数据表的适当 AWS Identity and Access Management（IAM）权限。有关更多信息，请参阅 [用于查询元数据表的权限](metadata-tables-bucket-query-permissions.md)。
+ 如果您使用的是 Amazon Athena，但在尝试运行查询时收到错误，请执行以下操作：
  + 如果您在尝试在 Athena 中运行查询时收到错误“权限不足，无法执行查询。主体对指定的资源没有任何权限”，则必须向您授予对于表的必需 Lake Formation 权限。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](grant-permissions-tables.md#grant-lf-table)。
  + 如果您在尝试运行查询时收到错误“Iceberg 无法访问所请求的资源”，请转到 AWS Lake Formation 控制台，并确保您已授予自己对您创建的表存储桶目录和数据库（命名空间）的权限。授予这些权限时请勿指定表。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](grant-permissions-tables.md#grant-lf-table)。

## 我在尝试使用某些 S3 元数据 AWS CLI 命令和 API 操作时收到 405 错误
<a name="metadata-tables-troubleshooting-405-errors"></a>

对 V2 元数据表配置调用 V1 `GetBucketMetadataTableConfiguration` API 操作或使用 `get-bucket-metadata-table-configuration` AWS Command Line Interface（AWS CLI）命令会导致 HTTP `405 Method Not Allowed` 错误。同样，调用 V1 `DeleteBucketMetadataTableConfiguration` API 操作或使用 `delete-bucket-metadata-table-configuration` AWS CLI 命令也会导致 405 错误。

可以对 V1 或 V2 元数据表配置使用 V2 `GetBucketMetadataConfiguration` API 操作或 `get-bucket-metadata-configuration` AWS CLI 命令。同样，可以对 V1 或 V2 元数据表配置使用 V2 `DeleteBucketMetadataConfiguration` API 操作或 `delete-bucket-metadata-configuration` AWS CLI 命令。

我们建议更新流程以使用新的 V2 API 操作（`CreateBucketMetadataConfiguration`、`GetBucketMetadataConfiguraion` 和 `DeleteBucketMetadataConfiguration`），而不使用 V1 API 操作。有关从 S3 元数据的 V1 迁移到 V2 的更多信息，请参阅[对在 2025 年 7 月 15 日之前创建的元数据配置启用清单表](metadata-tables-create-configuration.md#metadata-tables-migration)。

要确定配置是 V1 还是 V2，可以查看 `GetBucketMetadataConfiguration` API 响应的以下属性。AWS 托管式存储桶类型 (`"aws"`) 表示 V2 配置，而客户管理的存储桶类型 (`"customer"`) 表示 V1 配置。

```
"MetadataTableConfigurationResult": {
            "TableBucketType": ["aws" | "customer"]
```

有关更多信息，请参阅 [查看元数据表配置](metadata-tables-view-configuration.md)。