セルフホストオブジェクトストレージ比較:MinIO vs Ceph vs SeaweedFS でS3互換ストレージを構築する
オープンソースラボ編集部 ・ 2026年6月14日
セルフホストオブジェクトストレージ比較:MinIO vs Ceph vs SeaweedFS でS3互換ストレージを構築する
クラウドのS3(AWS)・GCS(Google)・Azure Blobは便利ですが、オンプレミス・プライベートクラウドでS3互換のオブジェクトストレージを自前で構築したい場合があります。MinIO(S3互換・高速・Kubernetes対応)・Ceph(POSIX/S3/Swift全対応・大規模)・SeaweedFS(S3互換・高効率・軽量)の3つがOSSオブジェクトストレージの主要選択肢です。
セルフホストオブジェクトストレージを選ぶ理由
- データ主権: 規制・コンプライアンス要件で特定のデータを自社インフラ外に出せない
- コスト削減: S3料金($0.023/GB/月)に対してオンプレミスHDDは$0.01/GB以下
- 帯域コスト: S3のEgress($0.09/GB〜)が高額になるケースでオンプレに移行
- 遅延最適化: 近いデータセンターに配置してレイテンシをミリ秒以下に削減
主要ツールの概要
MinIO
2014年公開、Go製のOSSです。GitHubスター50k+。S3 APIと完全互換の高性能なオブジェクトストレージで、単一バイナリで起動できる手軽さが特徴です。Kubernetes(MinIO Operator)・Docker・Linux/WindowsのどこでもS3互換APIで動作し、AWS SDK・s3cmd・mc(MinIO Client)がそのまま使えます。
# docker-compose.yml - MinIO スタンドアロン(開発・テスト用)
version: "3.8"
services:
minio:
image: minio/minio:latest
restart: unless-stopped
ports:
- "9000:9000" # S3 API
- "9001:9001" # 管理コンソール UI
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
MINIO_VOLUMES: /data
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
volumes:
minio_data:
# docker-compose.yml - MinIO 分散モード(4ノード高可用性)
version: "3.8"
services:
minio1:
image: minio/minio:latest
command: server http://minio{1...4}/data{1...2} --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
ports:
- "9001:9001"
volumes:
- minio1_data1:/data1
- minio1_data2:/data2
minio2:
image: minio/minio:latest
command: server http://minio{1...4}/data{1...2}
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
volumes:
- minio2_data1:/data1
- minio2_data2:/data2
# minio3, minio4 同様に定義...
nginx:
image: nginx:alpine
ports:
- "9000:9000"
volumes:
- ./nginx-minio.conf:/etc/nginx/nginx.conf:ro
depends_on: [minio1, minio2]
volumes:
minio1_data1:
minio1_data2:
minio2_data1:
minio2_data2:
# Python (boto3): MinIOをS3として操作
import boto3
from botocore.client import Config
import os
# MinIOに接続(S3 APIと同じクライアント)
s3 = boto3.client(
's3',
endpoint_url='http://localhost:9000',
aws_access_key_id=os.environ['MINIO_ACCESS_KEY'],
aws_secret_access_key=os.environ['MINIO_SECRET_KEY'],
config=Config(signature_version='s3v4'),
region_name='us-east-1', # MinIOはリージョン任意
)
# バケット作成
s3.create_bucket(Bucket='my-documents')
# バケットポリシーを設定(パブリック読み取り)
import json
policy = json.dumps({
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Principal': {'AWS': ['*']},
'Action': ['s3:GetObject'],
'Resource': ['arn:aws:s3:::my-documents/public/*'],
}]
})
s3.put_bucket_policy(Bucket='my-documents', Policy=policy)
# ファイルをアップロード
s3.upload_file(
'local-file.pdf',
'my-documents',
'uploads/2024/document.pdf',
ExtraArgs={
'ContentType': 'application/pdf',
'ServerSideEncryption': 'AES256',
}
)
# プリサインドURLを生成(1時間有効)
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-documents', 'Key': 'uploads/2024/document.pdf'},
ExpiresIn=3600,
)
print(f'ダウンロードURL: {url}')
# バケット内のオブジェクト一覧
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket='my-documents', Prefix='uploads/'):
for obj in page.get('Contents', []):
print(f'{obj["Key"]} ({obj["Size"]} bytes)')
# mc (MinIO Client): CLI操作
# インストール
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && sudo mv mc /usr/local/bin/
# MinIOエイリアスを設定
mc alias set local http://localhost:9000 $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
# バケット操作
mc mb local/my-bucket # バケット作成
mc ls local/ # バケット一覧
mc ls local/my-bucket # オブジェクト一覧
mc cp file.pdf local/my-bucket/ # ファイルアップロード
mc rm local/my-bucket/file.pdf # ファイル削除
# AWS S3 から MinIO へのマイグレーション(並列コピー)
mc mirror s3/source-bucket local/dest-bucket --watch --overwrite
# バケット使用量確認
mc du local/my-bucket
Ceph
2006年公開、C++製のOSSです。GitHubスター14k+。POSIX(CephFS)・オブジェクトストレージ(Ceph RADOS Gateway・S3/Swift互換)・ブロックストレージ(RBD)を1つのシステムで提供するフルスタックストレージプラットフォームです。PB(ペタバイト)スケールの大規模ストレージクラスターを構築でき、OpenStack・Kubernetesの本番ストレージバックエンドとして使われます。
# Cephstorageクラスター(cephadm)での最小セットアップ
# 3ノード最小構成(MON×3・OSD×各ノード)
# cephadm インストール
curl -O https://download.ceph.com/rpm-reef/el9/noarch/cephadm
chmod +x cephadm
sudo ./cephadm add-repo --release reef
sudo ./cephadm install
# 最初のMonitorノードでクラスターをブートストラップ
sudo cephadm bootstrap --mon-ip 192.168.1.10
# 他のノードをクラスターに追加
sudo ceph orch host add ceph-node2 192.168.1.11
sudo ceph orch host add ceph-node3 192.168.1.12
# OSD(ディスク)を全ノードに自動追加
sudo ceph orch apply osd --all-available-devices
# RadosGateway(S3互換エンドポイント)を起動
sudo ceph orch apply rgw mystore
sudo radosgw-admin user create --uid=s3user --display-name="S3 User" --access-key=my-access-key --secret=my-secret-key
# クラスター状態確認
sudo ceph status
sudo ceph df
SeaweedFS
2014年公開、Go製のOSSです。GitHubスター23k+。Facebookのハヤブサ(Haystack)の設計に基づいた高効率なオブジェクトストレージです。小〜中規模(GB〜TB)で最も効率的なストレージエンジンを持ち、S3互換APIで動作します。MinIOより軽量でCephより簡単なセットアップが特徴です。
# SeaweedFS 最小セットアップ(Master + Volume)
# インストール
wget https://github.com/seaweedfs/seaweedfs/releases/latest/download/linux_amd64.tar.gz
tar xvf linux_amd64.tar.gz
sudo mv weed /usr/local/bin/
# Masterサーバー起動
weed master -mdir=/data/master -port=9333 &
# Volumeサーバー起動(複数ディスク対応)
weed volume -mserver=localhost:9333 -dir=/data/vol1,/data/vol2 -max=10 -port=8080 &
# S3 APIゲートウェイ起動
weed s3 -port=8333 -config=/etc/seaweedfs/s3.json -filer=localhost:8888 &
# ヘルスチェック
curl http://localhost:9333/dir/status
機能比較表
| 比較項目 | MinIO | Ceph | SeaweedFS |
|---|---|---|---|
| S3互換 | ✅ | ✅ | ✅ |
| POSIX対応 | ❌ | ✅(CephFS) | ❌ |
| セットアップ容易さ | ✅ | △(複雑) | ✅ |
| PBスケール | △ | ✅ | △ |
| K8s対応 | ✅(Operator) | ✅(Rook) | ✅ |
| GitHub Stars | 50k+ | 14k+ | 23k+ |
オブジェクトストレージはDevOpsカテゴリ/categories/devopsのMLOps(モデルアーティファクト保存)・CI/CDアーティファクト管理(Dockerイメージ以外のバイナリ・データセット)と組み合わせます。LLM Toolsカテゴリ/categories/llm-toolsのRAGシステムでPDF・Word・HTMLドキュメントを MinIOに保存して解析パイプライン(Docling・Unstructured)で処理する構成が一般的です。
FAQ
Q. MinIOとAWS S3を本番でシームレスに切り替えるには?
A. boto3のendpoint_urlパラメーターだけを環境変数で切り替える設計にします。endpoint_url=None(省略)でAWS S3、endpoint_url='http://minio:9000'でMinIOに接続します。Pythonでの実装例: endpoint_url = os.getenv('S3_ENDPOINT_URL') # Noneの場合はAWS S3としてboto3.client('s3', endpoint_url=endpoint_url)のように設定。本番(AWS)とdev/staging(MinIO)を同一コードで動かせます。注意点: ①MinIOのバケット名はDNSラベル準拠(小文字・ハイフンのみ)②プリサインドURLのドメインがMinIOのエンドポイント(localhost:9000)になるため外部公開URLのためにNginxリバースプロキシを経由する③MinIOはマルチリージョン・バージョニング・S3 Selectは一部制限あり。
Q. Cephは小規模(〜10TB)環境でも使えますか?
A. 動作はしますが、MinIOやSeaweedFSの方がコスト対効果が高いです。Cephの最小構成: 3台のMonitorノード+最低3台のOSDノード(合計6台〜)が推奨されており、少ないノード数では冗長性が十分に機能しません。〜10TBであればMinIO分散モード(4ノード・イレイジャーコーディング)の方が: ①セットアップが1〜2時間で完了(Cephは半日〜1日)②管理UIが直感的③Go単一バイナリでメンテナンスが容易。CephはPB規模・OpenStack統合・CephFS(POSIX)が必要になって初めて真価を発揮します。
Q. MinIOのイレイジャーコーディングとは何ですか?
A. データを数学的に分割して一部のドライブが故障してもデータを復元できる技術です。MinIOのデフォルト設定(8ドライブ構成): ①データを4つのデータチャンク+4つのパリティチャンクに分割②4つのドライブが同時に故障しても復元可能③ストレージ効率50%(RAID 6と同等以上の耐障害性でより効率的)。設定方法: MINIO_STORAGE_CLASS_STANDARD=EC:4で4チャンクのパリティを設定。イレイジャーコーディングは最小4ドライブから有効で、ドライブ数が多いほどストレージ効率が向上します(16ドライブ構成でEC:4なら効率75%)。
Q. MinIOでバケットのライフサイクルルールを設定するには?
A. S3と同じライフサイクルポリシーXML(またはmc CLI)で設定できます。①30日後にログファイルをGLACIER相当(Infrequent Access)へ移動②90日後に自動削除。mc CLIでの設定: mc ilm rule add local/my-bucket --prefix "logs/" --expiry-days 90。Pythonでの設定: s3.put_bucket_lifecycle_configuration(Bucket='my-bucket', LifecycleConfiguration={'Rules': [{'Status': 'Enabled', 'Prefix': 'logs/', 'Expiration': {'Days': 90}}]}). MinIOのTiering(階層化): hot tier(NVMe SSD)→warm tier(HDD)→cold tier(外部MinIOまたはAWS Glacier)と自動移行するデータ階層化もEnterprise版で対応しています。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| K8s・S3互換・中小規模・シンプルセットアップ | MinIO |
| PBスケール・POSIX+S3+Block統合・OpenStack | Ceph |
| 軽量・高効率・中規模・Go単一バイナリ | SeaweedFS |