ファイルストレージとオブジェクトストレージ
はじめに
ユーザーがプロフィール画像をアップロードしたので、サーバーの /uploads ディレクトリに保存した——するとサーバーのディスクが満杯になったり、2台目のサーバーを追加したら画像が表示されたり表示されなかったり。 ファイルストレージは一見シンプルですが、分散環境では真剣に取り組むべきアーキテクチャ問題です。オブジェクトストレージは、インターネット時代にこの問題を解決する標準的な答えです。
この記事で学べること
この章を学び終えると、次の能力が身につきます:
- ストレージタイプの認識:ブロックストレージ、ファイルストレージ、オブジェクトストレージの違いと適したシーンを理解
- オブジェクトストレージの核心概念:Bucket、Object、Key、署名付きURLなどの核心概念を習得
- アップロード方式の設計:クライアント直接アップロード vs サーバー経由の方式選定を習得
- CDN高速化の原理:CDNが静的リソースのグローバル配信を高速化する仕組みを理解
- ベストプラクティス:ファイル命名、権限制御、ライフサイクル管理などの実践テクニックを習得
| 章 | 内容 | コアコンセプト |
|---|---|---|
| 第1章 | ストレージタイプ比較 | ブロックストレージ、ファイルストレージ、オブジェクトストレージ |
| 第2章 | オブジェクトストレージの核心概念 | Bucket、Object、Key、メタデータ |
| 第3章 | ファイルアップロード方式 | クライアント直接アップロード、署名付きURL |
| 第4章 | CDN高速化 | エッジノード、キャッシュ戦略、オリジン取得 |
| 第5章 | ベストプラクティス | 命名規則、権限、ライフサイクル |
0. 全景図:なぜファイルをサーバーのローカルに保存してはいけないのか?
プロジェクトを始めたばかりの頃は、ユーザーがアップロードしたファイルをサーバーのローカルディレクトリに保存するのが最も直感的な方法です。しかしプロジェクトが成長するにつれ、一連の問題に直面します:
- ディスク容量が限られている:サーバーのディスクはいずれ満杯になり、拡張が面倒
- 複数サーバーで共有できない:ロードバランシング後、ユーザーのリクエストが異なるサーバーに振り分けられ、ファイルが見つからない
- バックアップがない:サーバーがダウンするとファイルが失われる
- CDNがない:世界中のユーザーが同じサーバーにアクセスするため、速度が遅い
オブジェクトストレージの核心的価値
オブジェクトストレージ(AWS S3、Alibaba Cloud OSSなど)はこれらの問題をすべて解決します:容量無制限、グローバルアクセス可能、自動バックアップ、CDNネイティブ対応。すでにインターネットアプリケーションのファイル保存におけるデファクトスタンダードとなっています。
1. ストレージタイプ比較:ブロック、ファイル、オブジェクト
コンピュータの世界には3つの主要なストレージ方式があり、それぞれ異なるレベルの問題を解決します。
| 次元 | ブロックストレージ | ファイルストレージ | オブジェクトストレージ |
|---|---|---|---|
| データ単位 | 固定サイズのブロック | ファイル + ディレクトリ | オブジェクト(Key-Value) |
| アクセスプロトコル | iSCSI/FC | NFS/SMB | HTTP REST API |
| パフォーマンス | 最高(ミリ秒級) | 中程度 | やや低い(ただし十分) |
| 拡張性 | 限定的 | 中程度 | ほぼ無限 |
| コスト | 最高 | 中程度 | 最低 |
| 典型的なシーン | データベース | 共有ファイル | 画像/動画/バックアップ |
簡単な覚え方
- ブロックストレージはハードディスクのようなもの——データベース用
- ファイルストレージはネットワーク共有フォルダのようなもの——複数サーバーで設定を共有する用
- オブジェクトストレージはオンラインストレージのようなもの——ユーザーがアップロードした画像、動画用
2. オブジェクトストレージの核心概念
オブジェクトストレージのデータモデルは非常にシンプルです:Bucket(バケット) はコンテナ、Object(オブジェクト) はファイル、各オブジェクトは一意の Key(キー) で識別されます。
my-app-bucket/ ← Bucket(バケット)
├── avatars/user-123.jpg ← Object Key
├── avatars/user-456.png ← Object Key
├── reports/2024/q1-report.pdf ← Object Key(「ディレクトリ」はKeyのプレフィックスに過ぎない)
└── uploads/temp/file.zip ← Object Key| 概念 | 説明 | 例 |
|---|---|---|
| Bucket | ストレージコンテナ、グローバルで一意の命名 | my-app-prod、company-assets |
| Object | 保存されるファイル本体 + メタデータ | 画像、PDF |
| Key | オブジェクトの一意識別子 | avatars/user-123.jpg |
| メタデータ | オブジェクトの追加情報 | Content-Type、カスタムタグ |
| ACL | アクセス制御リスト | public-read、private |
| 署名付きURL | 一時的な認可アクセスリンク | 有効期限15分のアップロード/ダウンロードリンク |
オブジェクトストレージには本当の「ディレクトリ」がない
avatars/user-123.jpg の avatars/ はディレクトリではなく、Keyのプレフィックスに過ぎません。オブジェクトストレージはフラット構造で、すべてのオブジェクトは同じ階層にあります。コンソールに表示される「フォルダ」はプレフィックスでグループ化した視覚効果に過ぎません。
3. ファイルアップロード方式:誰がファイルをアップロードするのか?
ファイルアップロードには2つの主流の方式があります:サーバー経由とクライアント直接アップロード。ほとんどのシーンでは、クライアント直接アップロードがより優れた選択肢です。
クライアント直接アップロードの利点
- サーバー帯域の節約:ファイルがサーバーを経由せず、OSSに直接送られる
- タイムアウト回避:大容量ファイルのアップロードがNginx/ゲートウェイのタイムアウト制限をトリガーしない
- サーバー負荷の低減:サーバーは認証情報を発行するだけで、ファイルストリームを処理する必要がない
- レジューム可能なアップロード:OSSがネイティブでマルチパートアップロードをサポートし、フロントエンドでレジューム実装可能
実装手順:フロントエンドがバックエンドにリクエストして署名付きURLを取得 → フロントエンドがこのURLを使ってOSSに直接アップロード → OSSがコールバックでバックエンドに通知
4. CDN高速化:世界中のユーザーに高速に
ユーザーが世界中に分散している場合、単一のオリジンサーバーからファイルをダウンロードすると非常に遅くなります。CDN(Content Delivery Network)は、世界中にエッジノードを展開し、ユーザーに最も近いノードにファイルをキャッシュすることで、アクセス遅延を大幅に削減します。
| CDN概念 | 説明 |
|---|---|
| エッジノード | 世界中に分散されたキャッシュサーバー |
| オリジン取得 | エッジノードにキャッシュがない場合、オリジンサーバーにファイルをリクエスト |
| キャッシュヒット率 | リクエストがエッジノードで直接応答される割合、高いほど良い |
| TTL | キャッシュ有効期間、期限切れ後にオリジン取得が必要 |
| キャッシュリフレッシュ | エッジノードのキャッシュを能動的にクリアし、新しいファイルを有効化 |
CDNベストプラクティス
- ファイル名にハッシュを付ける:
logo.a3f2b1.pngのようにし、logo.pngにしない。これによりファイル更新時にキャッシュリフレッシュが不要 - 適切なTTLを設定:静的リソース(JS/CSS/画像)は長いTTL(1年)、HTMLは短いTTL(5分)
- Gzip/Brotli圧縮を有効化:テキスト系リソースは圧縮後60-80%サイズ削減
5. ベストプラクティス
| 実践 | 説明 | 例 |
|---|---|---|
| Key命名規則 | 意味のあるプレフィックスでファイルを整理 | {type}/{date}/{uuid}.{ext} |
| ホットスポットKeyの回避 | 連番で始まるKeyを使わない | UUIDまたはハッシュプレフィックスを使用 |
| 最小権限の原則 | Bucketはデフォルトでprivate | 公開が必要なファイルのみpublic-readに設定 |
| ライフサイクルルール | 期限切れファイルの自動クリーンアップ | 一時ファイルは7日後に自動削除 |
| クロスオリジン設定 | フロントエンド直接アップロードにはCORS設定が必要 | 自ドメインのPUT/POSTを許可 |
| サーバーサイド暗号化 | 機密ファイルはSSEを有効化 | SSE-S3またはSSE-KMS |
まとめ
ファイルストレージはすべてのWebアプリケーションが直面する基本的な問題です。オブジェクトストレージは、無制限の容量、低コスト、高可用性の特性により、インターネットアプリケーションの標準的な選択肢となっています。
本章の重要ポイントを振り返ります:
- 3つのストレージタイプ:ブロックストレージはデータベース用、ファイルストレージは共有用、オブジェクトストレージはユーザーファイル用
- オブジェクトストレージモデル:Bucket + Key + Object、フラット構造、HTTP APIアクセス
- クライアント直接アップロード:署名付きURL方式、ファイルがサーバーを経由せず、効率的でリソース節約
- CDN高速化:エッジノードキャッシュ + ファイル名ハッシュ、世界中のユーザーに高速に
- セキュリティと管理:最小権限の原則、ライフサイクルルール、サーバーサイド暗号化
参考資料
- AWS S3 開発者ガイド - オブジェクトストレージのベンチマークドキュメント
- Alibaba Cloud OSS ベストプラクティス - 国内で最も使われているオブジェクトストレージ
- MinIO ドキュメント - オープンソースのS3互換オブジェクトストレージ
- Cloudflare R2 - エグレス料金ゼロのオブジェクトストレージ
- 署名付きURL 詳細 - クライアント直接アップロードの核心メカニズム