SageMaker Unified Studio から S3 Metadata をクエリする

本記事は [**AWS Community Builders Advent Calendar 2024**](https://qiita.com/advent-calendar/2024/aws-community-builders) 16 日目の記事です。(大遅刻してすみません。。)

## はじめに
本記事では SageMaker Unified Studio から S3 メタデータへクエリする方法や代表的なクエリ例を紹介します。

:::note info
SageMaker Unified Studio や S3 Metadata、S3 Tables の AWS 分析サービスとの統合は 2024/12/25 時点で Preview として提供されています。将来的に動作や仕様が変更される可能性があります。
:::

## S3 Metadata とは
Amazon S3 Metadata は AWS re:Invent 2024 で発表された新機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/60615d42-5346-41dd-af07-b6a6499e51c4.png)

https://aws.amazon.com/jp/blogs/news/introducing-queryable-object-metadata-for-amazon-s3-buckets-preview/

S3 Metadata を有効化すると、S3 バケットにアップロードされたオブジェクトのメタデータが自動で取得され、S3 Tables に格納されます。これにより Athena や Redshift、EMR 上の Apache Spark などの Iceberg 互換のクエリエンジンからメタデータへアクセスできるようになります。

### S3 Metadata のユースケース
re:Invent 2024 のブレイクアウトセッション [STG212: What’s new with Amazon S3](https://www.youtube.com/watch?v=pbsIVmWqr2M) で次のような代表的なユースケースが紹介されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2f8c0ba0-07a3-8a02-a6e4-358a0b32926f.png)
[STG212: What’s new with Amazon S3](https://reinvent.awsevents.com/content/dam/reinvent/2024/slides/stg/STG212_Whats-new-with-Amazon-S3.pdf) より引用

* **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 分析サービスとの統合を有効にする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2adaf960-c60c-5f1c-bb0f-7891aca0eb84.png)

確認画面で「統合を有効にする」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6c334fc8-418c-15a3-04a0-a05b419a55ed.png)

統合が有効になったら「テーブルバケットを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/e8aefc3c-ebd0-051c-2b97-f52574bb21bc.png)

任意のテーブルバケット名を入力して作成を完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/afa0a2a9-ca44-4a7f-0c06-4a0d21f0e568.png)

### S3 Metadata を設定する
Metadata の収集対象となる任意の汎用バケットを作成します。既存の S3 バケットでも問題ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/15a0b848-eb4b-76dd-85ea-c541e7af4192.png)

メタデータ というタブが追加されているので「メタデータ設定を作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/5626d5ee-5562-ab7c-7630-3784783b3450.png)

送信先として先ほどのテーブルバケットを選択します。メタデータテーブル名は自動入力されますが、カスタマイズも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c5fb3ead-306d-f245-2277-fb16b0085b09.png)

以下のように表示されれば設定完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f81fa7d2-f7eb-336f-afec-1a7a2748859f.png)

テーブルバケットにもテーブルが作成されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/134db3e2-56c9-2e6c-b666-72b88320233f.png)

汎用バケットにいくつかのオブジェクトをアップロードしたり、削除したりしてメタデータ記録させておきましょう。

## SageMaker Unified Studio の操作
### SageMaker Unified Studio 環境の構築
ドメインの作成と Unified Studio へのログイン、プロジェクトの作成手順を以下の記事で紹介しています。そのため本記事では割愛します。

https://qiita.com/hayao_k/items/86522c13474bcb7cf32a

### カタログに対する権限設定
Lake Formation コンソールに新しく作成されている Catalogs というメニューに移動すると、`s3tablecatalog` という Federated カタログが作成されています。これは S3 Tables と AWS 分析サービスとの統合を有効化した際に作成されたものです。

:::note info
SageMaker Lakehouse で利用できるテクニカルカタログには Managed カタログと Federated カタログの 2 種類があります。既存のリソースを Lakehouse 経由で参照する際に Federated カタログが使用されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b5959dc1-8e36-330f-302a-06db3ade0467.png)

Unified Studio から S3 Metadata を参照するにはプロジェクトのプロジェクトロールに、S3 Tables の Federated カタログに対する権限を設定する必要があります。

:::note info
Amazon Redshift や EMR 等の AWS サービスから S3 Tables のリソースにアクセスするには、別途 Lake Formation でリソースリンクの作成が必要とドキュメントに記載されています。今回は Athena でクエリを行うため、Fedreated カタログに対し直接権限を割り当てます。
:::

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html#database-link-tables

> 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 タブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/7cf6cbee-7c2e-2302-4c55-945d013e3cc0.png)

デフォルトでカタログを作成した IAM に対する権限が与えられているはずです。Grant をクリックして権限を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ea0b2fbc-e08a-cc04-0158-a803e2fd52c3.png)

IAM users and roles で Unified Studio で作成したプロジェクトのプロジェクトロール (`datazone_usr_role_xxxxxxxxxxxxx_xxxxxxxxxxxxxx`) を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/078354c8-e8f5-078c-c77e-2d6350d37699.png)

対象のカタログリソースを明示的に指定します。Named Data Catalog resources を選択し、Catalogs で`<account-id>:s3tablecatalog` を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/456e824e-a2c3-42a4-6b68-9b6a1a2cc2f0.png)

Catalog permissions では Super user を選択して、権限を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/906483a1-e203-f5b5-c3fd-a930331cfc51.png)

## Lakehouse 経由で Athena からクエリを実行
SageMaker Unified Studio のプロジェクト → データを選択すると Lakehouse から s3tablecatalog が参照できるようになっているはずです。サブカタログ (テーブルバケット名) → aws_s3_metadata → メタデータテーブル名を選択するとテーブル定義等が確認できます。メタデータテーブルから Query with Athena をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/439d7f17-e5f7-1e89-95e9-923ea9d3eeff.png)

自動的に select 文が発行され、S3 Metadata の内容を取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/921eb67e-7281-e670-5a86-31a7e95c99d2.png)

:::note info
クエリは SageMaker Unified Studio プロジェクト作成時に自動作成された Athena Workgroup で実行されます
:::

冒頭のユースケース例に沿ったクエリをいくつか実行してみます。

### 特定のプレフィックスを持ったオブジェクトを抽出
```sql
-- 特定のプレフィックスを持ったオブジェクトを抽出
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%';
```

結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/fff85e0c-b2e7-88ef-1b20-dbf1577c6306.png)

### 削除オペレーションの抽出
```sql
-- 削除オペレーションの抽出
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';
    
```
結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0a61afd6-57d0-4d19-16f7-13f92cb64750.png)

### ストレージ使用量の算出
```sql
-- ストレージ使用量の算出
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;
```
結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/57efd647-1946-e7df-1360-e8e2cc50b738.png)

バケット名、オブジェクトキー、オブジェクトタグ、作成/更新時刻、ストレージクラス、暗号化ステータスなど、21 種類のシステムメタデータを活用できます。メタデータテーブルのスキーマは以下に記載されています。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-schema.html

## アセットの公開はできない？
プロジェクトやドメインの設定、データの公開、購読など DataZone のガバナンス機能が SageMaker Unified Studio の一部として統合されています。

S3 Meatadata をアセットとして公開し、別プロジェクトから購読するという一連のデータ共有についても試してみたかったのですが、結論から言うとできませんでした。

メタデータテーブルを選択し、アクションの一覧を表示すると 「Publisch to catalog」 (SageMaker Catalog への公開) がグレーアウトされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/9f665b26-f872-c54a-00a4-80eb5b570efe.png)

S3 Tables がアセットの公開をサポートしていないのか、権限回りの設定が不足しているのか不明だったため、こちらは引き続き調査したいと思います。

以上です。
参考になれば幸いです。