---
title: "オブジェクトストレージとは？仕組み・S3互換APIの範囲とブロックとの違いを実装手順つきで解説"
url: "https://www.issoh.co.jp/tech/details/13369/"
published: 2026-07-09
updated: 2026-09-10
categories: ["インフラ・クラウド"]
publisher: "株式会社一創"
---

# オブジェクトストレージとは？仕組み・S3互換APIの範囲とブロックとの違いを実装手順つきで解説

オブジェクトストレージは、データをディレクトリの階層ではなく「オブジェクト」という単位で平置きにし、一意IDとメタデータで直接引き当てる保存方式です。Amazon S3が2006年に登場して以降、クラウドの標準的なデータ置き場になりました。オブジェクトストレージを含むクラウドへの保管全体の位置づけは[クラウドストレージとは？仕組み・3つの種類とオンプレとの違いを実装目線で解説](https://www.issoh.co.jp/tech/details/15270/)で整理しています。この記事では、メタデータと一意IDによる仕組み、ブロックストレージ・ファイルストレージとの違いと使い分け、S3互換APIをboto3やaws-cliから扱う実装観点、ストレージクラスとエグレス課金を踏まえたコスト設計、そして「どんなワークロードで採用し、どこで見送るか」の判断基準までを、実装・運用する立場から整理します。数値は公式ドキュメントを引き当てて確認し、コピーして動かせるコード例も置きました。

## まとめ｜オブジェクトストレージの採否が向く場面と設計判断の要点

オブジェクトストレージは、画像・動画・ログ・バックアップ・データレイクのように「書いたら滅多に上書きしない大量データ」を、ほぼ無制限のスケールと11ナイン級の耐久性で安く貯めるための方式です。HTTPベースのS3 APIでアクセスし、ファイルシステムのようなディレクトリツリーやランダム部分更新は持ちません。

採用が向くのは、静的コンテンツ配信、システムのバックアップ保管、分析用の生データ蓄積（データレイク）、S3互換SDKで完結するアプリのファイル保管です。逆に、データベースの実体ファイルやOSのブートボリューム、頻繁に一部だけ書き換えるファイルには不向きで、その用途はブロックストレージやファイルストレージが担います。判断で外せないのは、オブジェクト数の設計（小さすぎるオブジェクトの大量生成を避ける）と、エグレス（データ転送量）課金を含めた総コストの見積もりです。

実装に入る前に3つだけ先に押さえてください。1つ目は、クラスごとの**最小保存期間と最小課金サイズ**で、STANDARD\_IAは30日・128KBが下限になり、これを下回る使い方では単価が安いクラスのほうが高くつきます。2つ目は**S3互換の範囲**で、基本操作と署名方式は揃っていても、バケットのバージョニングやオブジェクトタグが未実装のサービスもあるため、確認が必要です。3つ目は**オブジェクトの上限**で、単一PUTは5GBまで、マルチパートを使って48.8TiBまでという線引きになっています。以下、仕組みから実装・コスト・採否の順で具体化します。

## オブジェクトをメタデータと一意IDで管理する仕組みとフラット構造

まず、なぜオブジェクトストレージが大量データに強く、一方で部分更新に弱いのかを、内部の持ち方から押さえます。ここが3方式の違いと実装制約の土台になります。

### データ本体・メタデータ・一意IDの3点で構成するオブジェクトの中身

1つのオブジェクトは、実データ（画像や動画などのバイト列）、そのオブジェクトを説明するメタデータ、そして一意なキー（ID）の組で成り立ちます。メタデータにはContent-Typeや作成日時といったシステム項目に加え、アプリが独自に付けるユーザー定義メタデータも扱えるのが特徴です。ファイルシステムがinodeとディレクトリエントリでファイルを辿るのに対し、オブジェクトストレージはキーを指定すれば階層を辿らず一発で対象へ到達します。この「平置き＋キー引き」が、格納数が億単位に増えても検索コストが跳ね上がらない理由です。

ユーザー定義メタデータには容量の上限があり、AWSの[オブジェクトのアップロード手順（公式ドキュメント）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)では合計2KBまでと明記されています。撮影日時や取り込みバッチIDのような数十バイトの札を貼る用途には足りますが、抽出済みのテキストや構造化された属性をここへ詰めるとすぐに溢れます。検索したい属性はメタデータではなく、別のデータストアに索引として持たせる設計が安全です。

### バケットとキー設計、ディレクトリに見えるプレフィックスの実体

オブジェクトはバケットと呼ぶ入れ物に格納し、バケット内で一意なキーを付けます。「logs/2026/07/app.log」のようなキーはフォルダに見えますが、実体はスラッシュを含む1本のキー文字列で、物理的な階層ディレクトリは存在しません。この区切り文字より前の部分をプレフィックスと呼び、一覧取得（ListObjects）でプレフィックス絞り込みや擬似的な「フォルダ表示」を実現します。キー設計は性能とコストに直結し、日付やハッシュを先頭に置いて分散させる設計が定番です。ストレージ全体の種類とHDD/SSDの選定を含む前提知識は、[ストレージとは何かを種類・違いから整理した解説](https://www.issoh.co.jp/column/details/13333/)で補完できます。

### 汎用・ディレクトリ・テーブル・ベクトルという4つのバケット種別

「バケットは1種類」という前提は、現行のS3では成り立ちません。AWSの[Amazon S3の概要（公式ドキュメント）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)は、汎用バケット（general purpose）・ディレクトリバケット（directory）・テーブルバケット（table）・ベクトルバケット（vector）の4種別を挙げています。既定で選ぶのは汎用バケットで、これが従来からの平置き構造です。

実装上とくに注意したいのがディレクトリバケットで、こちらは平置きではなく**階層ディレクトリ（プレフィックス）でオブジェクトを組織化**し、プレフィックス数の上限を持ちません。単一アベイラビリティゾーンに置いてS3 Express One Zoneクラスを使う低レイテンシ用途向けで、既定の作成上限は1アカウント100個です。テーブルバケットはApache Iceberg形式の表データ向けで、既定で1アカウント1リージョンあたり10個・1バケット10,000テーブルという枠が示されています（この用途は[Amazon S3 Tablesの概要と基本概念](https://www.issoh.co.jp/tech/details/5405/)で扱いました）。ベクトルバケットは埋め込みベクトルの格納と類似検索に特化した種別です。「オブジェクトストレージ＝完全な平置き」は汎用バケットの話であって、種別によって前提が変わると覚えておくと、設計時の食い違いを避けられます。

### 結果整合性から強い整合性へ、S3が2020年に変えたアクセス保証

オブジェクトストレージは複数ノードにデータを分散・複製して耐久性を確保します。この複製の都合で、かつてのS3は「書き込み直後の読み取りで古い版が返りうる」結果整合性の性質を持っていました。Amazon S3は2020年12月に、新規書き込み・上書き・削除いずれもread-after-writeで強い整合性を返す仕様へ移行しています（時点：2020年末以降のS3）。現行の公式ドキュメントも、PUTとDELETEに対する強い整合性が全リージョンで適用され、成功したPUTの後に開始した読み取り（GETとLISTのいずれも）はそのデータを返すと記しています。

一方で、同じドキュメントは**バケットの設定変更は結果整合性モデル**だと明示しており、バージョニングを初めて有効化した直後は変更の伝播に時間がかかるため、オブジェクトへの書き込みを始める前に15分ほど待つよう推奨しています。「オブジェクトは強い整合性、バケット設定は結果整合性」という非対称は、バケットを作ってすぐ設定を入れ、その直後から書き込むIaCやセットアップスクリプトで踏みやすい落とし穴です。加えて同時書き込みのロックは提供されないため、同一キーへの並行PUTはタイムスタンプの新しい側が残ります。排他が要るなら、条件付き書き込み（conditional write）を使うか、アプリ側でロック機構を作ってください。

なお、これらはAWSのS3の保証であり、S3互換をうたう他サービスやセルフホスト実装では整合性モデルが異なる場合があります。移植を前提にするなら、各サービスの整合性ドキュメントを個別に確認しましょう。データの多重化・冗長構成そのものの考え方は[冗長化の種類と設計判断の解説](https://www.issoh.co.jp/column/details/13356/)が参考になります。

### 単一PUTは5GBまで、48.8TiBの上限に届かせる分割の考え方

オブジェクト1個のサイズ上限は、以前よく引用された「5TB」から引き上げられています。現行の[マルチパートアップロードの上限一覧（公式ドキュメント）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html)では、最大オブジェクトサイズは**48.8 TiB**、1回のアップロードで使えるパート数は最大10,000、パートサイズは5MiB〜5GiB（最終パートのみ下限なし）と定義されています。アップロード方式ごとの上限も分かれており、単一PUTは5GBまで、マネジメントコンソール経由は160GBまで、マルチパート経由なら最大50TBまでという整理です（時点：2026年9月時点の公式ドキュメント）。5TBを超えるオブジェクトを扱うときは、SDKのS3 Transfer Manager（AWS CRT対応版）を使うよう案内されています。

実装で決めるべきは「どこから分割するか」です。公式は100MB以上でマルチパートへ切り替えることを推奨しています。パート番号は1から10,000の範囲で、同じ番号へ再アップロードすると前のパートが置き換わる点に注意してください。さらに、開始したまま完了も中止もしていないマルチパートアップロードは、パートの保管料が課金され続けます。ライフサイクルルールの`AbortIncompleteMultipartUpload`で自動的に掃除する設定を、バケット作成と同時に入れておくのが安全です。

## ブロック・ファイルストレージとの違いと向くワークロードの見極め

オブジェクトストレージの採否は、単独では決まりません。ブロック・ファイルの2方式と役割分担で捉えると、どのデータをどこに置くかが定まります。「ブロックストレージとの違い」もここで扱います。

### アクセス単位・整合性・レイテンシで見る3ストレージ方式の比較

3方式はアクセスの単位が根本的に異なります。ブロックは固定長ブロック、ファイルはファイル＋ディレクトリ、オブジェクトはオブジェクト単位です。実装で効いてくる差を整理します。

| 観点       | ブロックストレージ        | ファイルストレージ   | オブジェクトストレージ       |
| -------- | ---------------- | ----------- | ----------------- |
| アクセス単位   | ブロック（部分更新可）      | ファイル（POSIX） | オブジェクト（原則全体差し替え）  |
| インターフェース | iSCSI / ローカルデバイス | NFS / SMB   | HTTP（S3 REST API） |
| レイテンシ    | 低（μs〜ms）         | 中           | 相対的に高（ms〜）        |
| スケール上限   | ボリューム単位で有限       | 中規模         | 実質無制限（EB級）        |
| 代表用途     | DB・VMのディスク       | 共有フォルダ      | バックアップ・配信・データレイク  |

要点は、オブジェクトが「全体差し替え」前提である点です。1バイトだけ書き換えたい用途では、オブジェクト全体をPUTし直すコストが発生します。低レイテンシの部分更新が要るならブロック、POSIXのファイルロックや共有マウントが要るならファイルが選択の対象です。AWSの中でこの三択を突き合わせたい場合は、[AWS EFSとS3・EBS・FSxの違いを整理した解説](https://www.issoh.co.jp/tech/details/3418/)が、同一クラウド内の対応サービス単位での比較になります。

### 大量データ・追記型に向き、頻繁な部分更新に向かない適性の線引き

向くワークロードは、生成後に内容がほぼ変わらない大量データです。具体的には、Webの画像・動画・PDFの配信元、システムのフルバックアップやアーカイブ、IoTやアプリのログ、分析基盤の[生データを貯めるデータレイク](https://www.issoh.co.jp/tech/details/13388/)が該当します。  
向かないのは、リレーショナルデータベースの実体ファイル、OSのブートボリューム、同一ファイルを秒間何度も部分書き換えする処理です。ここに無理にオブジェクトストレージを充てると、レイテンシと再PUTコストで破綻します。用途が「貯める・配る」か「頻繁に更新する」かで最初に振り分けるのが実務の近道でしょう。

## 主要サービスとS3互換API・ストレージクラスによるコスト設計

ここからは実装と運用の話です。オブジェクトストレージは事実上S3 APIが共通言語になっており、SDKの書き方とコスト構造を押さえれば、サービスを跨いだ設計ができます。

### Amazon S3を軸に広がる主要サービスとS3互換の勢力図

代表格はAmazon S3で、Google Cloud Storage、Azure Blob Storageが各クラウドの対応サービスです。S3そのものの仕組みと料金体系は[Amazon S3とは？オブジェクトストレージの仕組み・ストレージクラスと料金・採用判断](https://www.issoh.co.jp/tech/details/15433/)で一段深く扱っており、本記事の代表実装として読み合わせると理解が早くなります。Azure側の仕組みやアクセス層・冗長性の設計は[Azure Blob Storageとはを実装者目線で解説した記事](https://www.issoh.co.jp/tech/details/15521/)で確認できます。

クラス構成はサービスごとに更新が入るため、選定時は必ず公式の一覧で数を確かめてください。Google Cloud Storageは[ストレージクラスの公式一覧](https://docs.cloud.google.com/storage/docs/storage-classes)で、Rapid・Standard・Nearline（30日）・Coldline（90日）・Archive（365日）の5クラスが示されています（時点：2026年9月）。Azure Blob Storageは[アクセス層の公式概要](https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-overview)で、Hot・Cool（30日）・Cold（90日）・Archive（180日）に加えて自動階層化のSmart tierが載っており、Archiveから読み出すには最大15時間のリハイドレートが必要と明記されています。GCP側の詳細は[Cloud Storage（GCS）の仕組みとS3との違いの解説](https://www.issoh.co.jp/tech/details/15663/)も併せて見ると差分が掴めます。

これらとは別に「S3互換」を掲げるサービス群があります。エグレス無料を武器にするCloudflare R2や、低コストと転送無料を打ち出すWasabiがその代表格です。[エグレス無料のS3互換ストレージであるCloudflare R2の解説](https://www.issoh.co.jp/tech/details/7455/)や、[料金とセキュリティからWasabiを整理した記事](https://www.issoh.co.jp/tech/details/8791/)は、AWS以外の選択肢を検討する際の比較材料になります。セルフホストならMinIOやCeph（RADOS Gateway）でオンプレミスにS3互換のエンドポイントを立てられますが、MinIOは前提が変わりました。[MinIOの公式リポジトリ](https://github.com/minio/minio)は2026年4月にアーカイブされ、冒頭に「THIS REPOSITORY IS NO LONGER MAINTAINED」と掲げられています。コミュニティ版はソースコード配布のみ（AGPLv3）となり、ビルド済みバイナリの提供は終了、後継としてAIStorのFree／Enterpriseが案内されている状態です（時点：2026年9月）。

### ストレージクラスとライフサイクル、エグレス課金を含む総コスト設計

コストは「保管容量」「リクエスト回数」「データ転送（エグレス）」の3要素で決まり、どれかだけを見ると読み違えます。S3にはアクセス頻度に応じたストレージクラスがあり、頻繁に読むStandard、たまに読むStandard-IA、自動階層化のIntelligent-Tiering、長期退避向けのGlacier系（Instant Retrieval／Flexible Retrieval／Deep Archive）が用意されています。ライフサイクルルールで「90日を過ぎたらIAへ、365日でGlacierへ」と自動移行させ、保管単価を段階的に下げるのが定石です。退避先となるGlacier系クラスの取り出し時間や料金の詳細は、[Amazon S3 Glacierとはの記事](https://www.issoh.co.jp/tech/details/15443/)で確認できます。東京リージョンの単価を積み上げた実額の計算例は[S3の料金を実額で計算する記事](https://www.issoh.co.jp/tech/details/17537/)にまとめました。

見落としやすいのがエグレス課金です。AWSやGCPはインターネットへのデータ転送量に対して課金するため、CDN経由の大量配信や頻繁な全件ダウンロードがあると、保管費より転送費が膨らみます。ここが、エグレス無料のR2やWasabiが検討される最大の理由でしょう。Cloudflareの[R2の料金ページ](https://developers.cloudflare.com/r2/pricing/)では、Standardが1GB-月あたり0.015ドル、Infrequent Accessが0.01ドル、Class A操作が100万リクエストあたり4.50ドル、Class B操作が0.36ドル、そしてエグレスは「Free」と明示されています（無料枠はStandardで10GB-月／Class A 100万・Class B 1,000万リクエスト。時点：2026年9月）。配信量が読めるなら、保管単価だけでなく「月間の転送量×単価」を必ず試算に含めてください。配信そのものをキャッシュへ逃がす設計は[CDNの仕組みとキャッシュ制御の解説](https://www.issoh.co.jp/tech/details/13095/)と併せて検討すると効果が読みやすくなります。

### 最小保存期間と最小課金サイズが効いてくる小容量オブジェクトの罠

「単価が安いクラスへ早めに落とす」は、条件を外すと逆に高くつきます。AWSの[ストレージクラスの公式比較表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html)から、判断に効く2列だけを抜き出しました（時点：2026年9月時点の公式ドキュメント）。

| クラス（API名）            | 最小保存期間 | 最小課金サイズ | 取り出しの待ち時間   |
| -------------------- | ------ | ------- | ----------- |
| STANDARD             | なし     | なし      | 即時          |
| STANDARD\_IA         | 30日    | 128KB   | 即時・取り出し課金あり |
| ONEZONE\_IA          | 30日    | 128KB   | 即時・AZ障害に非耐性 |
| INTELLIGENT\_TIERING | なし     | なし      | 即時・監視料金あり   |
| GLACIER\_IR          | 90日    | 128KB   | 即時・取り出し課金あり |
| GLACIER              | 90日    | 規定なし    | 数分〜数時間（復元要） |
| DEEP\_ARCHIVE        | 180日   | 規定なし    | 数時間（復元要）    |

この表の読み方は2つです。第一に、128KBの最小課金サイズは「10KBのファイルをIAへ落としても128KB分を払う」という意味で、単価差の2〜3倍は簡単に打ち消されます。第二に、最小保存期間より早く削除・上書き・別クラスへ移すと、残り日数分が日割りで請求されます。7日で消えるログを30日下限のIAへ移す設定は、素直に損です。Intelligent-Tieringにも同種の線があり、128KB未満のオブジェクトは監視対象から外れて常にFrequent Accessに置かれるため、小さなファイルばかりのバケットでは監視料金だけが乗ります。

実務での線引きはこうです。平均オブジェクトサイズが128KBを下回るなら、クラス移行ではなく**まとめて1オブジェクトにする（tar化やParquet集約）**ほうを先に検討してください。保持期間が30日未満のデータは、IAへ落とさずSTANDARDのまま失効させます。段階移行が効くのは、平均サイズが数百KB以上あり、かつ90日以上持つデータに限られると考えてよいでしょう。

## boto3とaws-cliでS3互換エンドポイントを操作する実装手順

S3互換サービスの多くは、エンドポイントURLを差し替えるだけで既存のS3 SDKがそのまま動きます。ここで示すのは、実際にコピーして動かせる最小の形にまとめた4つの例です。AWS単体のCLI操作をバケット作成から権限設計まで通しでたどりたい場合は、[AWS S3の使い方（CLIでの実装手順）](https://www.issoh.co.jp/tech/details/17489/)を先に済ませておくと理解が速くなります。

### boto3でエンドポイントを差し替えてオブジェクトを読み書きする

PythonのSDKであるboto3なら、クライアント生成時に`endpoint_url`引数へ接続先URLを渡すだけで済みます。引数名は[boto3のS3クライアント公式リファレンス](https://docs.aws.amazon.com/boto3/latest/reference/services/s3.html)と同じで、書き込みは`put_object`、取得は`get_object`、一覧は`list_objects_v2`です。以下はR2のエンドポイントを例にした最小コードで、AWSのS3へ向けるなら`endpoint_url`を外して`region_name`を実リージョンに変えるだけで通ります。

```
import boto3

# S3互換サービスは endpoint_url の差し替えだけで同じSDKが通る
s3 = boto3.client(
    "s3",
    endpoint_url="https://ACCOUNT_ID.r2.cloudflarestorage.com",
    aws_access_key_id="ACCESS_KEY",
    aws_secret_access_key="SECRET_KEY",
    region_name="auto",  # R2はauto固定。空値と us-east-1 は auto にエイリアスされる
)

# 書き込み。キーはスラッシュを含む1本の文字列で、階層ディレクトリではない
s3.put_object(
    Bucket="app-assets",
    Key="logs/2026/09/app.log",
    Body=b"hello object storage",
    ContentType="text/plain",
    Metadata={"owner": "batch-01"},  # ユーザー定義メタデータは合計2KBまで
)

# 取得。メタデータも同じレスポンスから読める
obj = s3.get_object(Bucket="app-assets", Key="logs/2026/09/app.log")
print(obj["Body"].read().decode())
print(obj["Metadata"])

# プレフィックス絞り込みの一覧。1回で最大1,000件、続きは継続トークンで取る
token = None
while True:
    kwargs = {"Bucket": "app-assets", "Prefix": "logs/2026/09/"}
    if token:
        kwargs["ContinuationToken"] = token
    res = s3.list_objects_v2(**kwargs)
    for it in res.get("Contents", []):
        print(it["Key"], it["Size"])
    if not res.get("IsTruncated"):
        break
    token = res["NextContinuationToken"]
```

一覧が1回1,000件で切れる点は、最初に踏みやすい制約です。`IsTruncated`を見て継続トークンを回す形にしておかないと、オブジェクトが増えた本番で静かに取りこぼします。

### aws-cliで互換サービスへバケット作成と同期を実行する書き方

CLIでも同じことができます。AWS CLI v2系なら環境変数`AWS_ENDPOINT_URL`でエンドポイントを固定でき、コマンドごとに指定を書く必要がありません。分割アップロードの閾値も設定ファイルに寄せられます。

```
# 互換サービスのエンドポイントを環境変数で固定する（AWS CLI v2系）
export AWS_ENDPOINT_URL="https://ACCOUNT_ID.r2.cloudflarestorage.com"

# バケット作成
aws s3api create-bucket --bucket app-assets

# ローカルのdistをまるごと同期する。差分だけ転送し、消えたものは削除する
aws s3 sync ./dist s3://app-assets/dist --delete

# プレフィックス指定の一覧（1回の応答は最大1,000件）
aws s3api list-objects-v2 --bucket app-assets --prefix "logs/2026/09/" --max-keys 100

# メタデータとストレージクラスの確認
aws s3api head-object --bucket app-assets --key "logs/2026/09/app.log"

# 分割アップロードへ切り替える閾値とパートサイズを明示しておく
aws configure set default.s3.multipart_threshold 100MB
aws configure set default.s3.multipart_chunksize 16MB
```

閾値を100MBに置いたのは、公式が「100MB以上ならマルチパートを使う」ことを推奨しているためです。パートサイズは5MiB〜5GiBの範囲で、パート数の上限10,000から逆算すると、16MiBのままでは約156GiBで頭を打ちます。それより大きいオブジェクトを扱うなら、チャンクサイズを上げてください。

### ライフサイクル設定JSONで段階移行と不完全アップロードを掃除

クラス移行と掃除は、コンソールで手作業せずJSONで定義してバージョン管理下に置きます。[ライフサイクル管理の公式ドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)の書式に沿った、logsプレフィックス向けの最小例です。移行日数は前掲の最小保存期間（IAは30日、GLACIER\_IRとGLACIERは90日、DEEP\_ARCHIVEは180日）と矛盾しない値に揃えてあります。

```
{
  "Rules": [
    {
      "ID": "logs-tiering",
      "Status": "Enabled",
      "Filter": { "Prefix": "logs/" },
      "Transitions": [
        { "Days": 30,  "StorageClass": "STANDARD_IA" },
        { "Days": 90,  "StorageClass": "GLACIER_IR" },
        { "Days": 365, "StorageClass": "DEEP_ARCHIVE" }
      ],
      "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
    }
  ]
}
```

これを適用するコマンドは1行です。バケット作成直後にまとめて流し、以後はこのJSONを編集して再適用する運用にします。

```
aws s3api put-bucket-lifecycle-configuration \
  --bucket app-assets \
  --lifecycle-configuration file://lifecycle.json
```

`AbortIncompleteMultipartUpload`を7日で入れているのは、中断されたアップロードのパートが課金対象として残り続けるためです。この1項目が抜けているだけで、コンソールの一覧に出てこない「見えない保管料」が積み上がります。請求書とバケットサイズが合わないときは、まずここを疑ってください。

### S3互換が保証しない範囲をR2とCephの実装差から確認する観点

「S3互換」が保証するのは、主にオブジェクトの基本操作（PUT／GET／DELETE／ListObjects）と署名方式（Signature Version 4）、バケットとキーの概念です。S3固有の機能まで一致するとは限りません。Cloudflareの[R2のS3 API互換一覧](https://developers.cloudflare.com/r2/api/s3/api/)を見ると、未実装の範囲が具体的に書かれています。バケットACL（GetBucketAcl／PutBucketAcl）、バケットポリシー、バケットロギング、**バケットのバージョニング（GetBucketVersioning／PutBucketVersioning）**、静的サイトホスティング、Object Lock、Inventory／Analytics／Intelligent-Tiering設定はいずれも未実装です。オブジェクト側でもタグ操作（GetObjectTagging／PutObjectTagging／DeleteObjectTagging）が未実装で、サーバ側暗号化ヘッダの`x-amz-server-side-encryption`系も通りません（SSE-Cは対応）。対応ストレージクラスもSTANDARDとSTANDARD\_IAの2つに限られ、リージョンは`auto`固定です（時点：2026年9月）。

セルフホスト側も傾向が違います。[Ceph RADOS GatewayのS3互換表](https://docs.ceph.com/en/latest/radosgw/s3/)では、バケットのライフサイクル・ポリシー・ACL・通知・タグ付け、オブジェクトのACLとタグ付け、マルチパート、ストレージクラス、オブジェクト所有権まで対応済みとされ、部分対応はバケットレプリケーション（ゾーン間のみ許可）、非対応として挙がるのはレスポンスヘッダの`x-amz-id-2`程度です。つまり「マネージドの互換サービスのほうが機能の欠けが大きく、セルフホストのほうが揃っている」という逆転が起こり得ます。

移行時にたどる手順は、次に示すとおりです。まず自分のコードが呼んでいるAPIを洗い出し（`grep`でSDKのメソッド名を数えるだけでも足ります）、次に対象サービスの互換一覧と1つずつ突き合わせ、欠けているものを代替手段か仕様変更で埋めます。S3固有機能に依存したアプリの移植や、複数の互換サービスを抽象化して扱う層の設計を外部と進めたい場合は、[API開発・システム連携の支援](https://www.issoh.co.jp/service/system/api/)で、呼び出しの棚卸しから設計まで相談できます。

## 導入設計で採用条件を見極める判断と、つまずきやすい失敗パターン

最後に、実際に設計する立場での判断を言い切ります。オブジェクトストレージは万能ではなく、選ぶ条件と外す条件がはっきりしています。

### オブジェクトストレージを採用すべき条件と見送るべき場面の線引き

採用してよいのは、次の条件が揃うときです。データが追記中心で部分更新が少ない、格納数が数十万〜億単位に伸びうる、アクセスがHTTP経由で足りる、そして耐久性を自前で作らずマネージドに委ねたい。この4つが揃えば、オブジェクトストレージが第一候補になります。  
逆に見送るべき場面も明確です。ミリ秒未満のレイテンシが要るトランザクション処理、複数プロセスが同一ファイルをロックして共有する処理、ファイルの一部を頻繁に上書きする処理では採用しません。これらは「安いから」という理由で寄せると、再PUTとレイテンシで運用が破綻します。安さはワークロード適性が合致して初めて意味を持ちます。

### 大量小オブジェクト・頻繁更新・エグレス見落としという典型的な失敗

現場で繰り返される失敗は主に3つです。1つ目は、数KBの小さなオブジェクトを数億個作る設計です。リクエスト課金と一覧処理のコストが保管費を上回り、まとめてアーカイブ（tar化やParquet集約）すべきだったという後悔につながります。2つ目は、部分更新の多いデータを載せてしまい、毎回の全体PUTでコストとレイテンシが悪化するパターンです。3つ目は、保管単価だけで安いと判断し、配信のエグレス課金で請求が跳ねるパターンでしょう。  
これらは設計段階で「オブジェクトの平均サイズ」「更新頻度」「月間転送量」の3つを見積もれば避けられます。AWS上でのS3設計やライフサイクル・アクセス制御を含むインフラ構築を外部に委ねたい場合は、[AWS/GCP/Azureのインフラ構築支援](https://www.issoh.co.jp/service/system/aws/)で要件整理から設計まで相談できます。

### バージョニング非対応の互換サービスをバックアップ先に選ぶ危険

4つ目の失敗として、エグレス無料に惹かれて互換サービスをバックアップ保管先に選び、後から要件を満たせないと気づくパターンを挙げておきます。バックアップ先に求められるのは容量単価ではなく、**誤削除とランサムウェアからの復旧可能性**です。ここで効くのがバケットのバージョニングとObject Lock（WORM）で、前者は上書き・削除の前の版を残し、後者は保持期間中の削除自体を拒否します。

ところが前節で見たとおり、R2は`PutBucketVersioning`とObject Lockのいずれも未実装です。転送費がゼロでも、「世代を残す」「消させない」という保管要件はサービス側の機能では満たせず、アプリ側でキーに版番号を織り込むなどの自作が必要になります。同じ理由で、バケットポリシーが無い環境では「バックアップ用の書き込み専用アカウント」をストレージ側の権限で作れず、認証情報が漏れたときの被害範囲を絞る手段が減ります。

判断の順序は「単価→機能」ではなく「機能→単価」です。バックアップ・監査ログ・法定保存文書のように改変耐性が要件になるデータは、バージョニングとObject Lockが揃うサービスから選び、そこで初めて単価とエグレスを比べてください。逆に、静的アセットの配信元や再生成できる中間ファイルであれば、機能が欠けていても転送費の安いサービスが有利になります。復旧側の設計まで含めた考え方は[リカバリーとリストア・バックアップの違いの解説](https://www.issoh.co.jp/column/details/13354/)で補完できます。

## オブジェクトストレージの導入・実装・選定に関するよくある質問

実装・選定の現場で受けやすい質問を、判断に直結する形でまとめます。

### オブジェクトストレージとファイルストレージはどう使い分けますか？

POSIX準拠のファイル操作（部分更新、ロック、ディレクトリ共有マウント）が要るならファイルストレージ、HTTP経由で貯めて配るだけならオブジェクトストレージです。分岐点は「アプリがファイルシステムとしてマウントする必要があるか」です。必要ならファイル、SDKやHTTPで完結するならオブジェクトを選びます。

### Amazon S3はオブジェクトストレージですか？

はい。Amazon S3は2006年に公開された代表的なオブジェクトストレージで、そのAPIが事実上の業界標準になりました。他社が「S3互換」を掲げるのは、このS3 APIに合わせておけば既存のツールやSDKがそのまま使えるためです。

### オブジェクトストレージのデメリットは何ですか？

部分更新ができず全体差し替えになること、ブロックストレージより読み書きのレイテンシが高いこと、そしてインターネットへの転送（エグレス）に課金されるサービスが多いことです。頻繁に一部を書き換える用途や、超低レイテンシが要る用途には向きません。

### 1オブジェクトのサイズ上限はどれくらいですか？

AWSの公式ドキュメント（2026年9月時点）では、最大オブジェクトサイズは48.8 TiBです。ただしアップロード方式で上限が変わり、単一PUTは5GBまで、マネジメントコンソールからは160GBまで、マルチパートを使って最大50TBまでとなっています。5TBを超えるものはSDKのS3 Transfer Manager（CRT対応版）を使う案内です。以前広く引用された「最大5TB」は現行値ではないため、設計書に書き写す前に公式表を引き直してください。

### S3互換とは具体的に何が互換なのですか？

主にオブジェクトの基本操作（PUT／GET／DELETE／ListObjects）とリクエストの署名方式（Signature Version 4）、バケットとキーの概念が共通することを指します。一方で、バケットのバージョニングやオブジェクトタグ、Object Lock、SSE-KMSは未実装のサービスもあります。移行時は使用APIを洗い出し、対象サービスの互換一覧と突き合わせる工程を挟んでください。

### コストを下げるにはどこから手を付けますか？

順序は「エグレス→オブジェクト粒度→クラス移行」です。まず月間転送量を実測し、配信が多いならCDNでキャッシュするかエグレス無料のサービスを比べます。次に平均オブジェクトサイズを測り、128KBを下回っていれば集約を検討します。クラス移行に手を付けるのは、平均サイズが数百KB以上あり、保持が90日を超えるデータだけに絞るのが安全です。

### オンプレミスでオブジェクトストレージは構築できますか？

はい、構築は可能です。MinIOやCeph（RADOS Gateway）を使えば、自社データセンター内にS3互換のエンドポイントを立てられます。ただしMinIOはコミュニティ版の提供体制が2026年に変わり、公式リポジトリもアーカイブされているため、[MinIOの現状とOSS版アーカイブ後の採用判断](https://www.issoh.co.jp/tech/details/16006/)で前提を確認してから選んでください。クラウドのエグレス課金を避けたい、データを社外に出せない、といった要件があるときの選択肢です。ただし耐久性やスケールは自前の設計・運用に委ねられます。

## 関連記事

- [Amazon S3とは？仕組み・ストレージクラスと料金・採用判断](https://www.issoh.co.jp/tech/details/15433/)：本記事の代表実装。S3単体の仕様と料金を一段深く扱っています。
- [AWS S3の使い方｜CLIでのバケット作成から権限設計・署名付きURLまでの実装手順](https://www.issoh.co.jp/tech/details/17489/)：S3をCLIで操作する実装手順を確かめたい場合に。
- [S3の料金を実額で計算する｜東京リージョンの単価内訳](https://www.issoh.co.jp/tech/details/17537/)：クラス移行の損益分岐を実額で詰めたいときに。
- [ストレージとは？種類・HDDとSSDの違い・企業のクラウド選定](https://www.issoh.co.jp/column/details/13333/)：本記事の親テーマ。ストレージ全体の中でオブジェクトがどこに位置づくかを俯瞰できます。
- [クラウドストレージおすすめ比較｜法人の選び方・料金・容量](https://www.issoh.co.jp/column/details/13347/)：SaaS型クラウドストレージの選定軸。ファイルサーバー代替の観点で補完します。
- [冗長化とは？二重化との違い・種類と構成](https://www.issoh.co.jp/column/details/13356/)：オブジェクトストレージの耐久性を支える多重化・冗長構成の考え方を深掘りします。
- [リカバリーとは？リストア/バックアップとの違い](https://www.issoh.co.jp/column/details/13354/)：バックアップ保管先としてオブジェクトストレージを使う際の復旧側の知識を補います。

---

出典: [オブジェクトストレージとは？仕組み・S3互換APIの範囲とブロックとの違いを実装手順つきで解説](<https://www.issoh.co.jp/tech/details/13369/>)（株式会社一創）
