

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用以进行精细访问控制
<a name="security-lf-enable"></a>

## 概述
<a name="security-lf-enable-overview"></a>

对于 Amazon Glue 版本 5.0 及更高版本，您可以利用 Amazon Lake Formation 对 S3 支持的 Data Catalog 表应用精细访问控制。此功能允许您为 Amazon Glue for Apache Spark 作业中的 read 查询配置表、行、列和单元格级别的访问控制。请参阅以下部分，了解有关 Lake Formation 以及如何将其与 Amazon Glue 结合使用的更多信息。

Glue 4.0 或更早版本支持的基于 `GlueContext` 的表级访问控制（具有 Amazon Lake Formation 权限）在 Glue 5.0 中不受支持。请使用 Glue 5.0 中的新 Spark 原生精细访问控制 (FGAC)。请注意以下详细信息：
+ 如果您需要细粒度访问控制 (FGAC) 来控制行/列/单元格访问控制，则需要从 Glue 4.0 和先前版本中的 `GlueContext`/Glue DynamicFrame 迁移到 Glue 5.0 中的 Spark DataFrame。有关示例，请参阅[从 GlueContext/Glue DynamicFrame 迁移到 Spark DataFrame](security-lf-migration-spark-dataframes.md)。
+  如果需要全表访问控制（FTA），则可以在 Amazon Glue 5.0 中将 FTA 与 DynamicFrames 结合使用。您还可以迁移到原生 Spark 方法，从而将各种额外的功能用于 Amazon Lake Formation 表，例如弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。有关示例，请参阅[从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0](https://docs.amazonaws.cn/glue/latest/dg/migrating-version-50.html)。
+ 如果您不需要 FGAC，则无需迁移到 Spark DataFrame，而且诸如作业书签、下推谓词之类的 `GlueContext` 功能将继续起作用。
+ 使用 FGAC 的作业至少需要以下 4 个工作线程：一个用户驱动程序、一个系统驱动程序、一个系统执行程序和一个备用用户执行程序。

将 Amazon Glue 与 Amazon Lake Formation 结合使用会产生额外费用。

## Amazon Glue 如何与 Amazon Lake Formation 协同工作
<a name="security-lf-enable-how-it-works"></a>

将 Amazon Glue 与 Lake Formation 结合使用，您可以对每个 Spark 作业强制执行一层权限，以便在 Amazon Glue 执行作业时应用 Lake Formation 权限控制。AmazonGlue 使用 [Spark 资源配置文件](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)创建两个配置文件来有效执行作业。用户配置文件执行用户提供的代码，而系统配置文件强制执行 Lake Formation 策略。有关更多信息，请参阅[什么是 Amazon Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/what-is-lake-formation.html) 以及[注意事项和限制](https://docs.amazonaws.cn/glue/latest/dg/security-lf-enable-considerations.html)。

下面是 Amazon Glue 如何访问受 Lake Formation 安全策略保护的数据的高级概览。

![\[该图显示了精细访问控制如何与 Amazon Glue StartJobrun API 配合使用。\]](http://docs.amazonaws.cn/glue/latest/dg/images/glue-50-fgac-start-job-run-api-diagram.png)


1. 用户在启用 Amazon Lake Formation 的 Amazon Glue 作业上调用 `StartJobRun` API。

1. Amazon Glue 会将作业发送到用户驱动程序，并在用户配置文件中运行作业。用户驱动程序运行精简版的 Spark，该版本无法启动任务、请求执行程序、访问 S3 或 Glue Catalog。其构建了作业计划。

1. Amazon Glue 设置了第二个驱动程序（称为系统驱动程序），并在系统配置文件中运行它（使用特权身份）。AmazonGlue 在两个驱动程序之间设置加密的 TLS 通道来进行通信。用户驱动程序使用该通道将作业计划发送到系统驱动程序。系统驱动程序不会运行用户提交的代码。而是运行完整的 Spark，并与 S3 和数据目录通信，以访问数据。并向执行程序发送请求，将作业计划编译成一系列执行阶段。

1. 然后，Amazon Glue 使用用户驱动程序或系统驱动程序在执行程序上运行这些阶段。任何阶段的用户代码都只能在用户配置文件执行程序上运行。

1. 从受 Amazon Lake Formation 保护的数据目录表中读取数据的阶段，或应用安全筛选器的阶段委托给系统执行程序。

## 最少工作线程要求
<a name="security-lf-enable-permissions"></a>

Amazon Glue 中启用 Lake Formation 的作业至少需要以下 4 个工作线程：一个用户驱动程序、一个系统驱动程序、一个系统执行程序和一个备用用户执行程序。这比标准 Amazon Glue 作业所需的最少 2 个工作线程有所增加。

Amazon Glue 中启用 Lake Formation 的作业利用两个 Spark 驱动程序：一个用于系统配置文件，另一个用于用户配置文件。同样，执行程序也分为两个配置文件：
+ 系统执行程序：处理应用 Lake Formation 数据筛选条件的任务。
+ 用户执行程序：由系统驱动程序根据需要请求。

由于 Spark 作业本质上是惰性的，因此在扣除两个驱动程序后，Amazon Glue 会为用户执行程序预留总工作线程数量的 10%（至少为 1 个）。

所有启用 Lake Formation 的作业都已启用自动扩缩，这意味着用户执行程序只有在需要时才会启动。

有关配置示例，请参阅[注意事项和限制](https://docs.amazonaws.cn/glue/latest/dg/security-lf-enable-considerations.html)。

## 作业运行时角色 IAM 权限
<a name="security-lf-enable-permissions"></a>

Lake Formation 权限控制对 Amazon Glue 数据目录资源、Amazon S3 位置以及这些位置的基础数据的访问。IAM 权限控制对 Lake Formation 和 Amazon Glue API 及资源的访问。虽然您可能拥有 Lake Formation 权限来访问数据目录（SELECT）中的表，但如果没有对 `glue:Get*` API 操作的 IAM 权限，操作就会失败。

下面是一个策略示例，展示了如何提供 IAM 权限以访问 S3 中的脚本、将日志上传到 S3、Amazon Glue API 权限以及访问 Lake Formation 的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ScriptAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts",
        "arn:aws:s3:::*.amzn-s3-demo-bucket/*"
      ]
    },
    {
      "Sid": "LoggingAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
      ]
    },
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:Get*",
        "glue:Create*",
        "glue:Update*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## 设置 Lake Formation 的作业运行时角色权限
<a name="security-lf-enable-set-up-grants-for-role"></a>

首先，在 Lake Formation 中注册 Hive 表的位置。然后在所需的表上创建作业运行时角色的权限。有关 Lake Formation 的更多详细信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[什么是 Amazon Lake Formation？](https://docs.amazonaws.cn/lake-formation/latest/dg/what-is-lake-formation.html)。

设置 Lake Formation 权限后，您可以在 Amazon Glue 上提交 Spark 作业。

## 提交作业运行
<a name="security-lf-enable-submit-job"></a>

完成设置 Lake Formation 授予后，您可以在 Amazon Glue 上提交 Spark 作业。要运行 Iceberg 作业，您必须提供下面的 Spark 配置。要通过 Glue 作业参数进行配置，请输入下面的参数：
+ 键：

  ```
  --conf
  ```
+ 值：

  ```
  spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog 
  					  --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.account-id=<ACCOUNT_ID> 
  					  --conf spark.sql.catalog.spark_catalog.client.region=<REGION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com
  ```

## 使用交互式会话
<a name="security-lf-using-interactive-session"></a>

 设置好 Amazon Lake Formation 授予后，即可在 Amazon Glue 上使用交互式会话。在执行代码之前，必须通过 `%%configure` 魔术命令提供以下 Spark 配置。

```
%%configure
{
    "--enable-lakeformation-fine-grained-access": "true",
    "--conf": "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> --conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.spark_catalog.client.region=<REGION> --conf spark.sql.catalog.spark_catalog.glue.account-id=<ACCOUNT_ID> --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com"
}
```

## 适用于 Amazon Glue 5.0 Notebook 或交互式会话的 FGAC
<a name="security-lf-fgac"></a>

要在 Amazon Glue 中启用精细访问控制（FGAC），必须在创建第一个单元格之前指定 Lake Formation 所需的 Spark 配置作为 %%configure 魔术命令的一部分。

之后使用 `SparkSession.builder().conf("").get()` 或 `SparkSession.builder().conf("").create()` 调用来指定是不够的。这与 Amazon Glue 4.0 的行为有所不同。

## 开放表格式支持
<a name="security-lf-enable-open-table-format-support"></a>

Amazon Glue 版本 5.0 或更高版本包含基于 Lake Formation 的精细访问控制支持。AmazonGlue 支持 Hive 和 Iceberg 表类型。下表列出了所有支持的操作。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/security-lf-enable.html)