View a markdown version of this page

将元数据导出到 S3 表类数据存储服务(预览) - AWS Glue

将元数据导出到 S3 表类数据存储服务(预览)

注意

目录元数据导出功能作为预览功能提供。此功能在正式发布之前可能会更改。

概述

您可以将 AWS Glue Data Catalog 元数据导出到存储在 Amazon S3 表类数据存储服务中的托管目录系统表。当您启用 S3 表类数据存储服务导出时,您的技术和业务元数据将存储在 AWS 托管的 aws-catalog 表存储桶的只读 Apache Iceberg 表中,因此可以使用 SQL 以及 AWS 分析服务(如 Amazon Redshift 和 Amazon EMR)对其进行查询。

在 aws-catalog 表存储桶中,系统表位于以下命名空间中:

  • glue:包含 tables 和 table_columns。

  • catalog_metadata:包含 glossaries、glossary_terms、associated_glossary_terms、attachments 和 item_attachments。

目前支持以下系统表:

系统表 包含

tables

Data Catalog 中每个表的技术和业务元数据,例如其名称、数据库、描述、存储位置和格式。

table_columns

每个目录表的列,包括每列的名称、数据类型、描述以及该列是否为分区键。

glossaries

目录中的业务术语表,包括每个术语表的名称、描述和状态。

glossary_terms

术语表中定义的术语,包括每个术语的名称、描述、父术语表和状态。

associated_glossary_terms

术语表术语与资产之间的关联,包括资产标识符和术语表术语标识符。

attachments

在资产级别附加的自定义表单元数据,包括表单类型和附件内容。

item_attachments

附加到资产内各项目(例如各个列)的自定义表单元数据,包括可迭代表单名称、项目名称、表单类型和附件内容。

有关每个表的完整列级架构,请参阅 目录系统表参考。

目录元数据导出的工作原理

启用导出功能后,Data Catalog 会对您现有的目录元数据执行一次性回填,然后在您进行更改时持续更新系统表。新写入或更新的元数据通常会在约 5 分钟内显示在系统表中。

系统表位于 aws-catalog 表存储桶内的 glue 和 catalog_metadata 命名空间中。当您的目录中首次出现某类元数据时,给定的系统表才会显示。例如,如果您启用了导出功能,并且目录仅包含表和数据库,则只能看到与表相关的系统表。术语表系统表将在您创建第一个术语表后显示。

使用 AWS CLI 启用目录元数据导出

目录元数据导出是账户级别的设置。您可以使用 AWS CLI 启用或禁用此功能。

先决条件

您使用的 IAM 身份必须具有调用导出配置操作 glue:PutDataCatalogExportConfiguration 和 glue:GetDataCatalogExportConfiguration 以及 s3tables:CreateTable 的权限。有关 S3 表类数据存储服务权限的更多信息,请参阅 Amazon Simple Storage Service 用户指南中的在 S3 表存储桶中创建表。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:PutDataCatalogExportConfiguration", "glue:GetDataCatalogExportConfiguration" ], "Resource": "*" } ] }

S3 表类数据存储服务中的所有数据(包括 Data Catalog 元数据)均默认使用 SSE-S3 加密进行加密。您可以选择使用 AWS KMS 密钥(SSE-KMS)加密目录导出。如果您选择使用 AWS KMS 密钥加密,则必须通过采取以下步骤添加额外的权限:

  1. 向 Data Catalog 导出服务主体和 S3 表类数据存储服务维护服务主体授予使用 KMS 密钥(密钥策略)的权限。

  2. 向运行导出的 IAM 主体授予使用 KMS 密钥(身份策略)的权限。

向 Data Catalog 导出服务主体和 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限

要允许 AWS Glue 导出加密的目录元数据,并对导出的表执行自动表维护(例如压缩和未引用文件移除),必须向以下服务主体授予对您的 KMS 密钥的访问权限:

  • systemtables.catalog.amazonaws.com:将加密的目录元数据导出到 S3 表类数据存储服务。

  • maintenance.s3tables.amazonaws.com:对导出的表执行自动表维护。

AWS Glue 写入名为 aws-catalog 的 AWS 托管表存储桶。用于加密 S3 表类数据存储服务导出的 KMS 密钥不需要与用于加密静态 Data Catalog 的 KMS 密钥相同。AWS Glue 仅支持对称 KMS 密钥。要授予这些服务主体访问权限,您可以使用以下示例密钥策略。在此策略中,向 maintenance.s3tables.amazonaws.com 服务主体授予使用特定 KMS 密钥对 aws-catalog 表存储桶中的表进行加密和解密的权限。有关 S3 表类数据存储服务维护服务主体的更多信息,请参阅 Amazon Simple Storage Service 用户指南 中的 S3 表类数据存储服务 SSE-KMS 加密的权限要求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSystemTablesDescribeKey", "Effect": "Allow", "Principal": { "Service": "systemtables.catalog.amazonaws.com" }, "Action": [ "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowSystemTablesEncryptDecrypt", "Effect": "Allow", "Principal": { "Service": "systemtables.catalog.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3tables:us-east-1:123456789012:bucket/aws-catalog/table/*", "kms:ViaService": "s3.us-east-1.amazonaws.com" } } }, { "Sid": "AllowS3TablesMaintenanceEncryptDecrypt", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3tables:us-east-1:123456789012:bucket/aws-catalog/*" } } } ] }

主体导出所需的 IAM 权限

向运行导出的主体授予以下权限。以下策略授予 IAM 主体使用 glue_catalog_id 加密上下文(值为您的 catalogId)解密特定 AWS Glue Data Catalog 的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowDescribeKey", "Effect": "Allow", "Action": [ "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowExportOfGlueDataCatalogByCatalogId", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012", "kms:EncryptionContext:glue_catalog_id": "123456789012" } } } ] }

要启用目录元数据导出

  1. 运行以下命令以启用导出:

    aws glue put-data-catalog-export-configuration \ --export-setting ENABLED
  2. 通过运行以下命令确认配置:

    aws glue get-data-catalog-export-configuration

    响应示例:

    { "ExportSetting": "ENABLED", "Status": "ENABLED", "S3TableBucketArn": "arn:aws:s3tables:us-east-1:111122223333:bucket/aws-catalog" }

    随着初始回填的进行,Status 字段会从 ENABLING 转换为 ENABLED。

要禁用目录元数据导出

运行以下命令:

aws glue put-data-catalog-export-configuration \ --export-setting DISABLED

目录系统表参考

所有系统表都位于 aws-catalog 表存储桶内的 glue 或 catalog_metadata 命名空间中。每个表都包含以下系统列:

列 类型 说明

ingestion_time

timestamp

将记录摄取到系统表的时间(UTC)。

schema_version

字符串

表的架构版本标识符。

表

每个目录表包含一行。

列 类型 说明

id

字符串

表的唯一标识符。

catalog_id

字符串

目录标识符。

catalog_name

字符串

目录名称。

update_time

timestamp

上次更新时间戳。

created_time

timestamp

创建时间戳。

created_by_id

字符串

创建表的主体的标识符。

created_by_type

字符串

创建主体的类型。

description

字符串

表描述。

name

字符串

表名称。

namespace

字符串

表的命名空间。

region_name

字符串

AWS 区域。

tags

map<string, string>

资源标签。

type

字符串

资产类型。

updated_by_id

字符串

上次更新该表的主体的标识符。

updated_by_type

字符串

更新主体的类型。

database_name

字符串

包含该表的数据库。

input_format

字符串

输入格式类。

lake_formation_registration

字符串

AWS Lake Formation 注册状态。

output_format

字符串

输出格式类。

owner

字符串

表拥有者。

retention

int

保留期。

serde_library

字符串

序列化/反序列化库。

table_data_format

字符串

数据格式。

table_data_location

字符串

数据位置 URI。

table_format

字符串

表格式(例如 Iceberg、Hudi)。

table_type

字符串

表类型。

table_columns

目录表中每列包含一行。

列 类型 说明

id

字符串

assetId#columnName 格式的复合标识符。

asset_id

字符串

父表的标识符。

column_name

字符串

列名称。

description

字符串

列描述。

type

字符串

列数据类型。

is_partition_key

布尔值

此列是否为分区键。

attachments

包含资产级自定义表单附件(资产上的每个附件对应一行)。

列 类型 说明

asset_id

字符串

父资产的标识符。

attachment_name

字符串

附件名称。

form_type_id

字符串

内容的已注册表单类型。

content_json

字符串

以 JSON 编码字符串表示的附件内容。

item_attachments

包含可迭代表单中各项目(例如单个列)的附件。

列 类型 说明

asset_id

字符串

父资产的标识符。

iterable_form_name

字符串

可迭代表单的名称(例如,列)。

item_name

字符串

项目的名称(例如,列名称)。

attachment_name

字符串

附件名称。

form_type_id

字符串

内容的已注册表单类型。

content_json

字符串

以 JSON 编码字符串表示的附件内容。

词汇表

每个术语表对应一行。

列 类型 说明

id

字符串

术语表唯一标识符。

description

字符串

术语表描述。

name

字符串

术语表名称。

status

字符串

状态(ENABLED 或 DISABLED)。

glossary_terms

每个术语表术语对应一行。

列 类型 说明

id

字符串

术语唯一标识符。

glossary_id

字符串

父术语表的标识符。

long_description

字符串

详细的术语描述。

name

字符串

术语名称。

short_description

字符串

简要术语描述。

status

字符串

状态(ENABLED 或 DISABLED)。

associated_glossary_terms

术语表术语与资产之间的每个关联包含一行。

列 类型 说明

asset_id

字符串

术语表术语所关联资产的标识符。

glossary_term_id

字符串

与资产关联的术语表术语的标识符。联接到 glossary_terms 表。

查询目录系统表

在使用 AWS 分析服务(如 Amazon EMR)查询导出到 S3 表类数据存储服务的目录元数据之前,必须对 AWS 托管的 aws-catalog 表存储桶启用分析集成,并配置 AWS Lake Formation 权限。

先决条件

  • 目录元数据导出已启用,状态为 ENABLED。

  • 访问或其他分析服务。

  • 启用导出后等待 5 分钟,数据即可使用。

集成概述

有关将 S3 表类数据存储服务与 AWS 分析服务集成的详细信息(包括先决条件、IAM 角色配置和分步操作流程),请参阅《Amazon Simple Storage Service 用户指南》中的将 Amazon S3 表类数据存储服务与 AWS 分析服务集成。

启用 S3 表类数据存储服务导出并设置分析集成后,您可以使用 AWS 分析服务(如 Amazon Redshift 和 Amazon EMR)查询 Data Catalog 元数据。这使您能够使用标准 SQL 执行元数据审计和分析。

示例查询

列出所有目录表及其数据库和格式

SELECT id, name, database_name, table_format FROM aws_catalog.glue.tables;
查找特定表中包含描述的列

SELECT column_name, type, description FROM aws_catalog.glue.table_columns WHERE asset_id = 'table-id';
将术语表术语与其父术语表联接

SELECT g.name AS glossary_name, t.name AS term_name, t.short_description FROM aws_catalog.catalog_metadata.glossary_terms t JOIN aws_catalog.catalog_metadata.glossaries g ON t.glossary_id = g.id WHERE g.status = 'ENABLED';
查找与特定术语表术语关联的表

SELECT t.name, t.database_name, gt.name AS term_name FROM aws_catalog.glue.tables t JOIN aws_catalog.catalog_metadata.associated_glossary_terms agt ON agt.asset_id = t.id JOIN aws_catalog.catalog_metadata.glossary_terms gt ON gt.id = agt.glossary_term_id WHERE gt.name = 'term-name';
从自定义表单附件中提取字段

SELECT asset_id, attachment_name, json_extract_scalar(content_json, '$.owner') AS data_owner FROM aws_catalog.catalog_metadata.attachments WHERE form_type_id = 'your-form-type-id';