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
次の図はアーキテクチャを示しています。
前提条件
以下の前提条件を確認してください。
- 2 つの AWS アカウント。1 つはプロデューサー、もう 1 つはコンシューマーとなります。
- AWS Lake Formation について理解していること、および Lake Formation の管理者を務めることができるユーザー
- S3 バケット、AWS Glue データカタログ、AWS Resource Access Manager を作成したり、Amazon Athena を使用して SQL クエリを実行したりする権限を持つ AWS Identity and Access Management (IAM) ロール (参考までにIAM ID のアクセス許可の追加および削除を参照してください)
- Athena エンジンバージョン 3 を設定したワークグループ。このブログの primary ワークグループでは、Athena エンジンバージョン 3 を使用しています。
データプロデューサーセットアップ
このセクションでは、データプロデューサーを設定する手順を示します。
テーブルデータを保存する S3 バケットを作成する
テーブルのデータを保存する新しい S3 バケットを作成します。
- Amazon S3 コンソールで、一意の名前の S3 バケットを作成します (この記事では
iceberg-athena-lakeformation-blog
を使用しています)。 - テーブルに使用する producer フォルダーをバケット内に作成します。
Lake Formationを使用してテーブルを格納するS3パスを登録する
S3パスを Lake Formation に登録します。
- Lake Formation コンソールに移動します。
- 初めてログインする場合、管理者ユーザーを作成するように求められます。
- ナビゲーションペインの Register and ingest で、 Data lake locations を選択します。
- Register location を選択し、作成した S3 バケットのパスを入力します。
- IAM ロールには、
AWSServiceRoleForLakeFormationDataAccess
を選択します。
ロールの詳細については、ロケーションの登録に使用されるロールの要件を参照してください。
S3 バケットの暗号化を有効にした場合は、Lake Formation に暗号化と復号化の操作を実行する権限を与える必要があります。ガイダンスについては、暗号化された Amazon S3 ロケーションの登録を参照してください。
- Register location を選択します。
Athena を使用して Iceberg テーブルを作成する
それでは、Apache Iceberg フォーマットのテーブルを Athena を使用して作成してみましょう。
- Athena コンソールのナビゲーションペインで Query editor (クエリエディタ) を選択します。
- Athena を初めて使用する場合は、 Settings (設定)で Manage (管理)を選択し、以前に作成した S3 バケットの場所 (
iceberg-athena-lakeformation-blog/producer
) を入力します。 - Save (保存) を選択します。
- クエリエディターで、次のクエリを入力します ( 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')
- Run (実行)を選択します。
テーブルをコンシューマーアカウントと共有する
機能を説明するために、以下のシナリオを進めます。
- 選択した列へのアクセスを提供する
- フィルターに基づいて選択した行へのアクセスを提供する
次の手順を実行してください。
- Lake Formation コンソールのナビゲーションペインの Data catalog で、 Data filters を選択します。
- Create new filter を選択します。
- Data filter name には、
blog_data_filter
と入力します。 - Target database には、
lf-demo-db
と入力します。 - Target table には、
consumer_iceberg
と入力します。 - Column-level access には、 Include columns を選択します。
- コンシューマーと共有する列(
country
、address
、contactfirstname
、city
、customerid
、customername
)を選択します。 - Row filter expression には、
Country='France'
というフィルターを入力します。 - Create filter を選択します。
それでは、 consumer_iceberg
テーブルのコンシューマーアカウントへのアクセス権を付与しましょう。
- ナビゲーションペインで Tables を選択します。
- consumer_iceberg テーブルを選択し、 Actions メニューで Grant を選択します。
- External accounts を選択します。
- 外部アカウントIDを入力します。
- Named data catalog resources を選択します。
- データベースとテーブルを選択します。
- Data filters では、作成したデータフィルターを選択します。
- Data filter permissions と Grantable permissions で Select を選択します。
- Grant を選択します。
データコンシューマーセットアップ
データコンシューマーを設定するには、AWS RAM と Lake Formation を使用してリソース共有を受け入れ、テーブルを作成します。次の手順を実行してください。
- コンシューマーアカウントにログインし、AWS RAM コンソールに移動します。
- ナビゲーションペインの Shared with me (自分と共有)で、 Resource shares (リソースの共有)を選択します。
- 共有されるリソースを選択してください。
- Accept resource share (リソースの共有を承認)を選択します。
- 次のステップで使用するリソース共有の名前をメモしておきます。
- Lake Formation コンソールに移動します。
- 初めてログインする場合、管理者ユーザーを作成するように求められます。
- ナビゲーションペインで Tables を選択し、Create table を選択します。
- Actions メニューで Create resource link を選択します。
- Resource link name に、リソースリンクの名前 (たとえば、
consumer_iceberg
) を入力します。 - データベースと共有テーブルを選択してください。
- Create を選択します。
ソリューションを検証
これで、テーブルに対してさまざまな操作を実行して、細粒度のアクセス制御を検証できます。
Insert 操作
プロデューサーアカウントの consumer_iceberg
テーブルにデータを挿入し、データフィルタリングがコンシューマーアカウントで期待どおりに機能することを検証してみましょう。
- プロデューサーアカウントにログインします。
- Athena コンソールのナビゲーションペインで Query editor (クエリエディタ)を選択します。
- 次の 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');
- 次の SQL を使用して、Iceberg テーブル内のデータを表示します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;
- コンシューマーアカウントにログインします。
- Athena クエリエディターで、共有テーブルに次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;
フィルターに基づいて、コンシューマーは contry が France の列と行のサブセットが表示されます。
Update / Delete 操作
次に、コンシューマーに共有しているデータセットの1つの行の更新と1つの行の削除を行いましょう。
- プロデューサーアカウントにログインします。
city='Paris' WHERE city='Reims'
で更新し、customerid = 3;
で行を削除します。
UPDATE consumer_iceberg SET city= 'Paris' WHERE city= 'Reims' ;
DELETE FROM consumer_iceberg WHERE customerid =3;
- 更新および削除されたデータセットを確認します。
SELECT * FROM consumer_iceberg;
- コンシューマーアカウントにログインします。
- Athena クエリエディターで、共有テーブルで次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;
1行だけが表示され、cityはParisに更新されていることがわかります。
スキーマの更新:新しい列の追加
コンシューマと共有しているデータセットにカラムの追加と行の挿入を行いましょう。
- プロデューサーアカウントにログインします。
- 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 データフィルターを更新する必要があります。
- Lake Formation コンソールのナビゲーションペインで Data filters を選択します。
- データフィルターを選択し、 Edit を選択します。
- Column-level access に、新しい列 (
geo_loc
) を追加します。 - Save を選択します。
- コンシューマーアカウントにログインします。
- Athena クエリエディターで、共有テーブルに対して次の
SELECT
クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;
スキーマの更新:列の削除
コンシューマと共有しているデータセットにカラムの削除を行いましょう。
- プロデューサーアカウントにログインします。
- Iceberg テーブルから address 列を削除します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
ALTER TABLE consumer_iceberg DROP COLUMN address;
SELECT * FROM consumer_iceberg;
- コンシューマーアカウントにログインします。
- Athena クエリエディターで、共有テーブルに対して次の SELECT クエリを実行します。
SELECT * FROM "lf-demo-db"."consumer_iceberg" limit 10;
タイムトラベル
Iceberg テーブルを複数回変更しました。Iceberg テーブルはスナップショットをトラックします。次の手順を実行して、タイムトラベル機能を試してみてください。
- プロデューサーアカウントにログインします。
- システムテーブルをクエリします。
SELECT * FROM "lf-demo-db"."consumer_iceberg$snapshots" limit 10;
複数のスナップショットが生成されていることがわかります。
- 次のステップで使用する
committed_at
値の 1 つを書き留めておきます (この例では、2023-01-29 21:35:02.176 UTC
)。
- タイムトラベルを使ってテーブルのスナップショットを参照します。クエリエディタを使用して、一度に 1 つのクエリを実行します。一度に 1 つのクエリを強調表示/選択して、実行/もう一度実行する をクリックできます。
SELECT * FROM consumer_iceberg FOR TIMESTAMP
AS OF TIMESTAMP '2023-01-29 21:35:02.176 UTC';
クリーンアップ
請求が発生しないように、次の手順を実行してください。
- Amazon S3 コンソールで、データが格納されているバケットを削除します (この投稿では
iceberg-athena-lakeformation-blog
)。 - Athena コンソールのプロデューサーアカウントで、次のコマンドを実行して、作成したテーブルを削除します。
DROP TABLE "lf-demo-db"."consumer_iceberg";
DROP DATABASE lf-demo-db;
- Lake Formation コンソールのプロデューサーアカウントで、コンシューマーアカウントへの権限を削除します。
- Athena のクエリ結果ロケーションに使用されているコンシューマーアカウントの S3 バケットを削除します。
結論
Iceberg などのフォーマットに対してクロスアカウントの細粒度のアクセス制御ポリシーがサポートされているため、Athena がサポートするどのフォーマットでも柔軟に対応できます。S3 データレイク内のデータに対して CRUD 操作を実行できる機能と、Athena がサポートするすべてのテーブルとフォーマットに対する Lake Formation の細粒度のアクセス制御を組み合わせることで、データ戦略の革新と簡素化が可能になります。フィードバックをお待ちしています!
翻訳はプロフェッショナルサービスの赤羽根が担当しました。原文はこちらです。