S3 MetadataとS3 Tables

非構造化データのメタデータ管理を簡素化してくれそうなアップデートがあったので、試してみる。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-s3-metadata-preview/

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-s3-tables-apache-iceberg-tables-analytics-workloads/

## 何者か
**S3 Metadata**はオブジェクト単位のメタデータを自動的に吸い上げる仕組み。従来の[インベントリ機能](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/storage-inventory.html)との違いは、システム定義のメタデータに加えてカスタムメタデータが付けられる点と、後述のS3 Tablesをターゲットとしてニアリアルタイムで更新してくれる点と思われる。

**S3 Tables**はマネージドIcebergテーブルとも呼ぶべきもので、テーブルバケットという新しいバケット上のIcebergテーブルで上記のメタデータを管理し、検索を可能にする仕組み。都度Glueテーブルを作る必要がなくなり、かつ自動的なメンテナンスで性能を維持してくれる模様。

と、今のところはざっくり理解しておくことにする。

## ステップバイステップ

### 1. テーブルバケットを作成

S3コンソールが新しくなり、テーブルバケットなるものが作れるようになっているので、まずはここからアクセス。
なお、現時点では限られたリージョンでしか利用できない点に注意。今回はバージニア北部（us-east-1）で操作している。

初回は「統合を有効にする」をクリックして、専用のデータカタログ（`s3tablescatalog`）を作成し、Lake Formationに登録する作業が必要。

> [2024/12/6追記] CLIでセットアップすることもできるようだが、2024年12月6日現在、[公式ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html?icmpid=docs_amazons3_console#table-integration-prerequisites)にバグがあり、記載の手順では有効化できないため注意。

![s3-meta-999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/e1f683fa-c285-d790-b8db-5e90ffcdd1d1.png)


![s3-meta-999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/bbc56383-0445-41c5-f4a0-65f101a6975a.png)

テーブルバケット名を入力して作成する。

![s3-meta-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/b5f044c1-ee70-e85b-545e-730a8523a2e8.png)

テーブルバケットができた。
メタデータテーブル自体はまだ作成されていない。

![s3-meta-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/e87c6c20-d2db-3460-bca8-76d5e5f0673e.png)

テーブルを作成するにはEMRが云々とあるが、次のステップでマネジメントコンソールから作成できるのでいったん無視する。

### 2. メタデータ設定を作成

次に、通常のバケットを作成し、「メタデータ」プロパティからメタデータ設定を作成する。

![s3-meta-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/3f2d08e3-ec53-86ba-6595-674ede32d990.png)

`送信先テーブルバケット`にはテーブルバケット名、`メタデータテーブル名`は特に支障なければ生成された値（当該の汎用バケット名から自動生成される）を使用する。

![s3-meta-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/cd4924ce-1d18-7911-9ec5-4a2c900458b0.png)

できた。

![s3-meta-2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/3fe153cf-efd1-d22b-5f54-084a28a22708.png)


テーブルバケットの方はこんな感じ。
他にもCLIやEMRなど複数の方法で作れるようだが、マネジメントコンソールから作れれば今回は充分。

![s3-meta-2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/5941487f-ed31-46ac-b34d-984a59da0752.png)

### 3. メタデータを検索してみる

まず、適当なファイルをアップロードしておく。
今回は、昨日出た[Bedrock LLM as a judge](https://aws.amazon.com/jp/blogs/aws/new-rag-evaluation-and-llm-as-a-judge-capabilities-in-amazon-bedrock/)の検証用に作成した評価用ファイルをいくつか投げ込んでみる。

![s3-meta-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/c5512aa9-9225-aaf8-4b66-dcf2f903db83.png)

次にAWS CLIを最新化し、`aws s3tables`コマンドでいろいろ試してみる。

```bash
> brew upgrade awscli
...
> aws --version
aws-cli/2.22.10 Python/3.12.7 Darwin/24.1.0 source/arm64
```

```bash:テーブルバケット情報
> aws s3tables get-table-bucket \
--table-bucket-arn arn:aws:s3tables:us-east-1:(省略):bucket/my-table-bucket-(省略)
{
    "arn": "arn:aws:s3tables:us-east-1:(省略):bucket/my-table-bucket-(省略)",
    "name": "my-table-bucket-(省略)",
    "ownerAccountId": "(省略)",
    "createdAt": "2024-12-04T01:23:26.102834+00:00"
}
```

```bash:テーブルバケットのメタデータ
> aws s3tables get-table-metadata-location \
--table-bucket-arn arn:aws:s3tables:us-east-1:(省略):bucket/my-table-bucket-(省略) \
--namespace aws_s3_metadata \
--name s3metadata_s3_metadata_test_(省略)
{
    "versionToken": "f711868a57d92610b21a",
    "metadataLocation": "s3://8669cd9f-71a3-4c60-m15(省略)tu8xkuse1b--table-s3/metadata/00001-da115e3f-0e54-492f-97fa-d6709847bf48.metadata.json",
    "warehouseLocation": "s3://8669cd9f-71a3-4c60-m15(省略)tu8xkuse1b--table-s3"
}
```

とりあえず何かあることはわかった。
ただ、`aws s3tables`コマンドを見渡した限りでは、メタデータ自体をクエリーするコマンドはなさそうである。
[公式](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)を見てみると、自動で`s3tablescatalog`なるカタログが同一リージョンのGlueデータカタログ内に作成される、とあるので、そっちに飛んでみる。

![s3-meta-3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/4794aac8-31dd-ca55-cd61-a2a87c487df5.png)

**まだ作成されてなかった。** しばらく待つしかなさそうだ。

ただ、Icebergテーブルと並んで、ここがS3テーブルバケット内のメタデータ分析の肝の一つと見られるので、今日のところは、カタログが自動作成されてS3テーブルがマッピングされるのを楽しみに待つこととしたい。

![s3-meta-3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/43b2d668-587f-b5ed-28ea-f06b81e7eb0b.png)
（出典：https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html ）

> [2024/12/6追記] 本来は、数十秒かからず完了するのが正しいらしい。自分のテーブルバケット設定には何らかの異常が発生しているらしく、ステータスが「不明」となっている（通常は「無効」または「有効」）ため作成されていない模様。
> ![s3-meta-888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/297e8c6c-1c27-45c4-c60a-871f56491a20.png)
> また、正常に作成された場合も、404エラーでAthena上ではまだクエリーできない。
![s3-meta-777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/1119f17e-b890-87b1-8717-80c550181036.png)
> まだプレビューということもあり、しばらく熟成を待った方が良さそうだ。

> [2024/12/16追記] 最近になって（前回更新からの10日間の間に）カタログの表示が変わり、データベースの方も表示されるようになった。
> ![スクリーンショット 2024-12-16 22.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/f35faf54-8bf3-fc7b-64d9-ee9457f6a494.png)
> 実はこの状態のままだとまだエラーになるのだが、Lake Formationで該当カタログとテーブルに権限をGrantすることで、ようやくAthenaクエリーが成功した。
> ![スクリーンショット 2024-12-16 22.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/da3f3d38-8548-d2a0-12a6-a3cea3876943.png)

## まとめ

S3 MetadataとS3 Tablesの挙動を（途中までだが）一通り触ってみた。
ディレクトリバケット、S3オブジェクトへのappendのサポートなど、最近のS3機能の拡張は、以前のような非機能面やコスト面の改善に留まらず、特定のユースケースを後押しするようなものが増えている気がする。

実際、非構造化データのメタデータを管理・検索・分析したい要件は一定程度ある。
今のところ一部機能はプレビューだが、いずれGAすれば、DataZoneあたりと連携してS3メタデータをデータアセットとして公開する、といった用途にも使えるのでは、という期待感がある。