AI

セルフホストオブジェクトストレージ比較: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

機能比較表

比較項目MinIOCephSeaweedFS
S3互換
POSIX対応✅(CephFS)
セットアップ容易さ△(複雑)
PBスケール
K8s対応✅(Operator)✅(Rook)
GitHub Stars50k+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統合・OpenStackCeph
軽量・高効率・中規模・Go単一バイナリSeaweedFS

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。