本記事は AWS Community Builders Advent Calendar 2024 16 日目の記事です。(大遅刻してすみません。。)
はじめに
本記事では SageMaker Unified Studio から S3 メタデータへクエリする方法や代表的なクエリ例を紹介します。
SageMaker Unified Studio や S3 Metadata、S3 Tables の AWS 分析サービスとの統合は 2024/12/25 時点で Preview として提供されています。将来的に動作や仕様が変更される可能性があります。
S3 Metadata とは
Amazon S3 Metadata は AWS re:Invent 2024 で発表された新機能です。
S3 Metadata を有効化すると、S3 バケットにアップロードされたオブジェクトのメタデータが自動で取得され、S3 Tables に格納されます。これにより Athena や Redshift、EMR 上の Apache Spark などの Iceberg 互換のクエリエンジンからメタデータへアクセスできるようになります。
S3 Metadata のユースケース
re:Invent 2024 のブレイクアウトセッション STG212: What’s new with Amazon S3 で次のような代表的なユースケースが紹介されていました。
STG212: What’s new with Amazon S3 より引用
-
Find objects to process
処理対象のオブジェクトを特定するために、例えばあるプレフィックスをもつオブジェクトの一覧を SQL で検索する。 (これ自体は S3 の List API でもできるが、SQL で柔軟にクエリできるメリットがある) -
Underdtand and track data lineage
オブジェクト情報のトラック: ファイルのアップロードや削除の操作のたびに時間やソースIPなどが記録され、その履歴を検索できるのでデータリネージ的な使い方もできる。 -
Learn abount storage usage
S3のストレージの使用状況について SQL で詳細に分析する。
これらを実際にクエリして試してみたいと思います。
S3 Metadata の設定
テーブルバケットの作成
S3 Metadata を格納するためのテーブルバケットを作成します。プレビュー開始時点でバージニア北部、オハイオ、オレゴンリージョンでのみ作成できます。
S3 コンソールのメニューからテーブルバケットに進みます。初回アクセス時のみ AWS 分析サービスとの統合を有効にする必要があります。
確認画面で「統合を有効にする」をクリックします。
統合が有効になったら「テーブルバケットを作成」をクリックします。
任意のテーブルバケット名を入力して作成を完了します。
S3 Metadata を設定する
Metadata の収集対象となる任意の汎用バケットを作成します。既存の S3 バケットでも問題ありません。
メタデータ というタブが追加されているので「メタデータ設定を作成」をクリックします。
送信先として先ほどのテーブルバケットを選択します。メタデータテーブル名は自動入力されますが、カスタマイズも可能です。
以下のように表示されれば設定完了です。
テーブルバケットにもテーブルが作成されていることがわかります。
汎用バケットにいくつかのオブジェクトをアップロードしたり、削除したりしてメタデータ記録させておきましょう。
SageMaker Unified Studio の操作
SageMaker Unified Studio 環境の構築
ドメインの作成と Unified Studio へのログイン、プロジェクトの作成手順を以下の記事で紹介しています。そのため本記事では割愛します。
カタログに対する権限設定
Lake Formation コンソールに新しく作成されている Catalogs というメニューに移動すると、s3tablecatalog
という Federated カタログが作成されています。これは S3 Tables と AWS 分析サービスとの統合を有効化した際に作成されたものです。
SageMaker Lakehouse で利用できるテクニカルカタログには Managed カタログと Federated カタログの 2 種類があります。既存のリソースを Lakehouse 経由で参照する際に Federated カタログが使用されます。
Unified Studio から S3 Metadata を参照するにはプロジェクトのプロジェクトロールに、S3 Tables の Federated カタログに対する権限を設定する必要があります。
Amazon Redshift や EMR 等の AWS サービスから S3 Tables のリソースにアクセスするには、別途 Lake Formation でリソースリンクの作成が必要とドキュメントに記載されています。今回は Athena でクエリを行うため、Fedreated カタログに対し直接権限を割り当てます。
To access your tables, some AWS analytics services need a resource link that targets your table's namespace.
After the AWS integration, you create resource links to work with your tables in the following services:
- Amazon Redshift
- Amazon Data Firehose
- Amazon EMR
カタログはテーブルバケット単位でサブカタログとして階層化されています。このサブカタログ単位で権限を追加していくこともできますが、ここではルートカタログ (s3tablecatalog) に対し追加します。
Permissions タブをクリックします。
デフォルトでカタログを作成した IAM に対する権限が与えられているはずです。Grant をクリックして権限を追加します。
IAM users and roles で Unified Studio で作成したプロジェクトのプロジェクトロール (datazone_usr_role_xxxxxxxxxxxxx_xxxxxxxxxxxxxx
) を選択します。
対象のカタログリソースを明示的に指定します。Named Data Catalog resources を選択し、Catalogs で<account-id>:s3tablecatalog
を選びます。
Catalog permissions では Super user を選択して、権限を追加します。
Lakehouse 経由で Athena からクエリを実行
SageMaker Unified Studio のプロジェクト → データを選択すると Lakehouse から s3tablecatalog が参照できるようになっているはずです。サブカタログ (テーブルバケット名) → aws_s3_metadata → メタデータテーブル名を選択するとテーブル定義等が確認できます。メタデータテーブルから Query with Athena をクリックします。
自動的に select 文が発行され、S3 Metadata の内容を取得できました。
クエリは SageMaker Unified Studio プロジェクト作成時に自動作成された Athena Workgroup で実行されます
冒頭のユースケース例に沿ったクエリをいくつか実行してみます。
特定のプレフィックスを持ったオブジェクトを抽出
-- 特定のプレフィックスを持ったオブジェクトを抽出
SELECT
bucket,
key,
storage_class
FROM
"s3tablescatalog/kosu-table-bucket-for-s3-metadata"."aws_s3_metadata"."s3metadata_kosu_bucket_for_s3_metadata_test"
WHERE
key LIKE '2024-12-25%';
削除オペレーションの抽出
-- 削除オペレーションの抽出
SELECT DISTINCT
bucket,
key,
record_type,
record_timestamp,
requester,
source_ip_address
FROM
"s3tablescatalog/kosu-table-bucket-for-s3-metadata"."aws_s3_metadata"."s3metadata_kosu_bucket_for_s3_metadata_test"
WHERE
record_type = 'DELETE';
ストレージ使用量の算出
-- ストレージ使用量の算出
SELECT
storage_class,
COUNT(*) AS count,
SUM(size) / 1024 / 1024 AS usage_mb
FROM
"s3tablescatalog/kosu-table-bucket-for-s3-metadata"."aws_s3_metadata"."s3metadata_kosu_bucket_for_s3_metadata_test"
WHERE
storage_class IS NOT NULL
GROUP BY
storage_class;
バケット名、オブジェクトキー、オブジェクトタグ、作成/更新時刻、ストレージクラス、暗号化ステータスなど、21 種類のシステムメタデータを活用できます。メタデータテーブルのスキーマは以下に記載されています。
アセットの公開はできない?
プロジェクトやドメインの設定、データの公開、購読など DataZone のガバナンス機能が SageMaker Unified Studio の一部として統合されています。
S3 Meatadata をアセットとして公開し、別プロジェクトから購読するという一連のデータ共有についても試してみたかったのですが、結論から言うとできませんでした。
メタデータテーブルを選択し、アクションの一覧を表示すると 「Publisch to catalog」 (SageMaker Catalog への公開) がグレーアウトされていることがわかります。
S3 Tables がアセットの公開をサポートしていないのか、権限回りの設定が不足しているのか不明だったため、こちらは引き続き調査したいと思います。
以上です。
参考になれば幸いです。