将 Amazon S3 表类数据存储服务与 Amazon 分析服务结合使用 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Amazon S3 表类数据存储服务与 Amazon 分析服务结合使用

要使 Amazon 分析服务可以访问您账户中的表,您可以将 Amazon S3 表存储桶与 Amazon SageMaker 智能湖仓集成。这种集成支持 Amazon 分析服务自动发现和访问您的表数据。您可以使用此集成在以下服务中处理表:

注意

此集成使用 Amazon Glue 和 Amazon Lake Formation 服务,可能会产生 Amazon Glue 请求和存储成本。有关更多信息,请参阅 Amazon Glue 定价

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

集成的工作原理

当您在控制台中创建表存储桶时,Amazon S3 会启动以下操作,来将您选择的区域中的表存储桶与 Amazon 分析服务集成:

  1. 创建一个新的 Amazon Identity and Access Management(IAM)服务角色,该角色授予 Lake Formation 访问所有表存储桶的权限。

  2. 使用服务角色,Lake Formation 在当前区域中注册表存储桶。这可让 Lake Formation 管理该区域中所有当前和将来的表存储桶的访问、权限和治理。

  3. s3tablescatalog 目录添加到当前区域中的 Amazon Glue Data Catalog。添加 s3tablescatalog 目录后,就可以在数据目录中填充所有表存储桶、命名空间和表。

注意

这些操作通过 Amazon S3 控制台自动完成。如果您以编程方式执行此集成,则必须手动执行所有这些操作。

您可以为每个 Amazon 区域集成一次表存储桶。完成集成后,所有当前和将来的表存储桶、命名空间和表都将添加到该区域中的 Amazon Glue Data Catalog。

下图显示了 s3tablescatalog 目录如何自动将当前区域中的表存储桶、命名空间和表填充为数据目录中的相应对象。表存储桶以子目录的形式填充。表存储桶中的命名空间以数据库的形式填充到其各自的子目录中。表以表的形式填充到各自的数据库中。

在 Amazon Glue Data Catalog 中表示表资源的方式。
权限的工作原理

我们建议将表存储桶与 Amazon 分析服务集成,以便您可以跨使用 Amazon Glue Data Catalog 作为元数据存储的服务处理表数据。该集成通过 Amazon Lake Formation 支持精细的访问控制。这种安全方法意味着,除了 Amazon Identity and Access Management(IAM)权限外,您还必须向 IAM 主体授予对表的 Lake Formation 权限,然后才能使用这些表。

Amazon Lake Formation 中有两种主要类型的权限:

  • 元数据访问权限控制着在数据目录中创建、读取、更新和删除元数据数据库和表的能力。

  • 基础数据访问权限控制着对数据目录资源指向的基础 Amazon S3 位置读取和写入数据的能力。

Lake Formation 结合使用自己的权限模型和 IAM 权限模型,来控制对数据目录资源和基础数据的访问权限:

  • 为了使访问数据目录资源或基础数据的请求取得成功,请求必须通过由 IAM 和 Lake Formation 进行的权限检查。

  • IAM 权限控制对 Lake Formation 和 Amazon Glue API 以及资源的访问权限,而 Lake Formation 权限控制对数据目录资源、Amazon S3 位置和基础数据的访问权限。

Lake Formation 权限仅适用于授予这些权限的区域,并且主体必须由数据湖管理员或其它具有必要权限的主体授权,才能获得 Lake Formation 权限。

有关更多信息,请参阅《Amazon Lake Formation 开发人员指南》中的 Lake Formation 权限概览

请确保按照集成的先决条件将表存储桶与 Amazon 分析服务集成中的步骤进行操作,以便您拥有访问 Amazon Glue Data Catalog 和表资源以及使用 Amazon 分析服务的相应权限。

重要

如果您不是为您的账户执行表存储桶与 Amazon 分析服务集成的用户,则必须向您授予对表的必要 Lake Formation 权限。有关更多信息,请参阅 授予对表或数据库的权限

集成的先决条件

要将表存储桶与 Amazon 分析服务集成,需要满足以下先决条件:

重要

创建表时,请确保在表名称和表定义中全部使用小写字母。例如,请确保列名称全部为小写。如果表名称或表定义包含大写字母,则 Amazon Lake Formation 或 Amazon Glue Data Catalog 不支持该表。在这种情况下,Amazon Athena 等 Amazon 分析服务将无法看到您的表,即使表存储桶与 Amazon 分析服务集成,也不例外。

如果表定义包含大写字母,则在 Athena 中运行 SELECT 查询时会收到以下错误消息:“GENERIC_INTERNAL_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names.”

将表存储桶与 Amazon 分析服务集成

每个 Amazon 区域必须完成一次此集成。

重要

Amazon 分析服务集成现在可在 registerResource Lake Formation API 操作中使用 WithPrivilegedAccess 选项来注册 S3 表存储桶。现在,集成还会通过在 CreateCatalog Amazon Glue API 操作中使用 AllowFullTableExternalDataAccess 选项来在 Amazon Glue Data Catalog 中创建 s3tablescatalog 目录。

如果您使用预览版设置集成,则可以继续使用当前的集成。但是,更新的集成流程提供了性能改进,因此我们建议进行迁移。要迁移到更新的集成,请参阅迁移到更新的集成流程

  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择表存储桶

  3. 选择创建表存储桶

    此时将打开创建表存储桶页面。

  4. 输入表存储桶名称,并确保选中启用集成复选框。

  5. 选择创建表存储桶。Amazon S3 将尝试自动在该区域中集成您的表存储桶。

首次在任何区域中集成表存储桶时,Amazon S3 都会代表您创建一个新的 IAM 服务角色。此角色可让 Lake Formation 访问您账户中的所有表存储桶,并以联合身份验证方式访问 Amazon Glue Data Catalog 中的表。

使用 Amazon CLI 集成表存储桶

以下步骤展示了如何使用 Amazon CLI 来集成表存储桶。要使用这些步骤,请将 user input placeholders 替换为您自己的信息。

  1. 创建表存储桶。

    aws s3tables create-table-bucket \ --region us-east-1 \ --name amzn-s3-demo-table-bucket
  2. 创建可让 Lake Formation 访问表资源的 IAM 服务角色。

    1. 创建一个名为 Role-Trust-Policy.json 的文件,其中包含以下信任策略:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "LakeFormationDataAccessPolicy", "Effect": "Allow", "Principal": { "Service": "lakeformation.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:SetContext", "sts:SetSourceIdentity" ], "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } } ] }

      使用以下命令创建 IAM 服务角色:

      aws iam create-role \ --role-name S3TablesRoleForLakeFormation \ --assume-role-policy-document file://Role-Trust-Policy.json
    2. 创建一个名为 LF-GluePolicy.json 的文件,其中包含以下策略:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "LakeFormationPermissionsForS3ListTableBucket", "Effect": "Allow", "Action": [ "s3tables:ListTableBuckets" ], "Resource": [ "*" ] }, { "Sid": "LakeFormationDataAccessPermissionsForS3TableBucket", "Effect": "Allow", "Action": [ "s3tables:CreateTableBucket", "s3tables:GetTableBucket", "s3tables:CreateNamespace", "s3tables:GetNamespace", "s3tables:ListNamespaces", "s3tables:DeleteNamespace", "s3tables:DeleteTableBucket", "s3tables:CreateTable", "s3tables:DeleteTable", "s3tables:GetTable", "s3tables:ListTables", "s3tables:RenameTable", "s3tables:UpdateTableMetadataLocation", "s3tables:GetTableMetadataLocation", "s3tables:GetTableData", "s3tables:PutTableData" ], "Resource": [ "arn:aws:s3tables:us-east-1:111122223333:bucket/*" ] } ] }

      使用以下命令将策略附加到角色:

      aws iam put-role-policy \ --role-name S3TablesRoleForLakeFormation \ --policy-name LakeFormationDataAccessPermissionsForS3TableBucket \ --policy-document file://LF-GluePolicy.json
  3. 创建一个名为 input.json 的文件,其中包含以下内容:

    { "ResourceArn": "arn:aws:s3tables:us-east-1:111122223333:bucket/*", "WithFederation": true, "RoleArn": "arn:aws:iam::111122223333:role/S3TablesRoleForLakeFormation" }

    使用以下命令在 Lake Formation 中注册表存储桶:

    aws lakeformation register-resource \ --region us-east-1 \ --with-privileged-access \ --cli-input-json file://input.json
  4. 创建一个名为 catalog.json 的文件,其中包含以下目录:

    { "Name": "s3tablescatalog", "CatalogInput": { "FederatedCatalog": { "Identifier": "arn:aws:s3tables:us-east-1:111122223333:bucket/*", "ConnectionName": "aws:s3tables" }, "CreateDatabaseDefaultPermissions":[], "CreateTableDefaultPermissions":[] } }

    使用以下命令创建 s3tablescatalog 目录。创建此目录后,将使用与表存储桶、命名空间和表对应的对象填充 Amazon Glue Data Catalog。

    aws glue create-catalog \ --cli-input-json file://catalog.json
  5. 使用以下命令验证是否在 Amazon Glue 中添加了 s3tablescatalog 目录:

    aws glue get-catalog --catalog-id s3tablescatalog

Amazon 分析服务集成流程已更新。如果您已使用预览版设置了集成,则可以继续使用当前的集成。但是,更新的集成流程提供了性能改进,因此我们建议使用以下步骤进行迁移。有关迁移或集成流程的更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 Creating an Amazon S3 Tables catalog in the Amazon Glue Data Catalog

  1. 打开 Amazon Lake Formation 控制台(网址为 https://console.amazonaws.cn/lakeformation/),并以数据湖管理员身份登录。有关如何创建数据湖管理员的更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 Create a data lake administrator

  2. 通过执行以下操作删除 s3tablescatalog 目录:

    • 在左侧导航窗格中,选择目录

    • 目录列表中,选择 s3tablescatalog 目录旁边的选项按钮。在操作 菜单上,选择删除

  3. 通过执行以下操作注销 s3tablescatalog 目录的数据位置:

    • 在左侧导航窗格中,转到管理部分,然后选择数据湖位置

    • 例如,选择 s3tablescatalog 数据湖位置(例如 s3://tables:region:account-id:bucket/*)旁边的选项按钮。

    • 操作菜单上,选择移除

    • 在出现的确认对话框中,选择移除

  4. 现在,您已经删除了 s3tablescatalog 目录和数据湖位置,可以按照以下步骤,使用更新的集成流程将表存储桶与 Amazon 分析服务集成

注意

如果您想在集成的 Amazon 分析服务中使用通过 SSE-KMS 加密的表,则您使用的角色需要拥有使用您的 Amazon KMS 密钥进行加密操作的权限。有关更多信息,请参阅 向 IAM 主体授予在集成的 Amazon 分析服务中使用加密表的权限

要访问表,Amazon Data Firehose 需要一个以表的命名空间为目标的资源链接。资源链接是一个数据目录对象,它充当指向另一个数据目录资源(如数据库或表)的别名或指针。该链接存储在创建该链接的账户或区域的数据目录中。有关更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 How resource links work

将表存储桶与 Amazon 分析服务集成后,可以创建资源链接,以便在 Amazon Data Firehose 中使用表。有关创建这些链接的更多信息,请参阅使用 Amazon Data Firehose 将数据流式传输到表

授予对表资源的 Lake Formation 权限

在表存储桶与 Amazon 分析服务集成后,Lake Formation 将管理对表资源的访问权限。Lake Formation 使用其自己的权限模型(Lake Formation 权限),该模型可以对数据目录资源进行精细的访问控制。Lake Formation 要求向每个 IAM 主体(用户或角色)授权对 Lake Formation 管理的资源执行操作。有关更多信息,请参阅《Amazon Lake Formation 开发人员指南》中的 Lake Formation 权限概览。有关跨账户数据共享的信息,请参阅《Amazon Lake Formation Developer Guide》中的 Cross-account data sharing in Lake Formation

在 IAM 主体可以访问 Amazon 分析服务中的表之前,您必须向这些主体授予对这些资源的 Lake Formation 权限。

注意

如果您是执行表存储桶集成的用户,则您已经拥有对表的 Lake Formation 权限。如果您是唯一将访问表的主体,则可以跳过此步骤。您只需向其它 IAM 主体授予对表的 Lake Formation 权限即可。这可让其它主体在运行查询时访问该表。有关更多信息,请参阅 授予对表或数据库的权限

您必须向其它 IAM 主体授予对表资源的 Lake Formation 权限,才能在以下服务中使用这些资源:

  • Amazon Redshift

  • Amazon Data Firehose

  • Amazon QuickSight

  • Amazon Athena

注意

对于 Amazon Data Firehose(它使用资源链接访问表),必须分别授予对资源链接和目标(链接)命名空间的权限。有关更多信息,请参阅 授予对资源链接的权限

授予对表或数据库的权限

您可以通过 Lake Formation 控制台或 Amazon CLI,向主体授予对表存储桶中表或数据库的 Lake Formation 权限。

注意

当您将对数据目录资源的 Lake Formation 权限授予外部账户或直接授予其他账户中的 IAM 主体时,Lake Formation 会使用 Amazon Resource Access Manager (Amazon RAM) 服务共享该资源。如果被授权者账户与授予者账户在同一个组织中,则被授权者立即可以使用共享资源。如果被授权者账户不在同一个组织中,则 Amazon RAM 会向被授权者账户发送邀请,以便其接受或拒绝资源授权。然后,要使共享资源可用,被授权者账户中的数据湖管理员必须使用 Amazon RAM 控制台或 Amazon CLI 接受邀请。有关跨账户数据共享的更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 Cross-account data sharing in Lake Formation

Console
  1. 打开 Amazon Lake Formation 控制台(网址为 https://console.amazonaws.cn/lakeformation/),并以数据湖管理员身份登录。有关如何创建数据湖管理员的更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 Create a data lake administrator

  2. 在导航窗格中,选择数据权限,然后选择授予

  3. 授予权限页面的主体下,执行以下操作之一:

    • 对于 Amazon Athena 或 Amazon Redshift,选择 IAM 用户和角色,然后选择 IAM 管理员角色。

    • 对于 Amazon Data Firehose,选择 IAM 用户和角色,然后选择您创建的服务角色以流式传输到表中。

    • 对于 Amazon QuickSight,选择 SAML 用户和组,然后输入 Amazon QuickSight 管理员用户的 Amazon 资源名称(ARN)。

  4. LF 标签或目录资源下,选择命名 Data Catalog 资源

  5. 对于目录,请选择您在集成表存储桶时创建的子目录,例如 account-id:s3tablescatalog/amzn-s3-demo-bucket

  6. 对于数据库,选择您创建的 S3 表存储桶命名空间。

  7. (可选)对于,请选择您在表存储桶中创建的 S3 表。

    注意

    如果您要在 Athena 查询编辑器中创建新表,请不要选择表。

  8. 请执行以下操作之一:

    • 如果您在之前的步骤中指定了表,请为表权限选择 Super

    • 如果您未在之前的步骤中指定表,请转到数据库权限。对于跨账户数据共享,您不能选择 Super 来向另一个主体授予对数据库的所有权限。而是应选择更精细的权限,例如描述

  9. 选择授权

CLI
  1. 务必要以数据湖管理员身份运行以下 Amazon CLI 命令。有关更多信息,请参阅《Amazon Lake Formation Developer Guide》中的 Create a data lake administrator

  2. 运行以下命令,向 IAM 主体授予对 S3 表存储桶中表的 Lake Formation 权限以访问该表。要使用此示例,请将 user input placeholders 替换为您自己的信息。

    aws lakeformation grant-permissions \ --region us-east-1 \ --cli-input-json \ '{ "Principal": { "DataLakePrincipalIdentifier": "user or role ARN, for example, arn:aws:iam::account-id:role/example-role" }, "Resource": { "Table": { "CatalogId": "account-id:s3tablescatalog/amzn-s3-demo-bucket", "DatabaseName": "S3 table bucket namespace, for example, test_namespace", "Name": "S3 table bucket table name, for example test_table" } }, "Permissions": [ "ALL" ] }'