【Lake Formation】S3 Tables上のテーブルを使ったVIEWをクロスアカウント共有したかった
データ事業本部の川中子(かわなご)です。
LakeFormation管理下にあるS3 Tables上のネームスペースやテーブルについて、
公開範囲を制御しながら他アカウントに連携する方法について調べてみました。
S3 Tablesは公開からまだ日が浅いこともあり、機能に色々と制限があるため、
当初思い描いていた構成からは大きく乖離した結果となりました。
なお本記事の執筆においては主に以下のドキュメントを参照しています。
検証環境と前提
- アカウントA:データプロデューサー(S3 Tablesのデータを保有)
- アカウントB:データコンシューマー(データの共有を受ける)
- AWS Organizationは有効化されていない
- 両環境ともLakeFormationによりアクセス制御をしている
- 2アカウント環境間は同一リージョン(us-east-1)
- データへのアクセスにはAthenaを利用する
構成イメージ
最初にやろうとしたこと(ダメだった)
「S3 Tablesのテーブルを参照するVIEWだけを外部アカウントに見せたい」
最初にやろうとしたのはこちらの構成イメージでした。
しかし結論、以下の理由により実現不可でした。
- S3 Tablesのカタログ上ではVIEWは作れずエラーになる
- S3 Tables内のテーブルを参照するVIEWはリソースリンク経由での作成が必要
- リソースリンク内でもVIEWなどは作成不可のため、別のDB上にVIEWを作成する必要あり
S3 Tablesのカタログ上でVIEWを作成しようとすると、
クロスアカウントのリソースと認識されてしまいエラーになりました。
CREATE VIEW statements are not yet supported for Cross-Account Glue DataCatalogs.
上記の理由から次の構成を検討しました。
次にやろうとしたこと(これもダメだった)
「VIEW閲覧用のDBのみ外部アカウントに見せたい」
次に考えたのはこちらのイメージで、アカウントA側でVIEW閲覧用のDBを作成して、
そのDBだけを他アカウントへ共有するという方法です。
しかしこれも以下の理由により実現は不可でした。
- VIEWを閲覧する際には参照元リソース(S3 Tables)に対してもアクセス許可が必要
- VIEWの参照元のリソースリンクをさらに外部アカウントに共有できない
結局のところVIEWを使う場合は参照元のリソースへのアクセスが発生するため、
大元のリソース(S3 Tables)へのアクセスを許可してあげないといけないようです。
最終的な構成(これならできる)
「S3 Tablesのネームスペースへのアクセスを外部アカウントに許可する」
紆余曲折あり、最終的にはこの形に落ち着きました。
- アカウントA側でS3 TablesのネームスペースへのアクセスをアカウントBに許可する
- 共有されたネームスペースに対するリソースリンクをアカウントBで作成
- 作成したリソースリンクを参照して、別のDB上にVIEWを作成
上記構成を検証した際の流れを以降に記載したいと思います。
検証
アカウントAでのテーブル作成
まず、アカウントAのS3 Tablesカタログ上にテスト用のテーブルを作成します。
テーブルの定義は特に変えていません。
-- Aテーブル作成
CREATE TABLE tbl_view_test_a (
int_col int,
string_col string,
float_col float,
boolean_col boolean
)
TBLPROPERTIES (
'table_type'='iceberg',
'write_compression'='zstd'
)
-- Bテーブル作成
CREATE TABLE tbl_view_test_b (
int_col int,
string_col string,
float_col float,
boolean_col boolean
)
TBLPROPERTIES (
'table_type'='iceberg',
'write_compression'='zstd'
)
テーブル作成後、テストデータを投入しておきます。
-- Aテーブル
INSERT INTO tbl_view_test_a VALUES
( 1001, 'sample_data_1', CAST(3.14159 AS REAL), true),
( 1002, 'sample_data_2', CAST(2.71828 AS REAL), false),
( 1003, 'test_string_3', CAST(1.41421 AS REAL), true),
( 1004, 'example_text_4', CAST(1.73205 AS REAL), false),
( 1005, 'demo_value_5', CAST(2.23607 AS REAL), true);
-- Bテーブル
INSERT INTO tbl_view_test_b VALUES
( 1006, 'production_data_6', CAST(0.57722 AS REAL), false),
( 1007, 'analytics_sample_7', CAST(1.61803 AS REAL), true),
( 1008, 'metrics_value_8', CAST(2.30259 AS REAL), false),
( 1009, 'benchmark_test_9', CAST(0.69315 AS REAL), true),
( 1010, 'validation_data_10', CAST(1.09861 AS REAL), false);
Lake Formationでのリソース共有設定
次に、作成したテーブルをアカウントBと共有する設定をしていきます。
Lake FormationのData Permission管理画面のPrincipals設定にて、
External accountsを選択し、アカウントBのロールARNを指定します。
共有するS3 Tablesのテーブル tbl_view_test_a
を選択します。
Permissionは Select
、Describe
を選択します。
今回のようにロールを直接指定する場合は Grantable permissions
は選択できません。
アカウントBでのリソース共有承認
アカウントBのRAMの管理画面から、共有されたリソースを承認します。
対象のリソースページを開いて、リソース共有を承認
を押下すれば承認完了です。
リソースリンクの作成
アカウントBのLake Formationで、共有されたリソースに対するリソースリンクを作成していきます。
今回は Databases
のページから作成しています。
各種項目の設定は以下のとおりです。
- Resource link name:作成するリソースリンクの名前(任意)
- Destination catalog:作成先のカタログ(今回はアカウントBのカタログ)
- Shared database's region:作成元のリソースが属するリージョン
- Shared database:作成元のデータベース(ネームスペース)の名前
- Shared database's catalog ID:作成元のカタログID
VIEW作成と動作確認
リソースリンクから対象のテーブルが見れることが確認できました。
続けて、このテーブルをソースにしたVIEWを作ってみます。
リソースリンク上にはVIEWを作れないため、default
データベースにVIEWを作成します。
-- View Example
CREATE OR REPLACE VIEW default.active_records_view AS
SELECT
int_col,
string_col,
float_col,
boolean_col
FROM tbl_view_test_a
WHERE boolean_col = true;
VIEWが正常に作成され、データを参照できることを確認できました。
共有先でのアクセス制限について
先程は単一のロールに対してクロスアカウントアクセスを許可しましたが、
実際の運用ではアカウントB内で任意に許可を制御したいことが多いと思います。
アカウントAのクロスアカウントアクセス設定時に複数のロールを指定して、
アカウントBのLake Formationでのアクセス制限が可能か検証してみました。
Data lake administrators
に登録されているロールでリソースリンクを作成し、
Data Permissionでリソースリンクへの Describe
を他ロールに許可することで、
アカウントAから許可されているロールについてはアクセスが可能になることが分かりました。
ただもちろん、アカウントAから許可されていないロールに対して、
アカウントB内のリソースリンクへの Describe
を許可してもアクセスはできません。
アカウントBのLake Formationで制御できるのはリソースリンクへの Describe
のみのため、
アカウントB側で任意に細かい制御を行うことはできなさそうでした。
さいごに
S3 Tables上のテーブルを外部アカウントに共有する方法について検証してみました。
なんとかクロスアカウント先でVIEWを作成し、閲覧すること自体はできましたが、
共有元で許可したテーブルについては、許可されたロールが全員見れてしまうため、
特定のVIEWのみを見せる構成については少し難しい印象でした。
現状S3 Tables周りの機能はまだ開発中のものが多く、
公式ドキュメントにも適切な記載がない場合があるためご注意ください。
最後まで記事を閲覧頂きありがとうございました。
少しでも参考になれば幸いです。