AWS Lake Formation で AWS Glue を使用したフルテーブルアクセス
フルテーブルアクセスの概要
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) の仕組み
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 クラスを通じて引き続きサポートされます。
フルテーブルアクセスの実装
ステップ 1: AWS Lake Formation でフルテーブルアクセスを有効にする
フルテーブルアクセス (FTA) モードを使用するには、AWS Lake Formation で IAM セッションタグの検証を行わずに、サードパーティーのクエリエンジンがデータにアクセスすることを許可する必要があります。有効にするには、「フルテーブルアクセスのためのアプリケーション統合」のステップに従います。
ステップ 2: ジョブランタイムロールの IAM アクセス許可を設定する
基盤となるデータへの読み取りまたは書き込みアクセスには、AWS Lake Formation アクセス許可に加えて、ジョブランタイムロールに lakeformation:GetDataAccess
IAM アクセス許可が必要です。このアクセス許可よって、AWS Lake Formation がデータにアクセスするための一時的な認証情報のリクエストを承諾します。
以下は、Amazon S3 のスクリプトにアクセスするための IAM アクセス許可、Amazon S3 へのログのアップロード、AWS Glue API アクセス許可、AWS Lake Formation へのアクセス許可を指定する方法のポリシー例です。
ステップ 2.1: AWS Lake Formation アクセス許可を設定する
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 セッションを初期化する
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_catalog」という名前のカタログを登録します -
spark.sql.catalog.glue_catalog.glue.lakeformation-enabled
: このカタログの AWS Lake Formation 統合を明示的に有効にします -
カタログ名 (この例では「glue_catalog」) はカスタマイズできますが、両方の設定で一貫している必要があります
[Hive]
‐‐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
--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 フォルダの作成時に $folder$ サフィックスの代わりにコンテンツタイプヘッダー application/x-directory を使用するように EMRFS を設定します。AWS Lake Formation 認証情報は $folder$ サフィックスを持つテーブルフォルダの読み取りを許可しないため、この設定は 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 カタログを設定します。テーブルが登録されていない場合は、デフォルトの環境認証情報を使用します。
使用パターン
DataFrames での FTA の使用
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
AWS Glue 5.0 は、AWS Lake Formation で定義されたポリシーに基づいて、Apache Spark でのフルテーブルアクセス (FTA) コントロールをサポートします。このレベルのコントロールは、テーブルレベルでセキュリティ規制に準拠する必要があるユースケースに最適です。
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 アクセス許可
AWS Glue ジョブ実行ロールには、以下が必要です。
{ "Action": "lakeformation:GetDataAccess", "Resource": "*", "Effect": "Allow" }
さらに、データロケーションに対する適切な S3 アクセス許可。
Lake Formation の設定
AWS Glue 5.0 でネイティブ Spark FTA を使用する前に:
-
AWS Lake Formation で IAM セッションタグの検証を行わずに、サードパーティーのクエリエンジンがデータにアクセスできるようにする
-
AWS Lake Formation コンソールを使用して AWS Glue ジョブ実行ロールに適切なテーブルアクセス許可を付与する
-
上記の例に示す必須パラメータを使用して Spark セッションを設定する
DynamicFrames での FTA の使用
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 アプローチを使用することを検討してください。
必要な許可
Glue ジョブを実行する IAM ロールには次のものが必要です。
-
lakeformation:GetDataAccess
アクセス許可 -
Lake Formation コンソールを通じて付与される適切な Lake Formation テーブルのアクセス許可
AWS 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" )
追加設定
AWS Glue Studio ノートブックでフルテーブルアクセスモードを設定する
AWS Glue Studio ノートブックのインタラクティブ Spark セッションから AWS Lake Formation に登録されたテーブルにアクセスするには、互換性アクセス許可モードを使用する必要があります。インタラクティブセッションを開始する前に、%%configure
マジックコマンドを使用して 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_DATA_LOCATION:
s3://amzn-s3-demo-bucket
-
REGION:
AWS Region (例: us-east-1)
-
ACCOUNT_ID:
ご利用の AWS アカウント ID
注記
ノートブックで Spark 操作を実行する前に、これらの設定を行う必要があります。
サポートされているオペレーション
これらの操作では、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 への移行
AWS Glue 4.0 GlueContext FTA から AWS Glue 5.0 ネイティブ Spark FTA に移行する場合:
-
AWS Lake Formation で IAM セッションタグの検証を行わずに、サードパーティーのクエリエンジンがデータにアクセスできるようにします。ステップ 1: AWS Lake Formation でフルテーブルアクセスを有効にする に従います。
-
ジョブのランタイムロールを変更する必要はありません。ただし、AWS Glue ジョブ実行ロールに lakeformation:GetDataAccess IAM アクセス許可があることを確認します。
-
スクリプトで 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
-
GlueContext DataFrames がネイティブ Spark DataFrames に変更されるようにスクリプトを更新します。
-
AWS Glue 5.0 を使用するように AWS Glue ジョブを更新します。
考慮事項と制約事項
-
フルテーブルアクセスが有効になっていないジョブを使用して Hive テーブルが作成され、レコードが挿入されていない場合、フルテーブルアクセスを持つジョブからの後続の読み取りまたは書き込みは失敗します。これは、フルテーブルアクセスを持たない AWS Glue Spark がテーブルフォルダ名に $folder$ サフィックスを追加するためです。この問題は、以下のいずれかの方法で解決できます。
-
FTA が有効になっていないジョブからテーブルに少なくとも 1 つの行を挿入します。
-
S3 のフォルダ名に $folder$ サフィックスが使用されないようにするため、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 と同時に使用することはできません。