

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

# AWS Lake Formation 存取控制模型
<a name="lake-formation-access-control-models"></a>

AWS Glue 5.0 及更高版本支援兩種透過 存取資料的模型 AWS Lake Formation：

**Topics**
+ [使用 AWS Glue 搭配 AWS Lake Formation 進行完整資料表存取](security-access-control-fta.md)
+ [搭配 AWS 使用 Glue AWS Lake Formation 進行精細存取控制](security-lf-enable.md)

# 使用 AWS Glue 搭配 AWS Lake Formation 進行完整資料表存取
<a name="security-access-control-fta"></a>

## 完整資料表存取簡介
<a name="security-access-control-fta-intro"></a>

AWS Glue 5.0 及更新版本支援 Apache Spark 中的完整資料表存取 (FTA) 控制，視您在 中定義的政策而定 AWS Lake Formation。當任務角色具有完整的資料表存取權時，此功能可在 AWS Lake Formation 已註冊的資料表上啟用 AWS Glue Spark 任務的讀取和寫入操作。FTA 非常適合需要符合資料表層級安全法規的使用案例，並支援 Spark 功能，包括彈性分散式資料集 (RDDs)、自訂程式庫和具有 AWS Lake Formation 資料表的使用者定義函數 (UDFs)。

當 AWS Glue Spark 任務設定為完整資料表存取 (FTA) 時， AWS Lake Formation 憑證用於讀取/寫入 AWS Lake Formation 已註冊資料表的 Amazon S3 資料，而任務的執行期角色登入資料將用於讀取/寫入未註冊的資料表 AWS Lake Formation。此功能可在 Apache Hive 和 Iceberg 資料表上啟用資料處理語言 (DML) 操作，包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 陳述式。

**注意**  
檢閱您的需求，並判斷精細存取控制 (FGAC) 或完整資料表存取 (FTA) 是否符合需求。只能為指定的 AWS Glue 任務啟用一種 AWS Lake Formation 許可方法。任務無法同時執行完整資料表存取 (FTA) 和精細存取控制 (FGAC)。

## 完整資料表存取 (FTA) 如何在 上運作 AWS Glue
<a name="security-access-control-fta-how-it-works"></a>

 AWS Lake Formation 提供兩種資料存取控制方法：精細存取控制 (FGAC) 和完整資料表存取 (FTA)。FGAC 透過資料欄、資料列和儲存格層級篩選來提供增強的安全性，非常適合需要精細許可的案例。FTA 非常適合需要資料表層級許可的直接存取控制案例。其透過消除啟用精細存取模式的需要來簡化實作，透過避免系統驅動程式和系統執行器來改善效能並降低成本，並支援讀取和寫入操作 (包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 命令)。

 在 AWS Glue 4.0 中， AWS Lake Formation 基礎資料存取是透過 GlueContext 類別運作，即 提供的公用程式類別 AWS Glue。在 AWS Glue 5.0 中，透過原生 Spark SQL、Spark DataFrames 提供 AWS Lake Formation 以資料為基礎的存取，並繼續透過 GlueContext 類別支援。

## 實作完整資料表存取
<a name="security-access-control-fta-implementation"></a>

### 步驟 1：在 中啟用完整資料表存取 AWS Lake Formation
<a name="security-access-control-fta-step-1"></a>

若要使用完整資料表存取 (FTA) 模式，您需要允許第三方查詢引擎來存取資料，而無需在 AWS Lake Formation中驗證 IAM 工作階段標籤。若要啟用，請遵循[整合應用程式進行完整資料表存取](https://docs.aws.amazon.com/lake-formation/latest/dg/full-table-credential-vending.html)中的步驟。

### 步驟 2：設定任務執行時期角色的 IAM 許可
<a name="security-access-control-fta-step-2"></a>

對於基礎資料的讀取或寫入存取權，除了 AWS Lake Formation 許可之外，任務執行期角色還需要 IAM `lakeformation:GetDataAccess` 許可。使用此許可， 會 AWS Lake Formation 授予暫時登入資料存取資料的請求。

以下是如何提供 IAM 許可來存取 Amazon S3 中的指令碼、將日誌上傳到 Amazon S3、 AWS Glue API 許可與存取 AWS 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 設定 AWS Lake Formation 許可
<a name="security-access-control-fta-step-2-1"></a>

AWS Glue 從 Amazon S3 讀取資料的 Spark 任務需要 AWS Lake Formation SELECT 許可。

AWS Glue 在 Amazon S3 中寫入/刪除資料的 Spark 任務需要 AWS Lake Formation ALL 許可。

AWS Glue 與 AWS Glue 資料目錄互動的 Spark 任務需要適當的 DESCRIBE、ALTER、DROP 許可。

### 步驟 3：使用 初始化完整資料表存取的 Spark 工作階段 AWS Lake Formation
<a name="security-access-control-fta-step-3"></a>

若要存取向 註冊的資料表 AWS Lake Formation，需要在 Spark 初始化期間設定下列組態，以將 Spark 設定為使用 AWS Lake Formation 登入資料。

 若要存取向 註冊的資料表 AWS Lake Formation，您需要明確設定 Spark 工作階段以使用 AWS 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`：明確啟用此目錄的 AWS Lake Formation 整合 
+  可以自訂目錄名稱 (在此範例中為 "glue\$1catalog")，但必須在兩個組態設定中保持一致 

#### Hive
<a name="security-access-control-fta-hive"></a>

```
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS 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
<a name="security-access-control-fta-iceberg"></a>

```
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS 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>.AWS Glue.lakeformation-enabled=true
```
+  `spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver`：將 EMR Filesystem (EMRFS) 設定為使用已 AWS Lake Formation 註冊資料表的 AWS Lake Formation S3 登入資料。如果未註冊資料表，請使用任務的執行時期角色憑證。
+ `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` 和 `spark.hadoop.fs.s3.folderObject.autoAction.disabled=true`：將 EMRFS 設定為在建立 S3 資料夾時使用內容類型標頭 application/x-directory，而非 \$1folder\$1 尾碼。這是讀取 AWS Lake Formation 資料表時的必要項目，因為 AWS Lake Formation 登入資料不允許使用 \$1folder\$1 尾碼讀取資料表資料夾。
+  `spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true`：將 Spark 設定為在建立之前略過驗證資料表位置的空白。這是 AWS Lake Formation 已註冊資料表的必要項目，因為 AWS Lake Formation 用於驗證空位置的登入資料只有在 AWS Glue 資料目錄資料表建立後才能使用。如果沒有此組態，任務的執行時期角色憑證將驗證空白資料表位置。
+  `spark.sql.catalog.createDirectoryAfterTable.enabled=true`：將 Spark 設定為在 Hive 中繼存放區中建立資料表之後建立 Amazon S3 資料夾。這是 AWS Lake Formation 已註冊資料表的必要項目，因為建立 Amazon S3 資料夾的 AWS Lake Formation 登入資料只能在 AWS Glue 建立 Data Catalog 資料表之後使用。
+  `spark.sql.catalog.dropDirectoryBeforeTable.enabled=true`：將 Spark 設定為在 Hive 中繼存放區中刪除資料表之前丟棄 Amazon S3 資料夾。這是 AWS Lake Formation 已註冊資料表的必要項目，因為從 AWS Glue Data Catalog 刪除資料表後，無法使用捨棄 S3 資料夾的 AWS Lake Formation 登入資料。
+  `spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true`：設定 Iceberg 目錄以使用已 AWS Lake Formation 註冊資料表的 AWS Lake Formation Amazon S3 登入資料。如果未註冊資料表，請使用預設環境憑證。

## 使用模式
<a name="security-access-control-fta-usage"></a>

### 搭配 DataFrames 使用 FTA
<a name="using-fta-with-dataframes"></a>

對於熟悉 Spark 的使用者，DataFrames 可以與 AWS Lake Formation 完整資料表存取搭配使用。

AWS Glue 5.0 新增對 Lake Formation Full Table Access 的原生 Spark 支援，可簡化您使用受保護資料表的方式。此功能可讓 AWS Glue 5.0 AWS Glue Spark 任務在授予完整資料表存取時直接讀取和寫入資料，移除先前限制特定擷取、轉換和載入 (ETL) 操作的限制。您現在可以利用進階 Spark 功能，包括彈性分散式資料集 (RDDs)、自訂程式庫，以及具有 AWS Lake Formation 資料表的使用者定義函數 (UDFs)。

#### AWS Glue 5.0 版的原生 Spark FTA
<a name="native-spark-fta"></a>

AWS Glue 5.0 會根據您在 中定義的政策，在 Apache Spark 中支援完整資料表存取 (FTA) AWS Lake Formation控制。此控制層級非常適合需要符合資料表層級安全法規的使用案例。

#### Apache Iceberg 資料表範例
<a name="implementation"></a>

```
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 許可
<a name="required-iam-permissions"></a>

您的 AWS Glue 任務執行角色必須具有：

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

針對資料位置的額外適當 S3 存取許可。

#### Lake Formation 組態
<a name="lake-formation-configuration"></a>

使用原生 Spark FTA in AWS Glue 5.0 之前：

1. 允許第三方查詢引擎在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation

1. 透過 AWS Lake Formation 主控台將適當的資料表許可授予您的 AWS Glue 任務執行角色

1. 使用上述範例所示的必要參數來設定 Spark 工作階段

### 搭配 DynamicFrames 使用 FTA
<a name="using-fta-with-dynamicframes-section"></a>

 AWS Glue的原生 DynamicFrames 可與 AWS Lake Formation 完整資料表存取搭配使用，以最佳化 ETL 操作。完整資料表存取 (FTA) 提供在資料表層級授予許可的安全模型，相較於精細存取控制 (FGAC)，其可以更快速地處理資料，因為其可以繞過資料列和資料欄層級許可檢查。當您需要處理整個資料表和資料表層級許可以滿足您的安全需求時，此方法非常有用。

 在 AWS Glue 4.0 中，具有 FTA 的 DynamicFrames 需要特定的 GlueContext 組態。雖然具有 FTA 的現有 AWS Glue 4.0 DynamicFrame 程式碼將繼續在 AWS Glue 5.0 中運作，但較新版本也提供具有更高彈性的原生 Spark FTA 支援。對於新開發，請考慮使用 DataFrames 一節所述的原生 Spark 方法，尤其是如果您需要額外功能，例如彈性分散式資料集 (RDDs)、自訂程式庫和使用者定義函數 (UDFs) 與 AWS Lake Formation 資料表。

#### 所需的許可
<a name="required-permissions"></a>

執行 Glue 任務的 IAM 角色必須擁有：
+ `lakeformation:GetDataAccess` 許可
+ 透過 Lake Formation 主控台授予的適當 Lake Formation 資料表許可

#### AWS Glue 5.0 中的 DynamicFrame 實作範例
<a name="example-dynamicframe-implementation"></a>

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

## 其他組態
<a name="security-access-control-fta-additional-config"></a>

### 在 AWS Glue Studio 筆記本中設定完整資料表存取模式
<a name="security-access-control-fta-notebooks"></a>

若要從 AWS Glue Studio 筆記本中的互動式 Spark 工作階段存取 AWS Lake Formation 已註冊的資料表，您必須使用相容性許可模式。啟動互動式工作階段之前，請使用 `%%configure` 魔術命令來設定 Spark 組態。此組態必須是筆記本中的第一個命令，因為在工作階段啟動後無法套用其。根據資料表類型選擇組態：

#### 對於 Hive 資料表
<a name="w2aac88c20b7c21b3b5"></a>

```
%%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 資料表
<a name="w2aac88c20b7c21b3b7"></a>

```
%%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：*AWS 區域 (例如，us-east-1)* 
+  ACCOUNT\$1ID：* AWS 您的帳戶 ID* 

**注意**  
必須先設定這些組態，才能在筆記本中執行任何 Spark 操作。

### 受支援的 操作
<a name="security-access-control-fta-supported-operations"></a>

這些操作將使用 AWS Lake Formation 登入資料來存取資料表資料。

**注意**  
 啟用時 AWS Lake Formation：  
 對於 FTA：啟用 Spark 組態 `spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled` 
+ CREATE TABLE
+ ALTER TABLE
+ INSERT INTO
+  INSERT OVERWRITE 
+ SELECT
+ UPDATE
+ 合併為
+ DELETE FROM
+ ANALYZE TABLE
+ REPAIR TABLE
+ DROP TABLE
+ Spark 資料來源查詢
+ Spark 資料來源寫入

**注意**  
上面未列出的操作將繼續使用 IAM 許可來存取資料表資料。

## 從 AWS Glue 4.0 遷移至 AWS Glue 5.0 FTA
<a name="security-access-control-fta-migration"></a>

從 AWS Glue 4.0 GlueContext FTA 遷移至 AWS Glue 5.0 原生 Spark FTA 時：

1. 允許第三方查詢引擎在 AWS Lake Formation中存取資料，無需 IAM 工作階段標籤驗證。遵循[步驟 1：在 中啟用完整資料表存取 AWS Lake Formation](#security-access-control-fta-step-1)。

1. 無需變更任務執行時期角色。不過，請確認 AWS 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. 更新您的 AWS Glue 任務以使用 AWS Glue 5.0

## 考量事項與限制
<a name="security-access-control-fta-considerations-limitations"></a>
+ 如果 Hive 資料表是使用未啟用完整資料表存取的任務所建立，而且未插入任何記錄，則來自具有完整資料表存取之任務的後續讀取或寫入將會失敗。這是因為沒有完整資料表存取權的 AWS 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 Filesystem (EMRFS)。S3A 檔案系統不相容。
+  Hive 和 Iceberg 資料表支援完整資料表存取。尚未新增對 Hudi 和 Delta 資料表的支援。
+ 參考具有 AWS Lake Formation 精細存取控制 (FGAC) 規則或 AWS Glue 資料目錄檢視的資料表的任務將會失敗。若要查詢具有 FGAC 規則或 AWS Glue 資料目錄檢視的資料表，您需要使用 FGAC 模式。您可以依照 AWS 文件中概述的步驟來啟用 FGAC 模式：使用 AWS Glue 搭配 AWS Lake Formation 進行精細存取控制。
+  完整資料表存取不支援 Spark 串流。
+ 無法與 FGAC 同時使用。

# 搭配 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)。

下表說明如何為工作負載選擇精細存取控制 (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 | 