

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 AWS 使用 Glue AWS Lake Formation 進行精細存取控制
<a name="security-lf-enable"></a>

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

使用 AWS Glue 5.0 版和更新版本，您可以利用 AWS Lake Formation 在 S3 支援的 Data Catalog 資料表上套用精細存取控制。此功能可讓您設定 AWS Glue for Apache Spark 任務中 read 查詢的資料表、資料列、資料欄和儲存格層級存取控制。請參閱下列各節，進一步了解 Lake Formation 以及如何搭配 Glue AWS 使用。

`GlueContext`Glue 5.0 不支援具有 Glue 4.0 或 以前支援 AWS Lake Formation 許可的 型資料表層級存取控制。在 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)，您可以利用 FTA AWS 搭配 Glue 5.0 中的 DynamicFrames。您也可以遷移至原生 Spark 方法，以取得其他功能，例如彈性分散式資料集 (RDDs)、自訂程式庫，以及具有 AWS Lake Formation 資料表的使用者定義函數 (UDFs)。如需範例，請參閱[從 AWS Glue 4.0 遷移至 AWS Glue 5.0。](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html)
+ 如果不需要 FGAC，則不需要移轉 Spark dataframe，而且諸如任務書籤和下推述詞等 `GlueContext` 功能將繼續運作。
+ 使用 FGAC 的任務需要至少 4 個工作者：一個使用者驅動程式、一個系統驅動程式、一個系統執行器和一個待命使用者執行器。

將 AWS Glue 與 搭配使用 AWS Lake Formation 會產生額外費用。

## Glue AWS 如何使用 AWS Lake Formation
<a name="security-lf-enable-how-it-works"></a>

使用 AWS Glue 搭配 Lake Formation 可讓您對每個 Spark 任務強制執行一層許可，以在 Glue 執行任務時套用 Lake Formation AWS 許可控制。 AWS Glue 使用 [ Spark 資源描述](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)檔來建立兩個描述檔，以有效地執行任務。使用者設定檔會執行使用者提供的程式碼，而系統設定檔則會強制執行 Lake Formation 政策。如需詳細資訊，請參閱 [AWS Lake Formation是什麼](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)以及[考量和限制](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable-considerations.html)。

以下是 Glue AWS 如何存取 Lake Formation 安全政策所保護資料的高階概觀。

![\[圖表顯示精細存取控制如何與 Glue StartJobRun API AWS 搭配使用。\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/glue-50-fgac-start-job-run-api-diagram.png)


1. 使用者在已啟用 AWS Lake Formation 的 Glue AWS 任務上呼叫 `StartJobRun` API。

1. AWS Glue 會將任務傳送給使用者驅動程式，並在使用者設定檔中執行任務。使用者驅動程式會執行 Spark 的精簡版本，該版本無法啟動任務、請求執行器、存取 S3 或 Glue Catalog。其會建置任務計畫。

1. AWS Glue 會設定第二個稱為系統驅動程式的驅動程式，並在系統設定檔中執行它 （具有特殊權限身分）。 AWS Glue 會在兩個驅動程式之間設定加密的 TLS 頻道以進行通訊。使用者驅動程式使用該頻道將任務計劃傳送至系統驅動程式。系統驅動程式不會執行使用者提交的程式碼。其會執行完整的 Spark，並與 S3 和 Data Catalog 通訊以進行資料存取。其會請求執行器，並將任務計畫編譯成一系列的執行階段。

1. AWS 然後，Glue 會使用使用者驅動程式或系統驅動程式在執行器上執行階段。任何階段的使用者程式碼只會在使用者設定檔執行器上執行。

1. 從受 保護的資料目錄資料表 AWS Lake Formation 或套用安全篩選條件的資料表讀取資料的階段，會委派給系統執行器。

## 最低工作者要求
<a name="security-lf-enable-permissions"></a>

Glue AWS 中已啟用 Lake Formation 的任務至少需要 4 個工作者：一個使用者驅動程式、一個系統驅動程式、一個系統執行器和一個待命使用者執行器。這高於標準 Glue 任務所需的最少 AWS 2 個工作者。

Glue 中已啟用 Lake Formation AWS 的任務會使用兩個 Spark 驅動程式，一個用於系統設定檔，另一個用於使用者設定檔。同樣，執行器也分為兩個設定檔：
+ 系統執行器：處理套用 Lake Formation 資料篩選條件的任務。
+ 使用者執行器：由系統驅動程式視需要請求。

由於 Spark 任務本質上是延遲的，因此在扣除兩個驅動程式後， AWS Glue 會為使用者執行器保留 10% 的工作者總數 （最少 1 個）。

所有啟用 Lake Formation 的任務都已啟用自動擴展，這表示使用者執行器只會在需要時啟動。

如需範例組態，請參閱[考量和限制](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable-considerations.html)。

## 任務執行時期角色 IAM 許可
<a name="security-lf-enable-permissions"></a>

Lake Formation 許可控制對 AWS Glue Data Catalog 資源、Amazon S3 位置和這些位置基礎資料的存取。IAM 許可可控制對 Lake Formation 和 AWS Glue API 和資源的存取。雖然您可能具有 Lake Formation 許可來存取 Data Catalog (SELECT) 中的資料表，但是如果您沒有 `glue:Get*` API 操作的 IAM 許可，您的操作會失敗。

以下範例政策說明如何提供 IAM 許可來存取 S3 中的指令碼 (將日誌上傳至 S3)、 AWS 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 的詳細資訊，請參閱《 *AWS Lake Formation 開發人員指南*》中的[什麼是 AWS Lake Formation？](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)。

設定 Lake Formation 許可後，可以在 AWS Glue 上提交 Spark 任務。

## 提交任務執行
<a name="security-lf-enable-submit-job"></a>

完成 Lake Formation 授予的設定後，您可以在 Glue 上提交 Spark AWS 任務。若要執行 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>

 完成 AWS Lake Formation 授予的設定後，您可以在 Glue AWS 上使用互動式工作階段。必須先透過 `%%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"
}
```

## FGAC for AWS Glue 5.0 筆記本或互動式工作階段
<a name="security-lf-fgac"></a>

若要在 Glue AWS 中啟用精細存取控制 (FGAC)，您必須在建立第一個儲存格之前，將 Lake Formation 所需的 Spark confs 指定為 %%configure 魔術的一部分。

稍後使用 `SparkSession.builder().conf("").get()` 或 `SparkSession.builder().conf("").create()` 呼叫來指定其將不起作用。這是 Glue 4.0 AWS 行為的變更。

## 支援開放式資料表格式
<a name="security-lf-enable-open-table-format-support"></a>

AWS Glue 5.0 版或更新版本包括支援以 Lake Formation 為基礎的精細存取控制。 AWS Glue 支援 Hive 和 Iceberg 資料表類型。下表說明所有支援的操作。

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

# 從 GlueContext/Glue DynamicFrame 移轉至 Spark DataFrame
<a name="security-lf-migration-spark-dataframes"></a>

以下是將 Glue 4.0 中的 `GlueContext`/Glue `DynamicFrame` 移轉至 Glue 5.0 中的 Spark `DataFrame` 的 Python 和 Scala 範例。

**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")
```

# 考量和限制
<a name="security-lf-enable-considerations"></a>

當您搭配 AWS Glue 使用 Lake Formation 時，請考慮下列考量和限制。

AWS Glue with Lake Formation 可在 AWS GovCloud （美國東部） 和 AWS GovCloud （美國西部） 以外的所有支援區域中使用。
+ AWS Glue 僅支援透過 Lake Formation 對 Apache Hive 和 Apache Iceberg 資料表進行精細存取控制。Apache Hive 格式包括 Parquet、ORC 和 CSV。
+ 只能將 Lake Formation 與 Spark 任務搭配使用。
+ AWS Glue with Lake Formation 僅支援整個任務的單一 Spark 工作階段。
+ 啟用 Lake Formation 時，AWS Glue 需要更多工作者，因為它需要一個系統驅動程式、系統執行器、一個使用者驅動程式，以及選擇性的使用者執行器 （當您的任務具有 UDFs 或 時需要`spark.createDataFrame`)。
+ AWS Glue with Lake Formation 僅支援透過資源連結共用的跨帳戶資料表查詢。資源連結的名稱必須與來源帳戶的資源相同。
+ 若要啟用 Glue AWS 任務的精細存取控制，請傳遞`--enable-lakeformation-fine-grained-access`任務參數。
+ 您可以設定 AWS Glue 任務以使用 AWS Glue 多目錄階層。如需搭配 Glue `StartJobRun` API AWS 使用的組態參數資訊，請參閱[在 EMR Serverless 上使用 AWS Glue 多目錄階層](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/external-metastore-glue-multi.html)。
+ 不支援下列內容：
  + 彈性分散式資料集 (RDD)
  + Spark 串流
  + 使用 Lake Formation 授權的許可進行寫入
  + 巢狀資料欄的存取控制
+ AWS Glue 會封鎖可能會破壞系統驅動程式完全隔離的功能，包括下列項目：
  + UDT、HiveUDF 以及任何涉及自訂類別的使用者定義的函數
  + 自訂資料來源
  + 為 Spark 延伸模組、連接器或中繼存放區提供額外的 jar
  + `ANALYZE TABLE` 命令
+ 為了強制執行存取控制，諸如 `DESCRIBE TABLE` 等 `EXPLAIN PLAN` 和 DDL 操作不會公開限制資訊。
+ AWS Glue 會限制對已啟用 Lake Formation 之應用程式上的系統驅動程式 Spark 日誌的存取。由於系統驅動程式執行時具有更多存取權，因此系統驅動程式產生的事件和日誌可能包含敏感資訊。為了防止未經授權的使用者或程式碼存取此敏感資料， AWS Glue 已停用對系統驅動程式日誌的存取。如需故障診斷，請聯絡 AWS 支援。
+ 如果已向 Lake Formation 註冊資料表位置，無論 AWS Glue 任務執行時期角色的 IAM 許可為何，資料存取路徑都會經過 Lake Formation 儲存的憑證。如果您錯誤設定向資料表位置註冊的角色，則使用對該資料表具有 S3 IAM 許可的角色提交的任務將會失敗。
+ 寫入 Lake Formation 資料表會使用 IAM 許可，而非 Lake Formation 授予的許可。如果您的任務執行時期角色具有必要的 S3 許可，則可以使用其來執行寫入操作。

以下是使用 Apache Iceberg 時的考量與限制：
+ 只能將 Apache Iceberg 與工作階段目錄搭配使用，不能與任意命名目錄搭配使用。
+ 在 Lake Formation 中註冊的 Iceberg 資料表僅支援中繼資料表 `history`、`metadata_log_entries`、`manifests`、、 `snapshots` `files`和 `refs`。 AWS Glue 會隱藏可能具有敏感資料的資料欄，例如 `partitions`、 `path`和 `summaries`。此限制不適用於未在 Lake Formation 中註冊的 Iceberg 資料表。
+ 未在 Lake Formation 中註冊的資料表支援所有 Iceberg 儲存的程序。所有資料表都不支援 `register_table` 和 `migrate` 程序。
+ 建議您使用 Iceberg DataFrameWriterV2 而非 V1。

## 工作者分配範例
<a name="security-lf-considerations-worker-allocation"></a>

對於使用下列參數設定的任務：

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

工作者分配如下：
+ 使用者驅動程式有一個工作者。
+ 系統驅動程式有一個工作者。
+ 為使用者執行器保留的其餘 18 個工作者的 10% (即 2 個工作者)。
+ 最多為系統執行器分配 16 個工作者。

啟用自動擴展後，使用者執行器可以視需要利用系統執行器中任何未分配的容量。

## 控制使用者執行器分配
<a name="security-lf-considerations-user-exec-allocation"></a>

可以使用下列組態來調整使用者執行器的保留百分比：

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

此組態允許針對相對於總可用容量而言預留的使用者執行器數量進行微調控制。

# 疑難排解
<a name="security-lf-troubleshooting"></a>

如需疑難排解方案，請參閱下列各節。

## 日誌
<a name="security-lf-troubleshooting-logging"></a>

AWS Glue 使用 Spark 資源描述檔來分割任務執行。 AWS Glue 使用使用者描述檔來執行您提供的程式碼，而系統描述檔會強制執行 Lake Formation 政策。您可以存取作為使用者設定檔執行之任務的日誌。

## Live UI 和 Spark History Server
<a name="security-lf-troubleshooting-live-ui"></a>

Live UI 和 Spark History Server 具有從使用者設定檔產生的所有 Spark 事件，以及從系統驅動程式產生的修訂事件。

您可以在**執行器**索引標籤中查看來自使用者驅動程式和系統驅動程式的所有任務。不過，日誌連結僅適用於使用者設定檔。此外，會從 Live UI 中修訂某些資訊，例如輸出記錄的數目。

## 任務失敗，Lake Formation 許可不足
<a name="security-lf-troubleshooting-insufficient-lf-permissions"></a>

請確保您的任務執行時期角色具有在您存取的資料表上執行 SELECT 和 DESCRIBE 的許可。

## 具有 RDD 執行的任務失敗
<a name="security-lf-troubleshooting-rdd-execution"></a>

AWS Glue 目前不支援已啟用 Lake Formation 任務的彈性分散式資料集 (RDD) 操作。

## 無法在 Amazon S3 中存取資料檔案
<a name="security-lf-troubleshooting-s3-access-failure"></a>

請確保已在 Lake Formation 中註冊資料湖的位置。

## 安全驗證例外狀況
<a name="security-lf-troubleshooting-security-validation"></a>

AWS Glue 偵測到安全驗證錯誤。如需協助，請聯絡 AWS 支援。

## 跨帳戶共用 AWS Glue Data Catalog 和資料表
<a name="security-lf-troubleshooting-cross-account"></a>

可以跨帳戶共用資料庫和資料表，但仍使用 Lake Formation。如需詳細資訊，請參閱 [Lake Formation 中的跨帳戶資料共用](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)和[如何使用 跨帳戶共用 AWS Glue Data Catalog 和資料表？](https://repost.aws/knowledge-center/glue-lake-formation-cross-account)。