

# AWS Lake Formation アクセスコントロールモデル
<a name="lake-formation-access-control-models"></a>

AWS Glue 5.0 以降は、AWS Lake Formation を介してデータにアクセスするために 2 つのモデルがサポートされています。

**Topics**
+ [AWS Lake Formation で AWS Glue を使用したフルテーブルアクセス](security-access-control-fta.md)
+ [AWS Glue と AWS Lake Formation を併用したきめ細かなアクセスコントロール](security-lf-enable.md)

# AWS Lake Formation で AWS Glue を使用したフルテーブルアクセス
<a name="security-access-control-fta"></a>

## フルテーブルアクセスの概要
<a name="security-access-control-fta-intro"></a>

AWS Glue 5.0 以降は、AWS Lake Formation で定義されたポリシーに基づいて、Apache Spark でのフルテーブルアクセス (FTA) コントロールをサポートします。この機能により、ジョブロールにフルテーブルアクセスがある場合は、AWS Glue Spark ジョブからの AWS Lake Formation 登録済みテーブルに対する読み取りおよび書き込み操作が有効になります。FTA は、テーブルレベルでセキュリティ規制に準拠する必要があるユースケースに最適です。また、障害耐性分散データセット (RDD)、カスタムライブラリ、AWS Lake Formation テーブルを含むユーザー定義関数 (UDF) などの Spark 機能をサポートしています。

AWS Glue Spark ジョブがフルテーブルアクセス (FTA) に対応するように設定されている場合、AWS Lake Formation 認証情報は AWS Lake Formation 登録済みテーブルの Amazon S3 データの読み取り/書き込みに使用され、ジョブのランタイムロール認証情報は AWS Lake Formation に登録されていないテーブルの読み取り/書き込みに使用されます。この機能を使用すると、Apache Hive テーブルと Iceberg テーブルで CREATE、ALTER、DELETE、UPDATE、MERGE INTO ステートメントを含むデータ操作言語 (DML) 操作が可能になります。

**注記**  
要件を確認し、きめ細かなアクセスコントロール (FGAC) またはフルテーブルアクセス (FTA) がニーズに応じているかどうかを判断してください。特定の AWS Glue ジョブに対して有効にできる AWS Lake Formation アクセス許可メソッドは 1 つだけです。ジョブは、フルテーブルアクセス (FTA) ときめ細かなアクセスコントロール (FGAC) を同時に実行することはできません。

## AWS Glue でのフルテーブルアクセス (FTA) の仕組み
<a name="security-access-control-fta-how-it-works"></a>

 AWS Lake Formation には、きめ細かなアクセスコントロール (FGAC) とフルテーブルアクセス (FTA) の 2 つのデータアクセスコントロールアプローチがあります。FGAC は、列、行、セルレベルのフィルタリングを通じてセキュリティを強化するため、きめ細かなアクセス許可を必要とするシナリオに最適です。FTA は、テーブルレベルのアクセス許可が必要となる簡単なアクセスコントロールシナリオに最適です。これにより、きめ細かなアクセスモードを有効にする必要がなくなり、システムドライバーとシステムエグゼキュターを回避することでパフォーマンスを向上させ、コストを削減できます。また、読み取りと書き込み操作 (CREATE、ALTER、DELETE、UPDATE、MERGE INTO コマンドを含む) の両方がサポートされます。

 AWS Glue 4.0 では、AWS Lake Formation ベースのデータアクセスは、AWS Glue によって提供されるユーティリティクラスである GlueContext クラスを通じて機能していました。AWS Glue 5.0 では、AWS Lake Formation ベースのデータアクセスはネイティブ Spark SQL、Spark DataFrames を通じて利用でき、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 アクセス許可に加えて、ジョブランタイムロールに `lakeformation:GetDataAccess` IAM アクセス許可が必要です。このアクセス許可よって、AWS Lake Formation がデータにアクセスするための一時的な認証情報のリクエストを承諾します。

以下は、Amazon S3 のスクリプトにアクセスするための IAM アクセス許可、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>

Amazon S3 からデータを読み取る AWS Glue Spark ジョブには、AWS Lake Formation SELECT アクセス許可が必要です。

Amazon S3 でデータを書き込み/削除する AWS Glue Spark ジョブには、AWS Lake Formation ALL アクセス許可が必要です。

AWS Glue データカタログを操作する AWS Glue Spark ジョブには、必要に応じて DESCRIBE、ALTER、DROP アクセス許可が必要です。

### ステップ 3: AWS Lake Formation を使用してフルテーブルアクセスのための Spark セッションを初期化する
<a name="security-access-control-fta-step-3"></a>

AWS Lake Formation に登録されたテーブルにアクセスするには、Spark の初期化中に以下の設定を行い、AWS Lake Formation 認証情報を使用するように Spark を設定する必要があります。

 AWS Lake Formation に登録されているテーブルにアクセスするには、AWS Lake Formation 認証情報を使用するように Spark セッションを明示的に設定する必要があります。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`: GlueCatalog 実装を使用する「glue\$1catalog」という名前のカタログを登録します 
+  `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`: AWS Lake Formation に登録されたテーブルに AWS Lake Formation S3 認証情報を使用するように EMR ファイルシステム (EMRFS) を設定します。テーブルが登録されていない場合は、ジョブのランタイムロール認証情報を使用します。
+ `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` および `spark.hadoop.fs.s3.folderObject.autoAction.disabled=true`: S3 フォルダの作成時に \$1folder\$1 サフィックスの代わりにコンテンツタイプヘッダー application/x-directory を使用するように EMRFS を設定します。AWS Lake Formation 認証情報は \$1folder\$1 サフィックスを持つテーブルフォルダの読み取りを許可しないため、この設定は AWS Lake Formation テーブルを読み取る際に必要です。
+  `spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true`: 作成前に空のテーブルの場所を検証するステップをスキップするよう Spark を設定します。空の場所を検証するための AWS Lake Formation 認証情報は AWS Glue Data Catalog テーブルの作成後にしか使用できないため、この設定は AWS Lake Formation に登録されたテーブルに対して必要です。この設定がない場合、ジョブのランタイムロール認証情報によって空のテーブルの場所が検証されます。
+  `spark.sql.catalog.createDirectoryAfterTable.enabled=true`: Hive メタストアでテーブルを作成した後に Amazon S3 フォルダを作成するよう Spark を設定します。Amazon S3 フォルダを作成するための AWS Lake Formation 認証情報は AWS Glue Data Catalog テーブルの作成後にしか使用できないため、この設定は AWS Lake Formation に登録されたテーブルに対して必要です。
+  `spark.sql.catalog.dropDirectoryBeforeTable.enabled=true`: Hive メタストアでテーブルを削除する前に Amazon S3 フォルダを削除するよう Spark を設定します。AWS Glue Data Catalog からテーブルを削除した後は、S3 フォルダを削除するための AWS Lake Formation 認証情報を使用できないため、この設定は AWS Lake Formation に登録されたテーブルに対して必要です。
+  `spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true`: AWS Lake Formation に登録されたテーブルに AWS Lake Formation Amazon S3 認証情報を使用するように Iceberg カタログを設定します。テーブルが登録されていない場合は、デフォルトの環境認証情報を使用します。

## 使用パターン
<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 フルテーブルアクセスのネイティブ Spark サポートが追加されており、保護されたテーブルの操作方法が簡素化されています。この機能により、フルテーブルアクセスが付与されると AWS Glue 5.0 AWS Glue Spark ジョブはデータを直接読み書きできるため、以前にあった特定の抽出、変換、ロード (ETL) 操作の制限がなくなります。障害耐性分散データセット (RDD)、カスタムライブラリ、ユーザー定義関数 (UDF) などの高度な Spark 機能を AWS Lake Formation テーブルで活用できるようになりました。

#### AWS Glue 5.0 のネイティブ Spark FTA
<a name="native-spark-fta"></a>

AWS Glue 5.0 は、AWS Lake Formation で定義されたポリシーに基づいて、Apache Spark でのフルテーブルアクセス (FTA) コントロールをサポートします。このレベルのコントロールは、テーブルレベルでセキュリティ規制に準拠する必要があるユースケースに最適です。

#### 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>

AWS Glue 5.0 でネイティブ Spark FTA を使用する前に:

1. AWS Lake Formation で IAM セッションタグの検証を行わずに、サードパーティーのクエリエンジンがデータにアクセスできるようにする

1. AWS Lake Formation コンソールを使用して AWS Glue ジョブ実行ロールに適切なテーブルアクセス許可を付与する

1. 上記の例に示す必須パラメータを使用して Spark セッションを設定する

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

 AWS Glue のネイティブ DynamicFrames は、ETL 操作を最適化するために AWS Lake Formation フルテーブルアクセスで使用できます。フルテーブルアクセス (FTA) は、テーブルレベルでアクセス許可を付与するセキュリティモデルを提供します。これにより、行および列レベルのアクセス許可チェックのオーバーヘッドを回避できるため、きめ細かなアクセスコントロール (FGAC) と比較してデータ処理が高速化されます。このアプローチは、セキュリティ要件を満たすテーブル全体とテーブルレベルのアクセス許可を処理する必要がある場合に役立ちます。

 AWS Glue 4.0 では、FTA を使用する DynamicFrames では特定の GlueContext 設定が必要でした。FTA を使用する既存の AWS Glue 4.0 DynamicFrame コードは AWS Glue 5.0 でも引き続き動作しますが、新しいバージョンではネイティブ Spark FTA サポートも提供され、柔軟性が向上しています。新規の開発で、特に、障害耐性分散データセット (RDD)、カスタムライブラリ、AWS Lake Formation テーブルを含むユーザー定義関数 (UDF) などの追加機能が必要になる場合は、DataFrames セクションで説明されているネイティブの Spark アプローチを使用することを検討してください。

#### 必要な許可
<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 Region (例: 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
+ MERGE INTO
+ 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 5.0 を使用するように AWS Glue ジョブを更新します。

## 考慮事項と制約事項
<a name="security-access-control-fta-considerations-limitations"></a>
+ フルテーブルアクセスが有効になっていないジョブを使用して Hive テーブルが作成され、レコードが挿入されていない場合、フルテーブルアクセスを持つジョブからの後続の読み取りまたは書き込みは失敗します。これは、フルテーブルアクセスを持たない AWS Glue Spark がテーブルフォルダ名に \$1folder\$1 サフィックスを追加するためです。この問題は、以下のいずれかの方法で解決できます。
  +  FTA が有効になっていないジョブからテーブルに少なくとも 1 つの行を挿入します。
  +  S3 のフォルダ名に \$1folder\$1 サフィックスが使用されないようにするため、FTA が有効になっていないジョブを設定します。そのために、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 テーブルのサポートはまだ追加されていません。
+ AWS Lake Formation きめ細かなアクセスコントロール (FGAC) ルールまたは AWS Glue Data Catalog ビューを持つテーブルを参照するジョブは失敗します。FGAC ルールまたは AWS Glue Data Catalog ビューを使用してテーブルをクエリするには、FGAC モードを使用する必要があります。FGAC モードを有効にするには、AWS ドキュメント「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 でサポートされているデータカタログテーブルにきめ細かなアクセスコントロールを適用できます。この機能を使用すると、AWS Glue for Apache Spark ジョブ内の read クエリのテーブル、行、列、セルレベルのアクセスコントロールを設定できます。Lake Formation の詳細と AWS Glue での使用方法については、以下のセクションを参照してください。

Glue 4.0 以前でサポートされていた、AWS Lake Formation のアクセス許可を持つ `GlueContext` ベースのテーブルレベルのアクセスコントロールは、Glue 5.0 ではサポートされません。Glue 5.0 では新しい Spark ネイティブのきめ細かなアクセスコントロール (FGAC) を使用します。次の詳細情報に注意してください。
+ row/column/cell のアクセスコントロールにきめ細かなアクセスコントロール (FGAC) が必要な場合は、 Glue 4.0 の `GlueContext`/Glue DynamicFrame から、 Glue 5.0 の Spark DataFrame より前に移行する必要があります。例については、「[GlueContext/Glue DynamicFrame から Spark DataFrame への移行](security-lf-migration-spark-dataframes.md)」を参照してください。
+  フルテーブルアクセスコントロール (FTA) が必要な場合は、AWS Glue 5.0 の DynamicFrames を使って FTA を活用できます。また、ネイティブ Spark アプローチに移行して、障害耐性分散データセット (RDD)、カスタムライブラリ、AWS Lake Formation テーブルを含むユーザー定義関数 (UDF) などの追加機能を利用することもできます。例については、「[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 を使用するジョブには、1 つのユーザードライバー、1 つのシステムドライバー、1 つのシステムエグゼキューター、1 つのスタンバイユーザーエグゼキューターの最低 4 つのワーカーが必要です。

AWS Lake Formation で AWS Glue を使用すると、追加料金が発生します。

## AWS Glue と AWS Lake Formation の連携方法
<a name="security-lf-enable-how-it-works"></a>

AWS Glue と Lake Formation を使用すると、各 Spark ジョブにアクセス許可のレイヤーを適用して、AWS Glue がジョブを実行するときに Lake Formation アクセス許可コントロールを適用できます。AWSGlue は、[Spark リソースプロファイル](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)を使用して 2 つのプロファイルを作成し、ジョブを効果的に実行します。ユーザープロファイルはユーザー提供のコードを実行し、システムプロファイルは 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)」を参照してください。

以下は、AWS Glue が Lake Formation セキュリティポリシーで保護されたデータにアクセスする方法の概要を示します。

![\[この図は、AWS Glue StartJobRun API でのきめ細かなアクセスコントロールの仕組みを示しています。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/glue-50-fgac-start-job-run-api-diagram.png)


1. ユーザーは AWS Lake Formation が有効な AWS Glue ジョブで `StartJobRun` API を呼び出します。

1. AWS Glue はジョブをユーザードライバーに送信し、ユーザープロファイルでジョブを実行します。ユーザードライバーは、タスクの起動、エグゼキュターのリクエスト、S3 または Glue カタログへのアクセスができない Spark のリーンバージョンを実行します。ジョブプランを構築します。

1. AWS Glue は、システムドライバーと呼ばれる 2 番目のドライバーを設定し、システムプロファイルで (特権 ID を使用して) 実行します。AWSGlue は、通信用の 2 つのドライバー間に暗号化された TLS チャネルを設定します。ユーザードライバーはチャネルを使用して、ジョブプランをシステムドライバーに送信します。システムドライバーは、ユーザーが送信したコードを実行しません。フル Spark を実行して、データアクセスのために S3 およびデータカタログと通信します。エグゼキュターをリクエストし、ジョブプランを一連の実行ステージにコンパイルします。

1. 次に、AWS Glue はユーザードライバーまたはシステムドライバーを使用してエグゼキュターでステージを実行します。どのステージのユーザーコードも、ユーザープロファイルのエグゼキュターでのみ実行されます。

1. AWS Lake Formation で保護されたデータカタログテーブルからデータを読み取るステージ、またはセキュリティフィルターを適用するステージは、システムエグゼキュターに委任されます。

## ワーカーの最小要件
<a name="security-lf-enable-permissions"></a>

AWS Glue の Lake Formation 対応ジョブには、1 つのユーザードライバー、1 つのシステムドライバー、1 つのシステムエグゼキューター、1 つのスタンバイユーザーエグゼキューターの最低 4 つのワーカーが必要です。これは、標準の AWS Glue ジョブに必要な最低 2 つのワーカーより多いです。

AWS Glue の Lake Formation 対応ジョブごとに 2 つの Spark ドライバー (1 つはユーザープロファイル用、もう 1 つはシステムプロファイル用) を使用します。同様に、エグゼキューターも 2 つのプロファイルに分割されます。
+ システムエグゼキューター: Lake Formation データフィルターが適用されるタスクを処理します。
+ ユーザーエグゼキューター: 必要に応じてシステムドライバーによってリクエストされます。

Spark ジョブは遅延する性質があるため、AWS Glue は 2 つのドライバーを差し引いたワーカー総数の 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 アクセス許可 (SELECT) を持っていても、`glue:Get*` API オペレーションに対する IAM アクセス許可がない場合、操作は失敗します。

以下は、S3 のスクリプトにアクセスするための IAM アクセス許可、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>

まず、Hive テーブルの場所を Lake Formation に登録します。次に、目的のテーブルにジョブランタイムロールのアクセス許可を作成します。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 のアクセス許可の設定が完了したら、AWS 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>

 AWS Lake Formation 許可の設定が完了したら、AWS 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"
}
```

## AWS Glue 5.0 Notebook またはインタラクティブセッション用の FGAC
<a name="security-lf-fgac"></a>

AWS Glue で「きめ細かなアクセスコントロール」 (FGAC) を有効にするには、最初のセルを作成する前に、%%configure マジックの一部として Lake Formation に必要な Spark confs を指定する必要があります。

後で呼び出し `SparkSession.builder().conf("").get()` または `SparkSession.builder().conf("").create()` を使用して指定するだけでは不十分です。これは AWS Glue 4.0 からの挙動変更となります。

## オープンテーブル形式のサポート
<a name="security-lf-enable-open-table-format-support"></a>

AWS Glue バージョン 5.0 以降には、Lake Formation に基づくきめ細かなアクセスコントロールのサポートが含まれています。AWSGlue は、Hive テーブルタイプと Iceberg テーブルタイプをサポートしています。次の表で、サポートされているすべてのオペレーションについて説明します。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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 を使用する場合は、次の考慮事項と制限事項を検討してください。

Lake Formation を使用した AWS Glue は、AWS GovCloud (米国東部) と AWS GovCloud (米国西部) を除く、サポートされているすべてのリージョンで使用できます。
+ AWS Glue は、Apache Hive テーブルおよび Apache Iceberg テーブルに対してのみ Lake Formation を介したきめ細かなアクセスコントロールをサポートします。Apache Hive 形式には、Parquet、ORC、および CSV が含まれます。
+ Lake Formation は Spark ジョブでのみ使用できます。
+ Lake Formation を使用した AWS Glue は、ジョブ全体で 1 つの Spark セッションのみをサポートします。
+ Lake Formation が有効になっている場合、1 つのシステムドライバー、システムエグゼキュター、1 つのユーザードライバー、およびオプションでユーザーエグゼキュター (ジョブに UDF または `spark.createDataFrame` がある場合に必要) が必要なため、AWS Glue にはより多くのワーカーが必要です。
+ Lake Formation を使用した AWS Glue は、リソースリンクを介して共有されるクロスアカウントテーブルクエリのみをサポートします。resource-link には、ソースアカウントのリソースと同じ名前を付ける必要があります。
+ Glue AWS ジョブのきめ細かなアクセスコントロールを有効にするには、`--enable-lakeformation-fine-grained-access` ジョブパラメータを渡します。
+ AWS Glue マルチカタログ階層で動作するように AWS Glue ジョブを設定できます。AWS Glue `StartJobRun` API で使用する設定パラメータの詳細については、「[Working with AWS Glue multi-catalog hierarchy on EMR Serverless](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` コマンド
+ アクセスコントロールを適用するために、`EXPLAIN PLAN` および `DESCRIBE TABLE` などの DDL オペレーションは、限定された情報を公開しません。
+ AWS Glue は、Lake Formation 対応アプリケーションのシステムドライバー Spark ログへのアクセスを制限します。システムドライバーはより多くのアクセス権を使用して実行されるため、システムドライバーが生成するイベントとログには機密情報が含まれる可能性があります。許可されていないユーザーまたはコードがこの機密データにアクセスできないように、AWS Glue はシステムドライバーログへのアクセスを無効にしました。トラブルシューティングについては、AWS のサポートにお問い合わせください。
+ テーブルの場所を Lake Formation に登録した場合、データアクセスパスは、AWS Glue ジョブのランタイムロールの IAM アクセス許可に関係なく、Lake Formation に保存された認証情報を経由します。テーブルの場所に登録されたロールを誤って設定すると、テーブルの場所に対して S3 IAM アクセス許可を持つロールを使用して送信されたジョブは失敗します。
+ Lake Formation テーブルへの書き込みでは、Lake Formation に付与されたアクセス許可ではなく、IAM アクセス許可が使用されます。ジョブランタイムロールに必要な S3 アクセス許可がある場合は、それを使用して書き込みオペレーションを実行できます。

Apache Iceberg を使用する場合の考慮事項と制限事項を次に示します。
+ Apache Iceberg はセッションカタログでのみ使用でき、任意の名前のカタログでは使用できません。
+ Lake Formation に登録されている Iceberg テーブルは、メタデータテーブル `history`、`metadata_log_entries`、`snapshots`、`files`、`manifests`、`refs` のみをサポートします。AWSGlue は `partitions`、`path`、`summaries` などの機密データを持つ可能性のある列を非表示にします。この制限は、Lake Formation に登録されていない Iceberg テーブルには適用されません。
+ Lake Formation に登録していないテーブルは、すべての Iceberg ストアドプロシージャをサポートしています。`register_table` プロシージャと `migrate` プロシージャは、どのテーブルでもサポートされていません。
+ V1 の代わりに Iceberg DataFrameWriterV2 を使用することをお勧めします。

## ワーカー割り当ての例
<a name="security-lf-considerations-worker-allocation"></a>

以下のパラメーターを使用して設定されたジョブの場合:

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

ワーカーの割り当ては次のとおりです。
+ ユーザードライバーの 1 つのワーカー。
+ システムドライバーの 1 つのワーカー。
+ ユーザーエグゼキューター用に予約されている残りの 18 個のワーカー (つまり 2 個のワーカー) の 10%。
+ システムエグゼキューターに割り当てられるワーカーは最大 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 リソースプロファイルを使用してジョブ実行を分割します。AWSGlue は、ユーザープロファイルを使用して指定したコードを実行し、システムプロファイルは Lake Formation ポリシーを適用します。ユーザープロファイルとして実行されたタスクのログにアクセスできます。

## Live UI と Spark 履歴サーバー
<a name="security-lf-troubleshooting-live-ui"></a>

Live UI と Spark 履歴サーバーには、ユーザープロファイルから生成されたすべての 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 データカタログとテーブルの共有
<a name="security-lf-troubleshooting-cross-account"></a>

データベースとテーブルをアカウント間で共有し、Lake Formation を引き続き使用できます。詳細については、「[Cross-account data sharing in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)」と「[How do I share AWS 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 | 