

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 用于应用程序集成 API 操作的 Lake Formation 工作流


以下是用于应用程序集成 API 操作的工作流：

1. 某用户使用集成的第三方查询引擎提交数据查询或请求。查询引擎担任一个代表该用户或一组用户的 IAM 角色，并检索可信凭证，以便在调用应用程序集成 API 操作时使用。

1.  查询引擎会调用 `GetUnfilteredTableMetadata`，如果它是分区表，则查询引擎会调用 `GetUnfilteredPartitionsMetadata` 以从数据目录中检索元数据和策略信息。

1.  Lake Formation 为请求执行授权。如果用户对该表没有适当的权限，则会*AccessDeniedException*被抛出。

1. 作为请求的一部分，查询引擎会发送它支持的筛选。可以在数组中发送以下两个标志：*COLUMN\$1PERMISSIONS* 和 *CELL\$1FILTER\$1PERMISSION*。如果查询引擎不支持这些功能中的任何一个，并且表上存在该功能的策略，则会抛出，查询失败。*PermissionTypeMismatchException*这是为了避免数据泄露。

1. 返回的响应包含以下内容：
   + 表的整个架构，以便查询引擎可以使用它来解析存储中的数据。
   + 用户有权访问的授权列的列表。如果授权列的列表为空，则表示用户拥有 `DESCRIBE` 权限，但没有 `SELECT` 权限，查询将失败。
   + 一个标志 `IsRegisteredWithLakeFormation`，用于指示 Lake Formation 是否可以针对此资源数据售卖凭证。如果返回 false，则应使用客户的凭证来访问 Amazon S3。
   +  应该应用于各行数据的 `CellFilters` 的列表。此列表包含列和用于评估每一行的表达式。只有在将 *CCELL\$1FILTER\$1PERMISSION* 作为请求的一部分发送，并且有适用于调用用户的表数据筛选条件时，才会填充此字段。

1. 检索到元数据后，查询引擎会调用`GetTemporaryGlueTableCredentials`或`GetTemporaryGluePartitionCredentials`获取 Amazon 证书，以便从 Amazon S3 位置检索数据。

1. 查询引擎从 Amazon S3 读取相关对象，根据在第 2 步中收到的策略筛选数据，并将结果返回给用户。

Lake Formation 的应用程序集成 API 操作包含用于配置与第三方查询引擎的集成的其他内容。您可以在[凭证售卖 API 操作](aws-lake-formation-api-credential-vending.md)一节查看操作详细信息。

 查询引擎可以另外发送到这种结构，Lake Formation用于这些应用程序集成 API 操作。`QuerySessionContext`它Lake Formation允许存储和利用给定查询的其他上下文。以下是[QuerySessionContext](https://docs.amazonaws.cn/glue/latest/webapi/API_QuerySessionContext.html)应如何使用的示例：

1. 查询引擎进行`GetInternalUnfilteredMetadata`调用，在请求中传入包含唯一查询 ID 的 QSC 结构：

   ```
   {
       "QuerySessionContext": {
           "QueryId": "your-unique-identifier-here"
       }
   }
   ```

1. 该`GetInternalUnfilteredMetadata`调用将在响应中返回一个`QueryAuthorizationId`字符串。在下一次（以及任何后续的）查询调用中接受输入中的 QSC 结构时，查询引擎会传递相同的 QSC 结构，该结构现在也包含`QueryAuthorizationId`返回的。Lake Formation假设下一个调用是`GetTemporaryGlueTableCredentials`；请求将包含：

   ```
   {
       "QuerySessionContext": {
           "QueryAuthorizationId": "lf-returned-query-authz-id-here",
           "QueryId": "your-unique-identifier-here"
       },
   }
   ```