

# Amazon S3 表类数据存储服务与 AWS 分析服务集成概述
<a name="s3-tables-integration-overview"></a>

要使 AWS 分析服务可以访问您账户中的表，您可以将 Amazon S3 表存储桶与 Amazon SageMaker 智能湖仓集成。这种集成支持 AWS 分析服务自动发现和访问您的表数据。您可以使用此集成在以下服务中处理表：
+ [Amazon Athena](s3-tables-integrating-athena.md) 
+  [Amazon Redshift](s3-tables-integrating-redshift.md)
+  [Amazon EMR](s3-tables-integrating-emr.md)
+  [Quick](s3-tables-integrating-quicksight.md)
+  [Amazon Data Firehose](s3-tables-integrating-firehose.md)

**注意**  
此集成使用 AWS Glue 和 AWS Lake Formation 服务，可能会产生 AWS Glue 请求和存储成本。有关更多信息，请参阅 [AWS Glue 定价](https://aws.amazon.com/glue/pricing/)。  
在 S3 表上运行查询需支付额外费用。有关更多信息，请参阅您使用的查询引擎的定价信息。

## 集成的工作原理
<a name="how-table-integration-works"></a>

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

1. 创建一个新的 AWS Identity and Access Management（IAM）[服务角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-service.html)，该角色授予 Lake Formation 访问所有表存储桶的权限。

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

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

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

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

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

![\[在 AWS Glue Data Catalog 中表示表资源的方式。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/S3Tables-glue-catalog.png)


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

AWS Lake Formation 中有两种主要类型的权限：
+ 元数据访问权限控制着在数据目录中创建、读取、更新和删除元数据数据库和表的能力。
+ 基础数据访问权限控制着对数据目录资源指向的基础 Amazon S3 位置读取和写入数据的能力。

Lake Formation 结合使用自己的权限模型和 IAM 权限模型，来控制对数据目录资源和基础数据的访问权限：
+ 为了使访问数据目录资源或基础数据的请求取得成功，请求必须通过由 IAM 和 Lake Formation 进行的权限检查。
+ IAM 权限控制对 Lake Formation 和 AWS Glue API 以及资源的访问权限，而 Lake Formation 权限控制对数据目录资源、Amazon S3 位置和基础数据的访问权限。

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

有关更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Overview of Lake Formation permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-overview.html)。

请确保按照[将 S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)中的步骤进行操作，以便您拥有访问 AWS Glue Data Catalog 和表资源以及使用 AWS 分析服务的相应权限。

## 后续步骤
<a name="next-steps-integration-overview"></a>
+ [将 S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)
+ [创建命名空间](s3-tables-namespace-create.md)
+ [创建表](s3-tables-create.md)

# 将 Amazon S3 表类数据存储服务与 AWS 分析服务集成
<a name="s3-tables-integrating-aws"></a>

本主题介绍将 Amazon S3 表存储桶与 AWS 分析服务集成的先决条件和过程。有关集成工作原理的概述，请参阅 [S3 表类数据存储服务集成概述](s3-tables-integration-overview.md)。

**注意**  
此集成使用 AWS Glue 和 AWS Lake Formation 服务，可能会产生 AWS Glue 请求和存储成本。有关更多信息，请参阅 [AWS Glue 定价](https://aws.amazon.com/glue/pricing/)。  
在 S3 表上运行查询需支付额外费用。有关更多信息，请参阅您使用的查询引擎的定价信息。

## 集成的先决条件
<a name="table-integration-prerequisites"></a>

要将表存储桶与 AWS 分析服务集成，需要满足以下先决条件：
+ [创建表存储桶。](s3-tables-buckets-create.md)
+ 将 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLakeFormationDataAdmin.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLakeFormationDataAdmin.html) AWS 托管式策略附加到 AWS Identity and Access Management（IAM）主体，以使该用户成为数据湖管理员。有关如何创建数据湖管理员的更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Create a data lake administrator](https://docs.aws.amazon.com//lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。
+ 向 IAM 主体添加 `glue:PassConnection` 操作的权限。
+ 向 IAM 主体添加 `lakeformation:RegisterResource` 和 `lakeformation:RegisterResourceWithPrivilegedAccess` 操作的权限。
+ [更新到 AWS Command Line Interface（AWS CLI）的最新版本](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html#getting-started-install-instructions)。

**重要**  
创建表时，请确保在表名称和表定义中全部使用小写字母。例如，请确保列名称全部为小写。如果表名称或表定义包含大写字母，则 AWS Lake Formation 或 AWS Glue Data Catalog 不支持该表。在这种情况下，Amazon Athena 等 AWS 分析服务将无法看到您的表，即使表存储桶与 AWS 分析服务集成，也不例外。  
如果表定义包含大写字母，则在 Athena 中运行 `SELECT` 查询时会收到以下错误消息：“GENERIC\$1INTERNAL\$1ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names.”

## 将表存储桶与 AWS 分析服务集成
<a name="table-integration-procedures"></a>

Amazon S3 表类数据存储服务与 AWS Glue Data Catalog（数据目录）集成，并将该目录注册为 Lake Formation 数据位置。您可以通过 Lake Formation 控制台或使用服务 API 来设置此注册。注册位置时，您必须指定 IAM 角色，来向 Lake Formation 注册的角色授予对该位置的读/写权限。Lake Formation 在向集成 AWS 服务提供临时凭证时会代入该角色。

如果您拥有基于 IAM 或 S3 表类数据存储服务资源的策略来根据主体标签限制 IAM 用户和 IAM 角色，则必须将相同的主体标签附加到 Lake Formation 用来访问 Amazon S3 数据的 IAM 角色（例如，LakeFormationDataAccessRole），并为该角色授予必要的权限。这是基于标签的访问控制策略与 S3 表类数据存储服务分析集成正常协同工作所必需的。

每个 AWS 区域均必须配置此集成。

**重要**  
AWS 分析服务集成现在可在 `registerResource` Lake Formation API 操作中使用 `WithPrivilegedAccess` 选项来注册 S3 表存储桶。现在，集成还会通过在 `CreateCatalog` AWS Glue API 操作中使用 `AllowFullTableExternalDataAccess` 选项来在 AWS Glue Data Catalog 中创建 `s3tablescatalog` 目录。  
如果您使用预览版设置集成，则可以继续使用当前的集成。但是，更新的集成流程提供了性能改进，因此我们建议进行迁移。要迁移到更新的集成，请参阅[迁移到更新的集成流程](#migrate-integrate-console)。

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

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

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

1. 选择**创建表存储桶**。

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

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

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

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

### 使用 AWS CLI
<a name="integrate-cli"></a>

**使用 AWS CLI 集成表存储桶**

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

1. 创建表存储桶。

   ```
   aws s3tables create-table-bucket \
   --region us-east-1 \
   --name amzn-s3-demo-table-bucket
   ```

1. 创建可让 Lake Formation 访问表资源的 IAM 服务角色。

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

------
#### [ 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
      ```

   1. 创建一个名为 `LF-GluePolicy.json` 的文件，其中包含以下策略：

------
#### [ 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
      ```

1. 创建一个名为 `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
   ```

1. 创建一个名为 `catalog.json` 的文件，其中包含以下目录：

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

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

   ```
   aws glue create-catalog \
   --region us-east-1 \
   --cli-input-json file://catalog.json
   ```

1. 使用以下命令验证是否在 AWS Glue 中添加了 `s3tablescatalog` 目录：

   ```
   aws glue get-catalog --catalog-id s3tablescatalog
   ```

### 迁移到更新的集成流程
<a name="migrate-integrate-console"></a>

AWS 分析服务集成流程已更新。如果您已使用预览版设置了集成，则可以继续使用当前的集成。但是，更新的集成流程提供了性能改进，因此我们建议使用以下步骤进行迁移。有关迁移或集成流程的更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Creating an Amazon S3 Tables catalog in the AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)。

1. 打开 AWS Lake Formation 控制台（网址为 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)），并以数据湖管理员身份登录。有关如何创建数据湖管理员的更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Create a data lake administrator](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。

1. 通过执行以下操作删除 `s3tablescatalog` 目录：
   + 在左侧导航窗格中，选择**目录**。
   + 在**目录**列表中，选择 `s3tablescatalog` 目录旁边的选项按钮。在**操作** 菜单上，选择**删除**。

1. 通过执行以下操作注销 `s3tablescatalog` 目录的数据位置：
   + 在左侧导航窗格中，转到**管理**部分，然后选择**数据湖位置**。
   + 例如，选择 `s3tablescatalog` 数据湖位置（例如 `s3://tables:region:account-id:bucket/*`）旁边的选项按钮。
   + 在**操作**菜单上，选择**移除**。
   + 在出现的确认对话框中，选择**移除**。

1. 现在，您已经删除了 `s3tablescatalog` 目录和数据湖位置，可以按照以下步骤，使用更新的集成流程[将表存储桶与 AWS 分析服务集成](#table-integration-procedures)。

**注意**  
如果您想在集成的 AWS 分析服务中使用通过 SSE-KMS 加密的表，则您使用的角色需要拥有使用您的 AWS KMS 密钥进行加密操作的权限。有关更多信息，请参阅 [向 IAM 主体授予在集成的 AWS 分析服务中使用加密表的权限](s3-tables-kms-permissions.md#tables-kms-integration-permissions)。

集成后，将向 IAM 主体授予访问表的 Lake Formation 权限，如果您想让其它 IAM 主体访问表，则需要向这些主体授予对表的 Lake Formation 权限。有关更多信息，请参阅 [使用 Lake Formation 管理对表或数据库的访问权限](grant-permissions-tables.md)。

**后续步骤**
+ [创建命名空间](s3-tables-namespace-create.md).
+ [创建表](s3-tables-create.md).