

# Amazon Lake Formation 访问控制模式


Amazon Glue 5.0 及更高版本支持两种通过 Amazon Lake Formation 访问数据的模式：

**Topics**
+ [

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用实现全表访问
](security-access-control-fta.md)
+ [

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用以进行精细访问控制
](security-lf-enable.md)

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用实现全表访问


## 全表访问简介


Amazon Glue 5.0 及更高版本支持 Apache Spark 中的全表访问（FTA）控制，具体取决于您在 Amazon Lake Formation 中定义的策略。当作业角色具有全表访问权限时，您可以借助此功能从 Amazon Glue Spark 作业在注册到 Amazon Lake Formation 的表上执行读写操作。FTA 非常适合需要在表级别遵守安全法规的使用案例，并支持将各种 Spark 功能用于 Amazon Lake Formation 表，包括弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）。

当 Amazon Glue Spark 作业配置为全表访问（FTA）模式时，Amazon Lake Formation 凭证将用于为注册到 Amazon Lake Formation 的表读取/写入 Amazon S3 数据，而作业的运行时角色凭证将用于读取/写入未注册到 Amazon Lake Formation 的表。此功能支持数据操作语言（DML）操作，包括 Apache Hive 和 Iceberg 表上的 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 语句。

**注意**  
检查您的需求并确定是精细访问控制（FGAC）模式还是全表访问（FTA）适合您的需求。对于给定 Amazon Glue 作业，只能启用一种 Amazon Lake Formation 权限方法。同一个作业不能同时运行全表访问（FTA）和精细访问控制（FGAC）。

## Amazon Glue 上的全表访问（FTA）工作原理


 Amazon Lake Formation 提供了精细访问控制（FGAC）和全表访问（FTA）这两种数据访问控制方法。FGAC 可按列、行和单元格级别进行筛选，从而增强安全性，非常适合需要精细权限的场景。FTA 非常适合需要表级别权限的简单访问控制场景。由于无需启用精细访问模式，因此简化了实施；同时由于无需系统驱动程序和系统执行程序，因此提高了性能并降低了成本；此外还支持读取和写入操作（包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 命令）。

 在 Amazon Glue 4.0 中，基于 Amazon Lake Formation 的数据访问通过 GlueContext 类（Amazon Glue 提供的实用程序类）实现。在 Amazon Glue 5.0 中，基于 Amazon Lake Formation 的数据访问可通过原生 Spark SQL、Spark DataFrames 实现，并且继续支持通过 GlueContext 类访问。

## 全表访问模式的实施


### 第 1 步：在 Amazon Lake Formation 中启用全表访问


要使用全表访问（FTA）模式，您需要允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据。要启用此模式，请按照 [Application integration for full table access](https://docs.amazonaws.cn/lake-formation/latest/dg/full-table-credential-vending.html) 中的步骤操作。

### 第 2 步：设置作业运行时角色的 IAM 权限


要获得基础数据的读取或写入权限，除 Amazon Lake Formation 权限外，作业运行时角色还需要具有 `lakeformation:GetDataAccess` IAM 权限。获得此权限后，Amazon Lake Formation 将授权访问数据的临时凭证请求。

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

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ScriptAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/scripts/*"
      ]
    },
    {
      "Sid": "LoggingAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
      ]
    },
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:CreateTable",
        "glue:UpdateTable"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/default",
        "arn:aws:glue:us-east-1:111122223333:table/default/*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": "*"
    }
  ]
}
```

------

#### 第 2.1 步：配置 Amazon Lake Formation 权限


从 Amazon S3 读取数据的 Amazon Glue Spark 作业需要具有 Amazon Lake Formation SELECT 权限。

在 Amazon S3 中写入/删除数据的 Amazon Glue Spark 作业需要具有 Amazon Lake Formation ALL 权限。

与 Amazon Glue 数据目录交互的 Amazon Glue Spark 作业需要视情况具有 DESCRIBE、ALTER、DROP 权限。

### 第 3 步：使用 Amazon Lake Formation 初始化 Spark 会话以实现全表访问


要访问注册到 Amazon Lake Formation 的表，需要在 Spark 初始化期间设置以下配置，以便将 Spark 配置为使用 Amazon Lake Formation 凭证。

 要访问注册到 Amazon Lake Formation 的表，您需要将 Spark 会话显式配置为使用 Amazon Lake Formation 凭证。在初始化 Spark 会话时添加以下配置：

```
from pyspark.sql import SparkSession
        
# Initialize Spark session with Lake Formation configurations
spark = SparkSession.builder \
    .appName("Lake Formation Full Table Access") \
    .config("spark.sql.catalog.glue_catalog", "org.apache.spark.sql.catalog.hive.GlueCatalog") \
    .config("spark.sql.catalog.glue_catalog.glue.lakeformation-enabled", "true") \
    .config("spark.sql.defaultCatalog", "glue_catalog") \
    .getOrCreate()
```

 关键配置：
+  `spark.sql.catalog.glue_catalog`：注册一个名为“glue\$1catalog”的目录，该目录使用 GlueCatalog 实现 
+  `spark.sql.catalog.glue_catalog.glue.lakeformation-enabled`：为此目录显式启用 Amazon Lake Formation 集成 
+  目录名称（在此例中为“glue\$1catalog”）可以自定义，但在两个配置设置中必须一致 

#### Hive


```
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true 
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
```

#### Iceberg


```
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true 
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
--conf spark.sql.catalog.<catalog>.Amazon Glue.lakeformation-enabled=true
```
+  `spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver`：配置 EMR 文件系统（EMRFS）以将 Amazon Lake Formation S3 凭证用于注册到 Amazon Lake Formation 的表。如果表未注册，请使用作业的运行时角色凭证。
+ `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` 和 `spark.hadoop.fs.s3.folderObject.autoAction.disabled=true`：在创建 S3 文件夹时，将 EMRFS 配置为使用内容类型标头应用程序/x 目录，而不是 \$1folder\$1 后缀。这在读取 Amazon Lake Formation 表时为必需，因为 Amazon Lake Formation 凭证不允许读取带有 \$1folder\$1 后缀的表文件夹。
+  `spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true`：将 Spark 配置为在创建表之前跳过空表位置验证。这对于注册到 Amazon Lake Formation 的表是必需的，因为只有在创建 Amazon Glue Data Catalog 表之后，用于验证空位置的 Amazon Lake Formation 凭证才会可用。如果未启用此配置，则作业的运行时角色凭证将会验证空表位置。
+  `spark.sql.catalog.createDirectoryAfterTable.enabled=true`：将 Spark 配置为在 Hive 元数据存储中创建表后再创建 Amazon S3 文件夹。这对于注册到 Amazon Lake Formation 的表为必需，因为只有在创建 Amazon Glue Data Catalog 表之后，用于创建 Amazon S3 文件夹的 Amazon Lake Formation 凭证才会可用。
+  `spark.sql.catalog.dropDirectoryBeforeTable.enabled=true`：将 Spark 配置为在 Hive 元数据存储中删除表之前删除 Amazon S3 文件夹。这对于注册到 Amazon Lake Formation 的表是必需的，因为在从 Amazon Glue Data Catalog 删除表之后，用于删除 S3 文件夹的 Amazon Lake Formation 凭证将不可用。
+  `spark.sql.catalog.<catalog>.Amazon Glue.lakeformation-enabled=true`：将 Iceberg 目录配置为将 Amazon Lake Formation Amazon S3 凭证用于注册到 Amazon Lake Formation 的表。如果表未注册，则会使用默认环境凭证。

## 使用模式


### 将 FTA 与 DataFrames 结合使用


熟悉 Spark 的用户可以将 DataFrames 与 Amazon Lake Formation 全表访问模式结合使用。

Amazon Glue 5.0 增加了对 Lake Formation 全表访问模式的原生 Spark 支持，从而简化了处理受保护表的方式。借助此功能，Amazon Glue 5.0 Amazon Glue Spark 作业可在获得全表访问权限后直接读取和写入数据，从而消除了以前会限制某些提取、转换、加载（ETL）操作的限制。现在，您可以将各种高级 Spark 功能用于 Amazon Lake Formation 表，包括弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。

#### Amazon Glue 5.0 中的原生 Spark FTA


Amazon Glue 5.0 支持 Apache Spark 中的全表访问（FTA）控制模式，具体取决于您在 Amazon Lake Formation 中定义的策略。这种控制级别非常适合需要在表级别遵守安全法规的使用案例。

#### Apache Iceberg 表示例


```
from pyspark.sql import SparkSession

catalog_name = "spark_catalog"
aws_region = "us-east-1"
aws_account_id = "123456789012"
warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/"

spark = SparkSession.builder \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkSessionCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") \
    .config(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.account-id",f"{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") \
    .config(f"spark.sql.catalog.dropDirectoryBeforeTable.enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config("spark.sql.defaultCatalog", catalog_name) \  # Add this line
    .getOrCreate()

database_name = "your_database"
table_name = "your_table"

df = spark.sql(f"select * from {database_name}.{table_name}")
df.show()
```

#### 必需的 IAM 权限


您的 Amazon Glue 作业执行角色必须具有以下权限：

```
{
    "Action": "lakeformation:GetDataAccess",
    "Resource": "*",
    "Effect": "Allow"
}
```

以及您的数据位置相应的 S3 访问权限。

#### Lake Formation 配置


使用 Amazon Glue 5.0 中的原生 Spark FTA 之前：

1. 允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据

1. 通过 Amazon Lake Formation 控制台向 Amazon Glue 作业执行角色授予相应的表权限

1. 使用上例中所示的必需参数配置 Spark 会话

### 将 FTA 与 DynamicFrames 结合使用


 Amazon Glue 的原生 DynamicFrames 可以与 Amazon Lake Formation 全表访问结合使用，从而优化 ETL 操作。全表访问（FTA）是一种在表级别授予权限的安全模式，由于没有行级和列级权限检查的开销，因此数据处理速度比精细访问控制（FGAC）模式更快。需要处理完整的表并且表级权限能够满足安全要求时，这种方法将非常实用。

 在 Amazon Glue 4.0 中将 DynamicFrames 与 FTA 结合使用时，将需要特定的 GlueContext 配置。虽然现有用于 FTA 的 Amazon Glue 4.0 DynamicFrame 代码在 Amazon Glue 5.0 中继续有效，不过新版本还提供了更灵活的原生 Spark FTA 支持。对于新的开发，建议考虑使用 DataFrames 部分中描述的原生 Spark 方法，尤其是在需要将额外的功能用于 Amazon Lake Formation 表时，例如弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。

#### 所需权限


执行 Glue 作业的 IAM 角色必须具有下列权限：
+ `lakeformation:GetDataAccess` 许可
+ 通过 Lake Formation 控制台授予相应的 Lake Formation 表权限

#### Amazon Glue 5.0 中的 DynamicFrame 实现示例


```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

# Initialize Glue context
sc = SparkContext()
glueContext = GlueContext(sc)

# Configure catalog for Iceberg tables
catalog_name = "glue_catalog"
aws_region = "us-east-1"
aws_account_id = "123456789012"
warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/"

spark = glueContext.spark_session
spark.conf.set(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.id", f"{aws_account_id}")

# Read Lake Formation-protected table with DynamicFrame
df = glueContext.create_data_frame.from_catalog(
    database="your_database",
    table_name="your_table"
)
```

## 其他配置


### 在 Amazon Glue Studio 笔记本中配置全表访问模式


要在 Amazon Glue Studio 笔记本中通过交互式 Spark 会话访问注册到 Amazon Lake Formation 的表，必须使用兼容性权限模式。在启动交互式会话之前，使用 `%%configure` magic 命令设置 Spark 配置。此配置必须是笔记本中的第一个命令，因为该命令无法在会话启动后应用。根据表类型选择配置：

#### 对于 Hive 表


```
%%configure
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
```

#### 对于 Iceberg 表


```
%%configure
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true
--conf spark.sql.catalog.glue_catalog.warehouse=s3://example-s3-bucket_DATA_LOCATION
--conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog
--conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.glue_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.glue_catalog.glue.region=REGION
```

替换占位符：
+  S3\$1DATA\$1LOCATION：*s3://amzn-s3-demo-bucket* 
+  REGION：*Amazon 区域（例如 us-east-1）* 
+  ACCOUNT\$1ID：*您的 Amazon 账户 ID* 

**注意**  
必须在笔记本中执行任何 Spark 操作之前设置这些配置。

### 支持的操作


这些操作将使用 Amazon Lake Formation 凭证来访问表数据。

**注意**  
 启用 Amazon Lake Formation 时：  
 对于 FTA：启用 Spark 配置 `spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled` 
+ CREATE TABLE
+ ALTER TABLE
+ INSERT INTO
+  INSERT OVERWRITE 
+ SELECT
+ UPDATE
+ MERGE INTO
+ DELETE FROM
+ ANALYZE TABLE
+ REPAIR TABLE
+ DROP TABLE
+ Spark Datasource 查询
+ Spark Datasource 写入

**注意**  
上面未列出的操作将继续使用 IAM 权限来访问表数据。

## 从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0 FTA


从 Amazon Glue 4.0 GlueContext FTA 迁移到 Amazon Glue 5.0 原生 Spark FTA 时：

1. 允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据。按照[第 1 步：在 Amazon Lake Formation 中启用全表访问](#security-access-control-fta-step-1)中的说明操作。

1. 不需要更改作业运行时角色。但需要验证 Amazon Glue 作业执行角色是否具有 lakeformation:GetDataAccess IAM 权限。

1. 修改脚本中的 Spark 会话配置。确保存在以下 Spark 配置：

   ```
   --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog
   --conf spark.sql.catalog.spark_catalog.warehouse=s3://<bucket-name>/warehouse/
   --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.lakeformation-enabled=true
   --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
   ```

1. 更新脚本，确保将 GlueContext DataFrames 更改为原生 Spark DataFrames。

1. 将 Amazon Glue 作业更新为使用 Amazon Glue 5.0

## 注意事项和限制

+ 如果使用未启用全表访问的作业创建 Hive 表，并且未插入任何记录，则后续从启用全表访问的作业进行的读取或写入操作都将失败。这是因为未启用全表访问的 Amazon Glue Spark 会将 \$1folder\$1 后缀添加到表文件夹名称。要解决此问题，您可以使用以下任一方法：
  +  从未启用 FTA 的作业在表中至少插入一行。
  +  配置未启用 FTA 的作业，从而确保不在 S3 文件夹名称中使用 \$1folder\$1 后缀。可以通过设置 Spark 配置 `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` 来实现此目的。
  +  使用 Amazon S3 控制台或 Amazon S3 CLI 在表位置 `s3://path/to/table/table_name` 创建一个 Amazon S3 文件夹。
+ 全表访问模式仅适用于 EMR 文件系统（EMRFS），不兼容 S3A 文件系统。
+  全表访问模式支持 Hive 和 Iceberg 表。尚未增加对 Hudi 和 Delta 表的支持。
+ 使用 Amazon Lake Formation 精细访问控制（FGAC）规则或 Amazon Glue Data Catalog 视图引用表的作业将会失败。要使用 FGAC 规则或 Amazon Glue Data Catalog 视图查询表，需要使用 FGAC 模式。您可以按照以下 Amazon 文档中介绍的步骤启用 FGAC 模式：将 Amazon Glue 与 Amazon Lake Formation 结合使用实现精细访问控制。
+  全表访问模式不支持 Spark Streaming。
+ 不能与 FGAC 同时使用。

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用以进行精细访问控制
适用于 FGAC 的 Lake Formation

## 概述


对于 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 协同工作
工作原理

将 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 保护的数据目录表中读取数据的阶段，或应用安全筛选器的阶段委托给系统执行程序。

## 最少工作线程要求
最少工作线程

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 权限
启用运行时权限

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 的作业运行时角色权限
设置运行时权限

首先，在 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 作业。

## 提交作业运行


完成设置 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
  ```

## 使用交互式会话


 设置好 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


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

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

## 开放表格式支持
支持的操作

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)

# 从 GlueContext/Glue DynamicFrame 迁移到 Spark DataFrame


以下是 Python 和 Scala 示例，它们将 Glue 4.0 中的 `GlueContext`/Glue `DynamicFrame` 迁移到 Glue 5.0 中的 Spark `DataFrame`。

**Python**  
之前：

```
escaped_table_name= '`<dbname>`.`<table_name>`'

additional_options = {
  "query": f'select * from {escaped_table_name} WHERE column1 = 1 AND column7 = 7'
}

# DynamicFrame example
dataset = glueContext.create_data_frame_from_catalog(
    database="<dbname>",
    table_name=escaped_table_name, 
    additional_options=additional_options)
```

之后：

```
table_identifier= '`<catalogname>`.`<dbname>`.`<table_name>`"' #catalogname is optional

# DataFrame example
dataset = spark.sql(f'select * from {table_identifier} WHERE column1 = 1 AND column7 = 7')
```

**Scala**  
之前：

```
val escapedTableName = "`<dbname>`.`<table_name>`"

val additionalOptions = JsonOptions(Map(
    "query" -> s"select * from $escapedTableName WHERE column1 = 1 AND column7 = 7"
    )
)

# DynamicFrame example
val datasource0 = glueContext.getCatalogSource(
    database="<dbname>", 
    tableName=escapedTableName, 
    additionalOptions=additionalOptions).getDataFrame()
```

之后：

```
val tableIdentifier = "`<catalogname>`.`<dbname>`.`<table_name>`" //catalogname is optional

# DataFrame example
val datasource0 = spark.sql(s"select * from $tableIdentifier WHERE column1 = 1 AND column7 = 7")
```

# 注意事项和限制
注意事项

将 Lake Formation 与 Amazon Glue 结合使用时，请考虑以下注意事项和限制。

具有 Lake Formation 的 Amazon Glue 可在除 Amazon GovCloud（美国东部）和 Amazon GovCloud（美国西部）之外的所有受支持区域使用。
+ Amazon Glue 仅支持通过 Lake Formation 对 Apache Hive 和 Apache Iceberg 表进行精细访问控制。Apache Hive 格式包括 Parquet、ORC 和 CSV。
+ 您只能将 Lake Formation 与 Spark 作业结合使用。
+ 具有 Lake Formation 的 Amazon Glue 在整个作业中仅支持单个 Spark 会话。
+ 启用 Lake Formation 后，Amazon Glue 需要更多的工作线程，因为它需要一个系统驱动程序、一个系统执行程序、一个用户驱动程序以及可选的用户执行程序（当您的作业有 UDF 或 `spark.createDataFrame` 时需要此选项）。
+ 具有 Lake Formation 的 Amazon Glue 仅支持通过资源链接共享的跨账户表查询。资源链接的名称必须与源账户资源的名称相同。
+ 要为 Amazon Glue 作业启用精细访问控制，请传递 `--enable-lakeformation-fine-grained-access` 作业参数。
+ 您可以将 Amazon Glue 作业配置为使用 Amazon Glue 多目录层次结构。有关与 Amazon Glue `StartJobRun` API 一起使用的配置参数的信息，请参阅 [Working with Amazon Glue multi-catalog hierarchy on EMR Serverless](https://docs.amazonaws.cn/emr/latest/EMR-Serverless-UserGuide/external-metastore-glue-multi.html)。
+ 不支持以下项：
  + 弹性分布式数据集（RDD）
  + Spark 流
  + 使用 Lake Formation 授予的权限写入
  + 嵌套列的访问控制
+ Amazon Glue 会阻止可能破坏系统驱动程序完全隔离的功能，包括：
  + UDT、HiveUDFS 以及任何涉及自定义类的用户定义函数
  + 自定义数据来源
  + 为 Spark 扩展、连接器或元存储提供额外的 jar
  + `ANALYZE TABLE` 命令
+ 为了强制执行访问控制，`EXPLAIN PLAN` 和 DDL 操作（如 `DESCRIBE TABLE`）不会公开受限信息。
+ Amazon Glue 会限制访问启用 Lake Formation 的应用程序上的系统驱动程序 Spark 日志。由于系统驱动程序的运行权限更大，因此系统驱动程序生成的事件和日志可能包含敏感信息。为防止未经授权的用户或代码访问此敏感数据，Amazon Glue 禁止访问系统驱动程序日志。要进行故障排除，请联系 Amazon 支持。
+ 如果您在 Lake Formation 中注册了表位置，则无论 Amazon Glue 作业运行时角色的 IAM 权限如何，数据访问路径都会经过 Lake Formation 存储的凭证。如果错误配置了在表位置注册的角色，那么使用具有 S3 IAM 权限的角色提交到表位置的作业就会失败。
+ 写入 Lake Formation 表使用的是 IAM 权限，而不是 Lake Formation 授予的权限。如果作业运行时角色拥有必要的 S3 权限，就可以使用该权限来运行写操作。

以下是使用 Apache Iceberg 时的注意事项和限制：
+ 您只能在会话目录中使用 Apache Iceberg，而不能使用任意命名的目录。
+ 在 Lake Formation 中注册的 Iceberg 表仅支持元数据表 `history`、`metadata_log_entries`、`snapshots`、`files`、`manifests` 和 `refs`。AmazonGlue 会隐藏可能包含敏感数据的列，例如 `partitions`、`path` 和 `summaries`。此限制不适用于未在 Lake Formation 中注册的 Iceberg 表。
+ 未在 Lake Formation 中注册的表支持所有 Iceberg 存储过程。任何表都不支持 `register_table` 和 `migrate` 程序。
+ 我们建议使用 Iceberg DataFrameWriterV2，而不是 V1。

## 工作线程分配示例


对于配置了以下参数的作业：

```
--enable-lakeformation-fine-grained-access=true  
--number-of-workers=20
```

工作线程分配将是：
+ 一个工作线程用于用户驱动程序。
+ 一个工作线程用于系统驱动程序。
+ 其余 18 个工作线程的 10％（即 2 个工作线程）预留给用户执行程序。
+ 为系统执行程序分配多达 16 个工作线程。

启用自动扩缩后，用户执行程序可以在需要时利用系统执行程序中任何未分配的容量。

## 控制用户执行程序分配


您可以使用以下配置调整用户执行程序的预留百分比：

```
--conf spark.dynamicAllocation.maxExecutorsRatio=<value between 0 and 1>
```

此配置允许对相对于总可用容量预留的用户执行程序数量进行微调控制。

# 问题排查


有关故障排除解决方案，请参阅以下部分：

## 日志记录


Amazon Glue 使用 Spark 资源配置文件来拆分作业执行。AmazonGlue 使用用户配置文件来运行您提供的代码，而系统配置文件则强制执行 Lake Formation 策略。您可以访问作为用户配置文件运行的任务的日志。

## Live UI 和 Spark History Server


Live UI 和 Spark History Server 包含从用户配置文件生成的所有 Spark 事件以及从系统驱动程序生成的编辑事件。

您可以在**执行程序**选项卡中查看用户和系统驱动程序中的所有任务。但日志链接仅适用于用户配置文件。此外，还会从 Live UI 中编辑一些信息，例如输出记录数。

## 由于 Lake Formation 权限不足，作业失败


确保您的作业运行时角色有权在您要访问的表上运行 SELECT 和 DESCRIBE。

## RDD 作业执行失败


Amazon Glue 目前不支持在启用了 Lake Formation 的作业上进行弹性分布式数据集 (RDD) 操作。

## 无法访问 Amazon S3 中的数据文件


确保您已在 Lake Formation 中注册数据湖的位置。

## 安全验证异常


Amazon Glue 检测到安全验证错误。请联系 Amazon 支持寻求帮助。

## 跨账户共享 Amazon Glue Data Catalog 和表


您可以跨账户共享数据库和表，且仍可使用 Lake Formation。有关更多信息，请参阅 [Cross-account data sharing in Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/cross-account-permissions.html) 和 [How do I share Amazon Glue Data Catalog and tables cross-account using ?](https://repost.aws/knowledge-center/glue-lake-formation-cross-account)。

下表概括了如何为工作负载选择精细访问控制（FGAC）模式和全表访问（FTA）模式。


| 功能 | 精细访问控制 (FGAC) | 全表访问（FTA） | 
| --- |--- |--- |
| Access Level | Column/row level | Full table | 
| Use Case | Queries and ETL with limited permissions | ETL | 
| Performance Impact | Requires system/user space transitions for access control evaluation, adding latency | Optimized performance | 