← AWSサービスの内部原理 コース
27. S3はファイルシステムではない — キーとフラットな名前空間
S3はフォルダのある「ファイルシステム」ではなく、キー1本でオブジェクトを引き当てるフラットなキーバリューマップである — その原理を6つの図で追います。
① S3の実体は巨大なキーバリューマップ
バケットオブジェクトの入れ物
キーバケット内で一意の文字列
バージョンID(任意)
この組で引き当てる(KVルックアップ)
オブジェクト階層をたどらず直接届く
同じ発想
DynamoDBパーティションキーのハッシュでノードを選ぶ
- 汎用バケット(general purpose bucket)にはディレクトリ木が存在しない
- 例外:ディレクトリバケット(S3 Express One Zone)はプレフィックスを実際の階層として扱う。本レッスンの対象外
コンソールではフォルダに見えるが、S3(汎用バケット)の実体は「バケット+キー(+バージョンID)→オブジェクト」を引くKVストア。ディレクトリの階層構造はどこにも存在しない。
② 「フォルダ」の正体は1本の平坦な文字列
ファイルシステムphotos → 2006 → January → sample.jpg
ディレクトリごとにiノードがあり木構造をたどるS3にはこの木が無い
S3のキー"photos/2006/January/sample.jpg"
30文字ぶんの平坦な1本の文字列- photos/ も 2006/ も独立したフォルダオブジェクトではなく、キー文字列の一部分
- 公式も「スラッシュに特別なところはなく、非常によく使われる区切り文字にすぎない」と明言
photos/2006/January/sample.jpg は4階層の構造データではなく、スラッシュを含む30文字の1本の文字列。スラッシュはただの文字で、S3にとって特別な意味を持たない。
③ Prefix+Delimiterがフラットな集合を階層に「見せる」
sample.jpg
photos/2006/January/sample.jpg
photos/2006/February/sample2.jpg
List(Delimiter='/')
sample.jpg区切り文字なし → そのまま返る
photos/CommonPrefixes に集約
UIでは1個のフォルダに見えるPrefix='photos/2006/' + Delimiter='/' で1階層下へ
February/CommonPrefixes
January/CommonPrefixes
- S3は該当プレフィックスで始まるキーを走査し、区切り文字の手前までを共通接頭辞としてまとめているだけ
Delimiter='/' でリストすると、区切り文字を含むキー群は CommonPrefixes に畳み込まれて返る。UIのフォルダはこの畳み込み結果であって、ディレクトリを開いてはいない。
④ リスト走査の2つの性質 — UTF-8順とページング
バケット内の全キー実質無制限・UTF-8バイナリ順に整列
List(1回)
最大1000キー+ IsTruncated(続きあり?)
続きがある限り繰り返す
次のページ…全件取得まで反復
DynamoDB Query1MB単位ページング・ソートキー順走査と同じ発想
- 辞書順ゆえに「qで始まるキーだけ」のような接頭辞での範囲切り出しができる
- 個々のキーへのアクセスは強整合(2020年12月以降):新規PUT・上書きPUT・DELETEは直後の読み取り・リストに反映
- ただしキー単位のアトミック性のみ(同時書き込みは last-writer-wins)。複数キーをまたぐアトミック更新は不可
結果は常にUTF-8バイナリ順(辞書順)なので接頭辞で範囲を切り出せる。キー数は実質無制限のため、1応答は最大1000キーで、IsTruncated を見ながらページを繰り返し取得する。
⑤ フォルダ「リネーム」が一瞬で終わらない理由
ファイルシステムディレクトリのポインタを1つ書き換え → 一瞬で完了
S3は根本から違う
photos/2006/ で始まる全キー…/January/sample.jpg など
1本ずつ 新キー名でコピー + 旧キー削除
photos/old/ の全キーオブジェクト数に比例した時間とコスト
リネームすべきフォルダという実体がそもそも無いので、該当プレフィックスの全キーを1本ずつコピー+削除するしかない。時間もコストもオブジェクト数に比例する。
⑥ 性能もキーで決まる — プレフィックス単位のスケール
キー文字列リクエストの振り分けの手がかり
プレフィックスで内部パーティションへ振り分け
プレフィックスA毎秒3500 PUT/COPY/POST/DELETE・5500 GET/HEAD
プレフィックスB分ければ水平にスケール
同じ現象の別の現れ
DynamoDBのホットパーティション特定キーに負荷集中 → スループット頭打ち
- 数値は汎用バケットのプレフィックスあたりの性能特性
リクエストはキー文字列を通じて内部パーティションへ振り分けられるため、性能はプレフィックス単位で語られる。キーの設計がそのまま分散のされ方を決める、KVストア共通の原理。