【2026年版】MinIOとは?S3互換オブジェクトストレージでローカル開発〜本番運用まで一発理解(Spring Boot例つき)


MinIO(ミニオー)は何ができる?結論:「自前で持てるS3」/strong>

MinIOは Amazon S3互換API を話す「オブジェクトストレージ」です
つまりアプリ側は S3向けのSDK(AWS SDKなど) のまま、接続先だけMinIOに差し替えて 「S3っぽく」使えます

できることを一言でまとめると:

  • ファイル/画像/動画/ログ/生成物 など “非構造データ” を、S3と同じ感覚で保存・配信
  • ローカル開発やCI で「S3を使う機能」をコストゼロで再現
  • オンプレ/自社クラスタ にS3互換ストレージを置いて、クラウド依存を減らす(データ主権・レイテンシ・コスト最適化)
  • ある程度の本番要件にも耐える仕組み(分散・冗長化・複製など)を備える

まず押さえる:オブジェクトストレージって何?/strong>

DBやファイルサーバと違って、オブジェクトストレージは 「キー(パスみたいな文字列)+中身(バイナリ)+メタデータ」 で保存します

  • 例:users/123/avatar.png
  • Webアプリでは「アップロード」「ダウンロード」「期限付きURLで直リンク配布」が主戦場

S3互換であることの価値は、アプリ実装・運用ノウハウ・周辺ツール が既に豊富なS3エコシステムに乗れる点です


MinIOの特徴(選ばれる理由)/strong>

1) S3互換API:AWS SDKがそのまま使える

MinIOはS3 API互換を強く打ち出していて、path-style / virtual-host-style のリクエスト形式もサポートしています
→ Spring Boot側は「S3Clientのエンドポイント差し替え」で繋がることが多いです

2) 高性能・スケール志向

公式サイトやリポジトリでも「高性能」「大規模ワークロード」を前面にしています

3) 分散ストレージの基本機能(冗長化など)

MinIOは イレイジャーコーディング(Erasure Coding) を含む分散ストレージの考え方を解説・提供しています(本番での耐障害性に関わる話)

4) ローカルS3用途が強い(Dockerで即起動)

日本語圏でも「ローカルS3環境としてMinIOを立てる」記事が多く、Docker/Composeでの利用が定番です


Spring Bootとの相性がいい理由/strong>

理由A:S3互換だから、実装がAWS SDK寄りで統一できる

Spring Bootアプリで「S3連携」する設計だと、環境によって接続先を切り替えるだけで済みます(ローカル=MinIO / 本番=S3 など)

理由B:署名付きURL(Presigned URL)が扱いやすい

フロントや外部利用者に クレデンシャルを渡さず にアップロード/ダウンロードさせたいとき、Presigned URLが鉄板です
MinIOでも同様に扱う解説が多数あります

理由C:テスト/CIで効く

CI上で本物のS3を使うと「コスト」「認証情報管理」「外部依存」が増えます
MinIOを立ててS3互換でテストすると、アプリはほぼ同じコードで検証できます


どんなときにMinIOを選ぶべき?/strong>

向いている

  • ローカル開発でS3互換の動作確認をしたい(画像アップロード、CSV保管、生成ファイル保管など)
  • CIでS3依存機能を再現したい
  • オンプレ/自社K8sで 「S3っぽい置き場」 を用意したい
  • データ主権やネットワーク遅延、クラウドコストを最適化したい

注意が必要

  • 「完全にS3と同一挙動」を期待すると、細部(互換性の範囲)で差に当たることがある
  • path-style/virtual-host-style、TLS、プロキシ、リージョン扱いなどでハマることがある(後述)

Spring BootからMinIOへ接続する最短ルート(AWS SDK v2想定)/strong>

DockerでMinIOを起動(ローカル開発の定番)

以下のようなComposeで、API(9000)とConsole(9001)を開ける構成がよく紹介されています

services:
  minio:
    image: minio/minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    command: server /data --console-address ":9001"
    volumes:
      - minio_data:/data
volumes:
  minio_data:

Spring Boot側:接続設定(概念)

  • endpoint: http://localhost:9000
  • accessKey/secretKey: MinIOの管理画面で発行(または環境変数固定)
  • region: 形式上 us-east-1 を入れる例が多い(MinIO側の既定値として触れられがち)
  • path-style を必要に応じて有効化(環境/構成で差が出る)

3) Javaコード例(S3ClientをMinIOへ向ける)

ポイントは endpointOverride と(必要なら)path-style です

S3Client s3 = S3Client.builder()
    .endpointOverride(URI.create("http://localhost:9000"))
    .region(Region.of("us-east-1"))
    .credentialsProvider(
        StaticCredentialsProvider.create(AwsBasicCredentials.create("minioadmin", "minioadmin"))
    )
    // 必要に応じて path-style(バケット名をパスに含める)
    .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())
    .build();

署名付きURL(Presigned URL)で安全に直アップ/直配布/strong>

「フロントから直接MinIOへアップロードさせたい」「期限付きでダウンロードさせたい」ならこれ

  • Presigned URLを使うと 利用者にアクセスキーを渡さず に済む、という説明がよくされています

Spring Bootでは(AWS SDK v2なら)S3Presigner を使う形が定番です(設計としては BFFがURL発行だけ担当、アップ/ダウンロードはブラウザが直で実行)


よくあるハマりどころ(ここだけ読めば回避できる)/strong>

  1. path-style と virtual-host-style の違い
    • MinIOは両対応をうたっています。構成(DNS/証明書/ローカル)次第で片方しか通らない”ことがあるので、まずはpath-styleを試すのが手堅いです
  2. リージョン指定
    • SDK側がリージョン必須なことがあり、MinIO向けでも形式上入れる例が多いです
  3. 「本番S3と同じ」前提の設計
    • S3互換は強いですが、互換の範囲は常に意識(特に周辺機能やエッジケース)
      まずは「必要なAPIを使っているか」を洗い出すのが安全です。

    ぜひご参考ください!

    是非フォローしてください

    最新の情報をお伝えします