Amazon Web Services ブログ

AWS Lake Formation によるクロスアカウントの細粒度アクセスコントロールしたApache IcebergテーブルをAmazon Athenaで操作する

この記事は、Interact with Apache Iceberg tables using Amazon Athena and cross account fine-grained permissions using AWS Lake Formation を翻訳したものです。

先日、Apache Iceberg、Apache Hudi、Apache Hive などのテーブルフォーマットを使用して、サポートされている任意のファイル形式で保存されたデータに対する Amazon Athena クエリにおける AWS Lake Formation の細粒度のアクセスコントロールポリシーのサポートを発表しました。AWS Lake Formation では、データベース、テーブル、および列レベルのアクセスポリシーを定義して適用し、Amazon S3 に保存されている Iceberg テーブルをクエリできます。Lake Formation は Amazon S3 に保存されているデータに認可とガバナンスのレイヤーを提供します。この機能を使用するには、Athena エンジンバージョン 3 にアップグレードする必要があります。

大規模な組織には、多くの場合、自律的にビジネスデータを扱う事業部門 (LOB) があります。これにより、LOB 間でのデータ共有が簡単ではなくなります。これらの組織は連携モデルを採用することで、各LOBにはデータに関する意思決定を自主的に行うことができます。彼らは、アクセス制御を実施するために使用される中央集権型ガバナンス・レイヤーを備えたパブリッシャー/コンシューマー・モデルを使用します。データメッシュアーキテクチャについて詳しく知りたい場合は、 Design a data mesh architecture using AWS Lake Formation and AWS Glue を参照してください。Athena エンジンバージョン 3 では、お客様は Apache Iceberg、Apache Hudi、Apache Hive などのオープンデータフレームワークに対して同じ細粒度のコントロールを使用できます。

この記事では、データ共有を有効にしたプロデューサー/コンシューマーモデルで、コンシューマーがクエリできる Apache Iceberg テーブルへのアクセスを制限するユースケースについて詳しく説明します。特定の行を制限する列フィルタリング、列レベルのアクセスを制限するフィルタリング、スキーマの進化、タイムトラベルについて説明します。

ソリューション概要

Athena と Lake Formation での Apache Iceberg テーブルの細粒度のアクセス制御機能を説明するために、以下のコンポーネントを設定します。

  • プロデューサーアカウント
    • Apache Iceberg 形式のテーブルのスキーマを登録するための AWS Glue データカタログ
    • コンシューマーアカウントへの細粒度のアクセスを提供する Lake Formation
    • プロデューサーアカウントのデータを検証する Athena
  • コンシューマーアカウント
    • プロデューサーのデータカタログとコンシューマー間の共有を作成するための AWS Resource Access Manager (AWS RAM)
    • コンシューマーアカウントへの細粒度のアクセスを提供する Lake Formation
    • プロデューサーアカウントのデータを検証する Athena

次の図はアーキテクチャを示しています。

前提条件

以下の前提条件を確認してください。

データプロデューサーセットアップ

このセクションでは、データプロデューサーを設定する手順を示します。

テーブルデータを保存する S3 バケットを作成する

テーブルのデータを保存する新しい S3 バケットを作成します。

  1. Amazon S3 コンソールで、一意の名前の S3 バケットを作成します (この記事では iceberg-athena-lakeformation-blog を使用しています)。
  2. テーブルに使用する producer フォルダーをバケット内に作成します。

Lake Formationを使用してテーブルを格納するS3パスを登録する

S3パスを Lake Formation に登録します。

  1. Lake Formation コンソールに移動します。
  2. 初めてログインする場合、管理者ユーザーを作成するように求められます。

  1. ナビゲーションペインの Register and ingest で、 Data lake locations を選択します。
  2. Register location を選択し、作成した S3 バケットのパスを入力します。
  3. IAM ロールには、AWSServiceRoleForLakeFormationDataAccess を選択します。

ロールの詳細については、ロケーションの登録に使用されるロールの要件を参照してください。

S3 バケットの暗号化を有効にした場合は、Lake Formation に暗号化と復号化の操作を実行する権限を与える必要があります。ガイダンスについては、暗号化された Amazon S3 ロケーションの登録を参照してください。

  1. Register location を選択します。

Athena を使用して Iceberg テーブルを作成する

それでは、Apache Iceberg フォーマットのテーブルを Athena を使用して作成してみましょう。

  1. Athena コンソールのナビゲーションペインで Query editor (クエリエディタ) を選択します。
  2. Athena を初めて使用する場合は、 Settings (設定)で Manage (管理)を選択し、以前に作成した S3 バケットの場所 (iceberg-athena-lakeformation-blog/producer) を入力します。
  3. Save (保存) を選択します。
  4. クエリエディターで、次のクエリを入力します ( LOCATION を Lake Formation に登録した S3 バケット名に置き換えます)。ここではデフォルトのデータベースを使用しますが、他のデータベースも使用できます。
CREATE TABLE consumer_iceberg (
 customerid bigint,
 customername string,
 email string,
 city string,
 country string,
 territory string,
 contactfirstname string,
 address string)
 LOCATION 's3://YOUR-BUCKET/producer/' -- *** Change bucket name to your bucket***
 TBLPROPERTIES ('table_type'='ICEBERG')
  1. Run (実行)を選択します。

テーブルをコンシューマーアカウントと共有する

機能を説明するために、以下のシナリオを進めます。

  • 選択した列へのアクセスを提供する
  • フィルターに基づいて選択した行へのアクセスを提供する

次の手順を実行してください。

  1. Lake Formation コンソールのナビゲーションペインの Data catalog で、 Data filters を選択します。
  2. Create new filter を選択します。
  3. Data filter name には、blog_data_filter と入力します。
  4. Target database には、lf-demo-db と入力します。
  5. Target table には、consumer_iceberg と入力します。
  6. Column-level access には、 Include columns を選択します。
  7. コンシューマーと共有する列( countryaddresscontactfirstnamecitycustomeridcustomername )を選択します。
  8. Row filter expression には、 Country='France' というフィルターを入力します。
  9. Create filter を選択します。

それでは、 consumer_iceberg テーブルのコンシューマーアカウントへのアクセス権を付与しましょう。

  1. ナビゲーションペインで Tables を選択します。
  2. consumer_iceberg テーブルを選択し、 Actions メニューで Grant を選択します。

  1. External accounts を選択します。
  2. 外部アカウントIDを入力します。

  1. Named data catalog resources を選択します。
  2. データベースとテーブルを選択します。
  3. Data filters では、作成したデータフィルターを選択します。

  1. Data filter permissions Grantable permissionsSelect を選択します。
  2. Grant を選択します。

データコンシューマーセットアップ

データコンシューマーを設定するには、AWS RAM と Lake Formation を使用してリソース共有を受け入れ、テーブルを作成します。次の手順を実行してください。

  1. コンシューマーアカウントにログインし、AWS RAM コンソールに移動します。
  2. ナビゲーションペインの Shared with me (自分と共有)で、 Resource shares (リソースの共有)を選択します。
  3. 共有されるリソースを選択してください。

  1. Accept resource share (リソースの共有を承認)を選択します。
  2. 次のステップで使用するリソース共有の名前をメモしておきます。

  1. Lake Formation コンソールに移動します。
  2. 初めてログインする場合、管理者ユーザーを作成するように求められます。
  3. ナビゲーションペインで Tables を選択し、Create table を選択します。
  4. Actions メニューで Create resource link を選択します。

  1. Resource link name に、リソースリンクの名前 (たとえば、 consumer_iceberg ) を入力します。
  2. データベースと共有テーブルを選択してください。
  3. Create を選択します。

ソリューションを検証

これで、テーブルに対してさまざまな操作を実行して、細粒度のアクセス制御を検証できます。

Insert 操作

プロデューサーアカウントの consumer_iceberg テーブルにデータを挿入し、データフィルタリングがコンシューマーアカウントで期待どおりに機能することを検証してみましょう。

  1. プロデューサーアカウントにログインします。
  2. Athena コンソールのナビゲーションペインで Query editor (クエリエディタ)を選択します。
  3. 次の SQL を使用して、Iceberg テーブルにデータを書き込んで挿入します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
INSERT INTO consumer_iceberg VALUES (1, 'Land of Toys Inc.', 'gladys.rim@rim.org',
 'NYC','USA', 'NA', 'James', 'xxxx 118th NE');

 INSERT INTO consumer_iceberg VALUES (2, 'Reims Collectables', 'yuki_whobrey@aol.com',
 'Reims','France', 'EMEA', 'Josephine', 'Darakjy');

 INSERT INTO consumer_iceberg VALUES (3, 'Lyon Souveniers', 'fletcher.flosi@yahoo.com',
 'Paris', 'France', 'EMEA','Art', 'Venere');

  1. 次の SQL を使用して、Iceberg テーブル内のデータを表示します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10; 

  1. コンシューマーアカウントにログインします。
  2. Athena クエリエディターで、共有テーブルに次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;


フィルターに基づいて、コンシューマーは contry が France の列と行のサブセットが表示されます。

Update / Delete 操作

次に、コンシューマーに共有しているデータセットの1つの行の更新と1つの行の削除を行いましょう。

  1. プロデューサーアカウントにログインします。
  2. city='Paris' WHERE city='Reims' で更新し、 customerid = 3; で行を削除します。
UPDATE consumer_iceberg SET city= 'Paris' WHERE city= 'Reims' ;

 DELETE FROM consumer_iceberg WHERE customerid =3; 

  1. 更新および削除されたデータセットを確認します。
SELECT * FROM consumer_iceberg;

  1. コンシューマーアカウントにログインします。
  2. Athena クエリエディターで、共有テーブルで次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;

1行だけが表示され、cityはParisに更新されていることがわかります。

スキーマの更新:新しい列の追加

コンシューマと共有しているデータセットにカラムの追加と行の挿入を行いましょう。

  1. プロデューサーアカウントにログインします。
  2. Iceberg テーブルに geo_loc という名前の新しい列を追加します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
ALTER TABLE consumer_iceberg ADD COLUMNS (geo_loc string);

 INSERT INTO consumer_iceberg VALUES (5, 'Test_user', 'test_user@aol.com',
 'Reims','France', 'EMEA', 'Test_user', 'Test_user', 'test_geo');

SELECT * FROM consumer_iceberg; 
 

新しく追加された geo_loc 列を表示できるようにするには、Lake Formation データフィルターを更新する必要があります。

  1. Lake Formation コンソールのナビゲーションペインで Data filters を選択します。
  2. データフィルターを選択し、 Edit を選択します。

  1. Column-level access に、新しい列 (geo_loc) を追加します。
  2. Save を選択します。

  1. コンシューマーアカウントにログインします。
  2. Athena クエリエディターで、共有テーブルに対して次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;

スキーマの更新:列の削除

コンシューマと共有しているデータセットにカラムの削除を行いましょう。

  1. プロデューサーアカウントにログインします。
  2. Iceberg テーブルから address 列を削除します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
ALTER TABLE consumer_iceberg DROP COLUMN address;

SELECT * FROM consumer_iceberg; 
 

address 列がテーブルに存在しないことがわかります。

  1. コンシューマーアカウントにログインします。
  2. Athena クエリエディターで、共有テーブルに対して次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;

address 列がテーブルに存在しないことがわかります。

タイムトラベル

Iceberg テーブルを複数回変更しました。Iceberg テーブルはスナップショットをトラックします。次の手順を実行して、タイムトラベル機能を試してみてください。

  1. プロデューサーアカウントにログインします。
  2. システムテーブルをクエリします。
SELECT * FROM "lf-demo-db"."consumer_iceberg$snapshots" limit 10;

複数のスナップショットが生成されていることがわかります。

  1. 次のステップで使用する committed_at 値の 1 つを書き留めておきます (この例では、2023-01-29 21:35:02.176 UTC)。

  1. タイムトラベルを使ってテーブルのスナップショットを参照します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
SELECT * FROM consumer_iceberg FOR TIMESTAMP
 AS OF TIMESTAMP '2023-01-29 21:35:02.176 UTC'; 

クリーンアップ

請求が発生しないように、次の手順を実行してください。

  1. Amazon S3 コンソールで、データが格納されているバケットを削除します (この投稿では iceberg-athena-lakeformation-blog )。
  2. Athena コンソールのプロデューサーアカウントで、次のコマンドを実行して、作成したテーブルを削除します。
DROP TABLE "lf-demo-db"."consumer_iceberg";
 DROP DATABASE lf-demo-db;
  1. Lake Formation コンソールのプロデューサーアカウントで、コンシューマーアカウントへの権限を削除します。

  1. Athena のクエリ結果ロケーションに使用されているコンシューマーアカウントの S3 バケットを削除します。

結論

Iceberg などのフォーマットに対してクロスアカウントの細粒度のアクセス制御ポリシーがサポートされているため、Athena がサポートするどのフォーマットでも柔軟に対応できます。S3 データレイク内のデータに対して CRUD 操作を実行できる機能と、Athena がサポートするすべてのテーブルとフォーマットに対する Lake Formation の細粒度のアクセス制御を組み合わせることで、データ戦略の革新と簡素化が可能になります。フィードバックをお待ちしています!

翻訳はプロフェッショナルサービスの赤羽根が担当しました。原文はこちらです。