

# Lake Formation と Athena Spark ワークグループの併用
<a name="notebooks-spark-lakeformation"></a>

リリースバージョン Apache Spark バージョン 3.5 では、セッション実行ロールに完全なテーブルアクセス許可がある AWS Glue Data Catalog とともに AWS Lake Formation を活用できます。この機能を使用すると、Athena Spark インタラクティブジョブから Lake Formation によって保護されているテーブルの読み取りと書き込みを実行できます。Lake Formation の詳細と Athena Spark との併用方法については、以降のセクションを参照してください。

## ステップ 1: Lake Formation でフルテーブルアクセスを有効にする
<a name="notebooks-spark-lakeformation-enable-fta"></a>

フルテーブルアクセス（FTA）モードを使用するには、AWS Lake Formation で IAM セッションタグの検証を行わずに Athena Spark がデータにアクセスすることを許可する必要があります。有効にするには、「[フルテーブルアクセスのためのアプリケーション統合](https://docs.aws.amazon.com//lake-formation/latest/dg/fta-app-integration.html)」のステップに従います。

### ステップ 1.1：ユーザー定義ロールを使用して Lake Formation にデータロケーションを登録する
<a name="notebooks-spark-lakeformation-register-locations"></a>

AWS Lake Formation でデータロケーションを登録するには、ユーザー定義のロールを使用する必要があります。詳細については、「[ロケーションの登録に使用されるロールの要件](https://docs.aws.amazon.com//lake-formation/latest/dg/registration-role.html)」を参照してください。

## ステップ 2：セッションの実行ロールの IAM アクセス許可を設定する
<a name="notebooks-spark-lakeformation-iam-permissions"></a>

基盤となるデータへの読み取りアクセス権や書き込みアクセス権については、Lake Formation アクセス許可に加えて、実行ロールに `lakeformation:GetDataAccess` IAM アクセス許可が必要です。この許可があると、Lake Formation がデータにアクセスするための一時的な認証情報のリクエストを承諾します。

以下は、Amazon S3 のスクリプトにアクセスするための IAM 許可、S3 AWS Glue へのログのアップロード、 API 許可、Lake Formation へのアクセス許可を指定する方法に関するポリシーの例です。

### ステップ 2.1: Lake Formation の許可を設定する
<a name="notebooks-spark-lakeformation-configure-permissions"></a>
+ S3 からデータを読み取る Spark ジョブには、Lake Formation `SELECT` 許可が必要です。
+ S3 でデータの書き込み/削除を行う Spark ジョブには、Lake Formation `ALL (SUPER)` 許可が必要です。
+ AWS Glue Data Catalog を操作する Spark ジョブには、必要に応じて `DESCRIBE`、`ALTER`、`DROP` 許可が必要です。

## ステップ 3: Lake Formation を使用してフルテーブルアクセスのための Spark セッションを初期化する
<a name="notebooks-spark-lakeformation-initialize-session"></a>

### 前提条件
<a name="notebooks-spark-lakeformation-prerequisites"></a>

AWS Glue Data Catalog は、Lake Formation テーブルにアクセスするためのメタストアとして設定しなければなりません。

AWS Glue Catalog をメタストアとして設定するには、以下の設定を行います。

```
{
  "spark.hadoop.glue.catalogid": "ACCOUNT_ID",
  "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
  "spark.hadoop.hive.metastore.glue.catalogid": "ACCOUNT_ID",
  "spark.sql.catalogImplementation": "hive"
}
```

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

### [Hive]
<a name="notebooks-spark-lakeformation-hive-config"></a>

```
{
  "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver",
  "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true",
  "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true",
  "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true",
  "spark.sql.catalog.createDirectoryAfterTable.enabled": "true",
  "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true"
}
```

### Apache Iceberg
<a name="notebooks-spark-lakeformation-iceberg-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog",
  "spark.sql.catalog.spark_catalog.warehouse": "s3://your-bucket/warehouse/",
  "spark.sql.catalog.spark_catalog.client.region": "REGION",
  "spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID",
  "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true"
}
```

### Amazon S3 Tables
<a name="notebooks-spark-lakeformation-s3tables-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.{catalogName}": "org.apache.iceberg.spark.SparkCatalog",
  "spark.sql.catalog.{catalogName}.warehouse": "arn:aws:s3tables:{region}:{accountId}:bucket/{bucketName}",
  "spark.sql.catalog.{catalogName}.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.{catalogName}.glue.id": "{accountId}:s3tablescatalog/{bucketName}",
  "spark.sql.catalog.{catalogName}.glue.lakeformation-enabled": "true",
  "spark.sql.catalog.{catalogName}.client.region": "REGION",
  "spark.sql.catalog.{catalogName}.glue.account-id": "ACCOUNT_ID"
}
```

### Delta Lake
<a name="notebooks-spark-lakeformation-deltalake-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog",
  "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver",
  "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true",
  "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true",
  "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true",
  "spark.sql.catalog.createDirectoryAfterTable.enabled": "true",
  "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true"
}
```

## 考慮事項と制約事項
<a name="notebooks-spark-lakeformation-considerations"></a>
+ フルテーブルアクセスは、Hive、Iceberg、Amazon S3 Tables、Delta テーブルでサポートされています。Hudi テーブルはフルテーブルアクセスをサポートしていません。
+ アクティブセッションに新しいカタログを追加するには、新規カタログ設定とともに `spark.conf.set` を使用します。
+ カタログ設定はイミュータブルです。カタログ設定をアップデートする場合は、`spark.conf.set` を使用して新しいカタログを作成します。
+ Spark セッションに必要なカタログのみを追加します。
+ デフォルトカタログを変更する方法：`spark.catalog.setCurrentCatalog("s3tablesbucket")`
+ `-` のようにカタログ名に特殊文字がある場合は、次のようにクエリでエスケープしてください。

  ```
  SELECT sales_amount as nums FROM `my-s3-tables-bucket`.`s3namespace`.`daily_sales` LIMIT 100
  ```