亚马逊AWS官方博客

Amazon S3 Metadata 现在支持所有 S3 对象的元数据

除了显示新的对象和更改以外,Amazon S3 Metadata 现在还可以全面显示 Amazon Simple Storage Service(Amazon S3)存储桶中的所有现有对象。借助这个更大的覆盖范围,您可以分析和查询整个 S3 存储空间的元数据。

如今,很多客户依赖 Amazon S3 来大规模存储非结构化数据。要了解存储桶中的内容,通常需要构建一些自定义系统并进行维护,以便扫描对象、跟踪更改,以及随着时间的推移而管理元数据。这些系统不仅维护成本高昂,而且随着数据不断增加,很难保持最新状态。

自从 S3 Metadata 在 Re:Invent 2024 上推出以来,您就已经可以使用元数据表来查询新的对象元数据和更新后的对象元数据,而不再依赖 Amazon S3 清单 或对象级 API(例如 ListObjectsHeadObjectGetObject),这些 API 可能会产生延迟并影响下游工作流。

为了让您更轻松地使用这些经过扩展的元数据,S3 Metadata 引入了可以与基于 SQL 的常用工具结合使用的实时清单表。将现有对象回填到系统之后,任何更新(例如上传或删除操作)通常都会在一小时内出现在您的实时清单表中。

使用 S3 Metadata 实时清单表,您将获得一个完全托管式 Apache Iceberg 表,此表提供了存储桶中的对象及其元数据(包括现有的对象)的完整最新快照,这要归功于回填支持。系统会在上传或删除等更改之后的一小时内自动刷新这些表,这样您就可以随时了解最新情况。您可以使用这些表来识别具有特定属性(例如未加密的数据、缺失的标签或者特定的存储类别)的对象,并支持分析、成本优化、审计和治理等操作。

系统会在您配置实时清单表时自动启用 S3 Metadata 日志表(以前称为 S3 Metadata 表),它们可以近乎实时地提供存储桶中的对象级变更(包括上传、删除和元数据更新)的视图。这些表非常适合审计活动、跟踪对象生命周期以及生成事件驱动型洞察。例如,您可以使用它们来了解在过去的 24 小时内删除了哪些对象、确定执行 PUT 操作最多的请求者,或者监控随着时间的推移对对象元数据进行的更新。

系统使用与您的存储桶名称类似的命名空间名称来创建 S3 Metadata 表,以便于进行发现。这些表存储在 AWS 系统表存储桶中,按账户和地区进行分组。为通用 S3 存储桶启用 S3 Metadata 之后,系统会为您创建并维护这些表。您无需管理压缩或垃圾回收流程,S3 表会在后台执行表维护任务。

这些新表有助于避免必须等待发现元数据之后才能开始处理,这样就使它们成为了大规模分析和机器学习(ML)工作负载的理想选择。通过提前查询元数据,您可以更高效地安排 GPU 作业并减少计算密集型环境中的空闲时间。

下面我们来看看它的工作原理

为了了解它在实践中的工作原理,我要使用 AWS 管理控制台为通用存储桶配置 S3 Metadata。

S3 Metadata,从通用存储桶开始

选择通用存储桶之后,选择元数据选项卡,然后选择创建元数据配置

S3 Metadata,配置日志表和清单表对于日志表,可以选择服务器端加密选项和记录到期日期。对于实时清单表,选择已启用,然后可以选择服务器端加密选项。

为日志表配置记录到期日期。日志表记录将在指定的天数之后过期,在示例中是 365 天(一年)。

随后,选择创建元数据配置

S3 Metadata,回填

S3 Metadata 将创建实时清单表和日志表。在实时清单表部分中,可以观察表状态:系统会立即开始使用现有的对象元数据来回填此表。这一过程可能花费几分钟甚至数小时的时间。确切的时间取决于 S3 存储桶中的对象数量。

在等待期间,还要上传和删除对象,以便在日志表中生成数据。

随后,导航到 Amazon Athena,以便开始查询这些新表。

S3 Metadata,使用 Athena 进行查询

选择使用 Athena 查询表来开始查询表。可以在控制台上的几个默认查询之间进行选择。

S3 MetaData 表结构

在 Athena 中,观察 AWSDataCatalog 数据来源中表的结构,首先要执行一个简短的查询,以便检查日志表中具有多少个可用的记录。已经拥有 6488 个条目:

SELECT count(*) FROM "b_aws_news_blog_metadata_inventory_ns"."journal";

# _col0
1 6488

下面是尝试对日志表执行的几个示例查询:

# 查询在过去的 24 小时内删除的对象
# 对采用版本控制的存储桶使用 is_delete_marker=true,否则使用 record_type='DELETE'
SELECT bucket, key, version_id, last_modified_date
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."journal"
WHERE last_modified_date >= (current_date - interval '1' day) AND is_delete_marker = true;

# bucket key version_id last_modified_date is_delete_marker
1 aws-news-blog-metadata-inventory .build/index-build/arm64-apple-macosx/debug/index/store/v5/records/G0/NSURLSession.h-JET61D329FG0 
2 aws-news-blog-metadata-inventory .build/index-build/arm64-apple-macosx/debug/index/store/v5/records/G5/cdefs.h-PJ21EUWKMWG5 
3 aws-news-blog-metadata-inventory .build/index-build/arm64-apple-macosx/debug/index/store/v5/records/FX/buf.h-25EDY57V6ZXFX 
4 aws-news-blog-metadata-inventory .build/index-build/arm64-apple-macosx/debug/index/store/v5/records/G6/NSMeasurementFormatter.h-3FN8J9CLVMYG6 
5 aws-news-blog-metadata-inventory .build/index-build/arm64-apple-macosx/debug/index/store/v5/records/G8/NSXMLDocument.h-1UO2NUJK0OAG8 

# 查询最近的 PUT 请求 IP 地址
SELECT source_ip_address, count(source_ip_address)
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."journal"
GROUP BY source_ip_address;

#	source_ip_address	_col1
1	my_laptop_IP_address	12488

# 查询过去 7 天内的 S3 生命周期过期对象
SELECT bucket, key, version_id, last_modified_date, record_timestamp
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."journal"
WHERE requester = 's3.amazonaws.com' AND record_type = 'DELETE' AND record_timestamp > (current_date - interval '7' day);

(不适用于我的演示存储桶)

这些结果帮助跟踪了已经移除的特定对象,包括它们的时间戳。

现在,来看一下实时清单表:

# 对象标签的分布
SELECT object_tags, count(object_tags)
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."inventory"
GROUP BY object_tags;

# object_tags    _col1
1 {Source=Swift} 1
2 {Source=swift} 1
3 {}             12486

# 查询特定标签的存储类和大小
SELECT storage_class, count(*) as count, sum(size) / 1024 / 1024 as usage
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."inventory"
GROUP BY object_tags['pii=true'], storage_class;

# storage_class count   usage
1 STANDARD      124884  165

# 查找具有特定用户定义元数据的对象
SELECT key, last_modified_date, user_metadata
FROM "s3tablescatalog/aws-managed-s3"."b_aws_news_blog_metadata_inventory_ns"."inventory"
WHERE cardinality(user_metadata) > 0 ORDER BY last_modified_date DESC;

(不适用于我的演示存储桶)

这些只是 S3 Metadata 可能实现的几个示例。您的首选查询将取决于您的使用案例。请参阅 AWS 存储博客中的使用 Amazon Athena 和 Amazon QuickSight 分析 Amazon S3 Metadata,以了解更多示例。

定价和发布情况

S3 Metadata 实时清单表和日志表现已在美国东部(俄亥俄州、弗吉尼亚州北部)和美国西部(北加利福尼亚)推出。

日志表每百万次更新收费 0.30 美元。这比我们之前的价格降低了 33%。

对于清单表,一百万个对象的一次性回填(用于设置表和为现有的对象生成元数据)费用为 0.30 美元。如果存储桶的对象数量少于十亿个,将不会产生额外费用。对于包含十亿个对象以上的存储桶,每月每百万个对象的月度费用为 0.10 美元。

像往常一样,Amazon S3 定价页面包含所有详细信息。

使用 S3 Metadata 实时清单表和日志表,您可以减少浏览和管理大型数据集时需要投入的时间和精力。您可以获得最新的存储视图和更改记录,这两者都可以作为 Iceberg 表使用,供您按需进行查询。您可以加快数据发现速度、增强合规性工作流,以及优化机器学习管道。

首先,您可以通过 AWS 管理控制台、AWS 命令行界面(AWS CLI)AWS 软件开发工具包在 S3 存储桶上启用元数据清单。将其启用后,系统会自动创建和更新日志表和实时清单表。要了解更多信息,请访问 S3 Metadata 文档页面

— seb


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。