背景・目的
先日、Amazon S3 Annotationsが発表されました。
従来のS3メタデータ(user-defined metadata: 2KB、object tags: 10個)には容量・数の制約があり、リッチなコンテキストをオブジェクトに紐づけるには外部DBやサイドカーファイル(※)との同期が必要でした。
※サイドカーファイルとは
サイドカーファイルとは、メインのデータファイルとは別に、そのメタデータや付随情報を格納するために同じ場所に置くファイルのこと。例えば以下のような構成を指します。
s3://my-bucket/videos/movie-001.mp4 ← 本体
s3://my-bucket/videos/movie-001.mp4.meta.json ← サイドカーファイル(メタデータ)
この方式には下記のような課題がある
- 本体を削除してもサイドカーが残る(ゴミ化)
- 本体をコピー/レプリケーションしてもサイドカーは自動で付いてこない
- ファイル名のルールを自前で管理する必要がある
- 大量オブジェクトだと一覧取得・突合のコストが膨れる
まとめ
下記に特徴を記載します。
| 特徴 | 説明 |
|---|---|
| S3 Annotationsとは | S3オブジェクトに名前付きデータペイロード(JSON, XML, YAML等)を後からアタッチできる新しいメタデータ機能 |
| 何ができるか | オブジェクトの再アップロード不要で、作成・取得・一覧・削除が可能。 |
| オブジェクト数 | 最大1,000個(各最大1MiB、合計最大1GiB)のAnnotationをアタッチ・変更・削除が可能 |
| データ形式 | 任意UTF-8テキスト(JSON, XML, YAML, プレーンテキスト) |
| 主要API | PutObjectAnnotation GetObjectAnnotation ListObjectAnnotations DeleteObjectAnnotation |
| 特徴 | ・再アップロード不要 ・Glacierでもリストアなしで操作可能 ・コピー・レプリケーション時に自動伝播 ・S3 Metadata(Iceberg)連携でAthenaクエリ可能 |
| 既存メタデータとの違い | Object Tags(10個/128+256文字/IAM・ライフサイクル連携向き)に対し、Annotationsは大容量リッチコンテキスト向き |
概要
下記を基に整理します。
S3オブジェクトに名前付きデータペイロードをアタッチできる新しいメタデータ機能です。オブジェクトを再アップロードすることなく、後からAnnotationの作成・取得・一覧・削除が可能です。
1つのオブジェクトバージョンに最大1,000個のアノテーションを関連付けることができます。
各アノテーションには一意の名前が付けられ、AI生成ラベル、ドキュメントコンテキスト、処理結果、コンプライアンス記録などの構造化データを保存できます。
S3メタデータ構成の一部としてアノテーションテーブルを有効にすると、Athenaなどの分析サービスを使用してアノテーションデータを大規模にクエリできます。 S3 メタデータは、アノテーションデータをフルマネージド型の Apache Iceberg テーブルに保存し、Amazon S3 が自動的に最新の状態に維持します。
ユースケース
下記のようなユースケースがあります。
| 業界 | 活用例 |
|---|---|
| メディア | トランスクリプト、字幕、ライセンス情報、モデレーション結果 |
| 金融 | AI投資サマリー、センチメント分析 |
| ライフサイエンス | 臨床試験の規制ステータス、承認チェーン |
S3 Metadata連携(Annotation Table)
S3 Metadata設定でAnnotation Tableを有効化すると、AnnotationがApache Icebergテーブルに自動格納されます。これにより、Amazon Athena等のIceberg互換ツールでSQLクエリが可能になります。
各Annotationは text_value カラムにテキストとして格納されるため、スキーマ定義不要でそのまま検索できます。
既にAnnotationが付与されているオブジェクトについてはバックフィルが自動実行されます(数時間〜数日)。また、Journal Tableではほぼリアルタイムで変更を追跡できるため、イベント駆動のワークフロー構築にも活用できます。
S3 Metadata
S3 Metadataは、汎用バケット内のオブジェクトメタデータを自動的にキャプチャし、読み取り専用のフルマネージドApache Icebergテーブル(メタデータテーブル)に格納する機能。オブジェクトの追加・更新・削除に応じてテーブルが自動更新されます。
メタデータテーブルには以下の3種類があります。
- Journal Table — オブジェクトの変更イベント(追加・更新・削除)をほぼリアルタイムで記録
- Live Inventory Table — バケット内の全オブジェクトとその最新状態を保持するインベントリ
- Annotation Table — オブジェクトに付与されたAnnotationの最新状態を格納し、クエリ可能にする
コピー動作
-
CopyObjectAPI(5GiB未満): Annotationも一緒にコピーされる - マルチパートアップロードによるコピー: デフォルトではAnnotationはコピーされない- AWS CLIでは
--copy-props all指定でAnnotationもコピー可能 - マルチパートアップロード完了後に各Annotationが書き込まれる
レプリケーション
- S3 Replication設定済みバケットではAnnotationも自動的にレプリカへ複製される
- IAMロールに
s3:GetObjectVersionAnnotationForReplication権限が必要 - Annotationのみレプリケーションを防ぐには
s3:ReplicateObjectAnnotationをDenyに設定することで可能
イベント通知
以下のイベントタイプで通知可能。
-
s3:ObjectAnnotation:Put— Annotation作成・更新時 -
s3:ObjectAnnotation:Delete— Annotation削除時
暗号化
Annotationは親オブジェクトの暗号化設定を自動的に継承します(SSE-S3、SSE-KMS、DSSE-KMS対応)
ただし、下記は除く。
- SSE-C(顧客提供キー)のオブジェクトにはAnnotation付与不可(エラーを返す)
- 暗号化なしのオブジェクトにはSSE-S3がデフォルト適用される(バケットデフォルトではなく親オブジェクト基準)
ストレージクラスとの関係
Annotationの操作(Put/Get/List/Delete)は任意のストレージクラスのオブジェクトに対して可能です。S3 GlacierやDeep Archiveのオブジェクトでもリストア不要で操作できます。
ただし、Annotationストレージの課金は常にS3 Standard料金。
バージョニング動作
Annotationは特定のオブジェクトバージョンに紐づきます。オブジェクトやAnnotationの操作時の挙動は、バケットのバージョニング設定によって異なります。
| 操作 | 非バージョニングバケット | バージョニングバケット |
|---|---|---|
| オブジェクト作成(PutObject) | Annotationは同時設定不可(後付けのみ) | 同左 |
| オブジェクト削除(バージョンID未指定) | Annotationも削除 | Annotationは残存(オブジェクトにdelete markerのみ) |
| オブジェクト削除(バージョンID指定) | — | Annotationも削除 |
| オブジェクト上書き | Annotationも削除 | 旧バージョンのAnnotationは保持。新バージョンには引き継がれない |
| Annotation削除(DeleteObjectAnnotation) | 不可逆(復元不可) | 不可逆(復元不可) |
| Annotation上書き(同名でPut) | 前の値は消失(履歴なし) | 前の値は消失(履歴なし) |
補足:
- Annotationの追加・更新・削除は親オブジェクトのETagに影響しない
- Annotation自体にはバージョン管理の仕組みがないため、削除・上書きは常に不可逆
主要なAPI
| API | 説明 |
|---|---|
PutObjectAnnotation |
Annotationを作成または上書き |
GetObjectAnnotation |
名前指定でAnnotationペイロードを取得 |
ListObjectAnnotations |
オブジェクトのAnnotation一覧を取得(名前、サイズ、ETag、更新日) |
DeleteObjectAnnotation |
名前指定でAnnotationを削除(完全削除、復元不可) |
CopyObject |
デフォルトでAnnotationsもコピー(x-amz-annotation-directive: EXCLUDEで除外可) |
Annotation名の命名規則
以下のルールに従う必要があります:
- 1〜512バイト(UTF-8)
- 使用可能文字: Unicode文字、数字(0-9)、アンダースコア(
_)、ピリオド(.)、ハイフン(-) -
awsまたはs3で始まる名前は予約済み(大文字小文字問わず) - 空文字列・空白のみは不可
制限事項・注意点
-
PutObjectやマルチパートアップロードのリクエスト内ではAnnotation設定不可(後付けのみ) - ペイロードは有効なUTF-8テキストのみ(バイナリデータはBase64エンコード必須)
-
x-amz-object-if-matchヘッダで楽観的ロック可能(親オブジェクトのETagを検証) - 下記のサービス/機能ではAnnotationを認識・操作できない
- S3 Inventory Reports
- API Gateway
- S3 Storage Lens
- Amazon S3 File Gateway
- Amazon FSx
- S3 on Outposts
- S3 Express One Zone(Directory Buckets)
- Amazon S3 Files
考察
S3 Annotationsにより、オブジェクトとメタデータのライフサイクルを統一できるようになりました。
以前は、DynamoDBやサイドカーファイル等で管理していたメタデータは、コピー・レプリケーション・削除時に同期の仕組みを自前で構築する必要がありました。特に、生成したラベルをDynamoDBに書き戻す必要がなくなり、S3 Batch Operations + Lambdaで一括付与し、Athenaで横断検索する流れが完結する等、Annotationsはこの運用負荷を丸ごとS3に委譲できると思いました。
次回は、実際に動かして確認してみたいと思います。
参考