Skip to content

ファイルストレージとオブジェクトストレージ

はじめに

ユーザーがプロフィール画像をアップロードしたので、サーバーの /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つの主要なストレージ方式があり、それぞれ異なるレベルの問題を解決します。

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
次元ブロックストレージファイルストレージオブジェクトストレージ
データ単位固定サイズのブロックファイル + ディレクトリオブジェクト(Key-Value)
アクセスプロトコルiSCSI/FCNFS/SMBHTTP 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-prodcompany-assets
Object保存されるファイル本体 + メタデータ画像、PDF
Keyオブジェクトの一意識別子avatars/user-123.jpg
メタデータオブジェクトの追加情報Content-Type、カスタムタグ
ACLアクセス制御リストpublic-read、private
署名付きURL一時的な認可アクセスリンク有効期限15分のアップロード/ダウンロードリンク

オブジェクトストレージには本当の「ディレクトリ」がない

avatars/user-123.jpgavatars/ はディレクトリではなく、Keyのプレフィックスに過ぎません。オブジェクトストレージはフラット構造で、すべてのオブジェクトは同じ階層にあります。コンソールに表示される「フォルダ」はプレフィックスでグループ化した視覚効果に過ぎません。


3. ファイルアップロード方式:誰がファイルをアップロードするのか?

ファイルアップロードには2つの主流の方式があります:サーバー経由とクライアント直接アップロード。ほとんどのシーンでは、クライアント直接アップロードがより優れた選択肢です。

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

クライアント直接アップロードの利点

  1. サーバー帯域の節約:ファイルがサーバーを経由せず、OSSに直接送られる
  2. タイムアウト回避:大容量ファイルのアップロードがNginx/ゲートウェイのタイムアウト制限をトリガーしない
  3. サーバー負荷の低減:サーバーは認証情報を発行するだけで、ファイルストリームを処理する必要がない
  4. レジューム可能なアップロード:OSSがネイティブでマルチパートアップロードをサポートし、フロントエンドでレジューム実装可能

実装手順:フロントエンドがバックエンドにリクエストして署名付きURLを取得 → フロントエンドがこのURLを使ってOSSに直接アップロード → OSSがコールバックでバックエンドに通知


4. CDN高速化:世界中のユーザーに高速に

ユーザーが世界中に分散している場合、単一のオリジンサーバーからファイルをダウンロードすると非常に遅くなります。CDN(Content Delivery Network)は、世界中にエッジノードを展開し、ユーザーに最も近いノードにファイルをキャッシュすることで、アクセス遅延を大幅に削減します。

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
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アプリケーションが直面する基本的な問題です。オブジェクトストレージは、無制限の容量、低コスト、高可用性の特性により、インターネットアプリケーションの標準的な選択肢となっています。

本章の重要ポイントを振り返ります:

  1. 3つのストレージタイプ:ブロックストレージはデータベース用、ファイルストレージは共有用、オブジェクトストレージはユーザーファイル用
  2. オブジェクトストレージモデル:Bucket + Key + Object、フラット構造、HTTP APIアクセス
  3. クライアント直接アップロード:署名付きURL方式、ファイルがサーバーを経由せず、効率的でリソース節約
  4. CDN高速化:エッジノードキャッシュ + ファイル名ハッシュ、世界中のユーザーに高速に
  5. セキュリティと管理:最小権限の原則、ライフサイクルルール、サーバーサイド暗号化

参考資料