- 技術 💻
MinIOとは・使い方|S3互換ストレージを自前で動かす手順とエラー原文
結論
MinIOとは、Amazon S3 と同じ API で読み書きできるオブジェクトストレージを、自分のサーバーやPCで動かせるソフトです。aws cli や boto3 は --endpoint-url(接続先)を変えるだけでそのまま使えます。ただしコミュニティ版は2026年10月29日時点で「ソースコードのみの配布・リポジトリは保守終了」になっています。
この記事でわかること
- 起動からWebコンソール・mc・aws cli・boto3でのバケット操作までの実物
- 4ドライブ中2台のデータを消しても読め、3台で読めなくなった実測
- Access Denied・SignatureDoesNotMatch など、よくあるエラーの原文と直し方
MinIO は「ファイルを置くフォルダー」ではなく、バケット(入れ物)とキー(名前)でデータを出し入れする S3 互換のサーバーです。アプリや CLI からは S3 API で、人はブラウザの Web コンソールで操作します。
flowchart TD
A[アプリ・aws cli<br>boto3・mc] -->|S3 API| M[MinIO サーバー]
B[ブラウザ] -->|Webコンソール| M
M --> E[erasure set<br>ドライブ4台に分散]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| MinIOとは | S3互換のオブジェクトストレージを自前で動かすソフト(AGPLv3) | MinIOとは |
| MinIOは無料で使える? | コミュニティ版は AGPLv3 で無料。ただしソース配布のみ・保守終了と表示 | ライセンスと最近の変化 |
| MinIOの使い方(最初の一歩) | minio server でディレクトリを指定して起動し、mc alias set で接続 | インストールと起動 |
| Dockerで動かしたい | 公式 README は Dockerfile から自分でイメージを作る手順を案内 | Dockerで起動する |
| aws cli・boto3から使う | endpoint_url を MinIO に向ける。boto3 はパス形式が無難 | aws cli・boto3 |
| Webコンソールで何ができる? | この版はバケット作成・アップロード・閲覧が中心。ユーザー管理は mc で | Webコンソール |
| ディスクが壊れたらどうなる | 4台・EC:2 なら2台分消えても読めた。書き込みは3台必要だった | erasure codingの実測 |
| S3との違い・どちらを選ぶ | 運用を自分で持つか、AWS に任せるか。判断表で整理 | S3との違いと使い分け |
確認環境:Ubuntu 24.04.5 LTS(2 CPU・メモリ 8GB)の上で、MinIO サーバー RELEASE.2025-10-15T17-29-55Z と MinIO Client(mc)2025-08-13 版を、conda-forge で配布されている Linux 用パッケージから取り出して作業用ディレクトリに置き、127.0.0.1 の専用ポート(19130〜19133)で起動しました(dl.min.io からの取得はこの環境の通信の制限で行えなかったため)。S3 クライアントは aws-cli 1.46.2(Python 3.13.18)と boto3 1.43.122、Web コンソールは Playwright 1.63.0 で動かした Chromium(Chrome for Testing 153.0.8010.12)で操作しています。erasure coding は同じマシン上の4つのディレクトリをドライブとして起動し、中身を消して読み書きを確かめました。アクセスキーはすべて検証用のダミー値で、AWS には接続していません。Docker での起動、ライセンス、AIStor の扱い、erasure coding の定義は、MinIO の GitHub リポジトリの README と docs.min.io で確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MinIOとは・使い方|S3互換ストレージを自前で動かす手順とエラー原文」
MinIOとは(S3互換のオブジェクトストレージ)
この節では、MinIO が何をするソフトなのか、ファイルサーバーや Amazon S3 と何が違うのかが分かります。
MinIO は、Amazon S3 と同じ API(S3 API)を話すオブジェクトストレージのサーバーです。Go で書かれた1つの実行ファイルで、起動するときに「データを置くディレクトリ(ドライブ)」を渡すだけで動きます。公式 README は「高性能な S3 互換のオブジェクトストレージで、GNU AGPL v3.0 で公開している」と説明しています。
オブジェクトストレージは、データを「バケット」という入れ物に「キー(名前)」を付けて置きます。photos/2026/big.bin のようにスラッシュを含む名前は付けられますが、フォルダーの階層が本当にあるわけではなく、名前の一部です。読み書きは HTTP で行い、ファイルの一部だけを書き換える操作はありません(置き直すのが基本)。
ファイルサーバーとオブジェクトストレージの違い
見分ける問い:「アプリから HTTP で出し入れするか、OS からフォルダーとして触るか」
MinIO がよく使われるのは次の場面です。
1開発・テスト用の「手元の S3」
S3 を使うアプリを、AWS のバケットを用意せずに手元や CI で動かせる。接続先の URL を変えるだけでコードはそのまま。
2社内・閉じた環境のストレージ
外部のクラウドにデータを出せない環境で、S3 と同じ使い方のストレージを自分のサーバーに置く。
3バックアップ・分析データの置き場
S3 に対応したバックアップソフトや分析ツールの保存先として、複数のディスクにまたがって冗長に保存する。
手元で起動したときの、主な数字は次のとおりです。
MinIOのライセンスとコミュニティ版の最近の変化(2026年10月29日時点)
この節では、MinIO を無料で使えるのか、コミュニティ版の配布と保守がどう変わったのかが分かります。
MinIO のコミュニティ版は GNU AGPLv3 のオープンソースで、無料で使えます。ただし2026年10月29日時点で、GitHub の minio/minio リポジトリは読み取り専用(アーカイブ)になり、README の先頭に「THIS REPOSITORY IS NO LONGER MAINTAINED.」と書かれています。以前の入門記事にある「dl.min.io からバイナリを落として起動」「minio/minio のイメージで docker run」という手順は、そのままでは最新の修正を受け取れない形になっています。
| 項目 | 公式 README・公式サイトの記載(2026年10月29日時点) |
|---|---|
| リポジトリ | 「THIS REPOSITORY IS NO LONGER MAINTAINED.」。GitHub 上でアーカイブ(読み取り専用)表示 |
| 配布の形 | 「The MinIO community edition is now distributed as source code only.」コンパイル済みのバイナリは今後提供しない |
| 以前のバイナリ | GitHub Releases と dl.min.io に残るが「These legacy binaries will not receive updates.」 |
| 入れ方 | go install github.com/minio/minio@latest(go1.24 以上)か、Dockerfile からイメージを作る |
| ライセンス | GNU AGPLv3。改変したコードの公開などの義務を確かめたうえで使う、と明記 |
| 代わりの選択肢 | AIStor Free(単体構成向けの無料ライセンス)・AIStor Enterprise(分散構成と商用サポート) |
AIStor は MinIO 社の商用製品で、ライセンスは「MinIO Software License」です。AIStor のドキュメントには「AIStor Free ライセンスのクラスターは、単一ノード・単一ドライブと単一ノード・複数ドライブの構成だけに対応する」と書かれています。複数台のサーバーに分散させる構成を無料で組みたい場合は、コミュニティ版をソースからビルドして自分で保守するか、別の製品を検討することになります。
- AGPLv3 は「ネットワーク越しにサービスとして提供する」場合にも義務がかかるライセンスです。社内で開発用に使うだけか、改変して外部に提供するのかで確かめる点が変わります。README も、商用・独自の利用は AGPLv3 の義務に照らして確かめるよう求めています。判断に迷うときは法務の担当者に確かめるのが確実です。
MinIOのインストールと起動(Linuxでの使い方)
この節では、MinIO サーバーを入れて起動し、mc から接続するまでの手順と、起動時のログ・エラーの原文が分かります。
MinIO は「minio server データを置くディレクトリ」で起動します。管理者のユーザー名とパスワードは環境変数 MINIO_ROOT_USER・MINIO_ROOT_PASSWORD で渡します。
minio の実行ファイルを用意する
公式 README の案内はソースからのビルド(go install github.com/minio/minio@latest)。この記事ではビルド済みのパッケージ(conda-forge)から取り出した RELEASE.2025-10-15T17-29-55Z を使った。
データ用のディレクトリと管理者の資格情報を決める
空のディレクトリを用意し、ユーザー名(3文字以上)とパスワード(8文字以上)を環境変数で渡す。指定しないと minioadmin:minioadmin になる。
アドレスとポートを指定して起動する
S3 API は --address(既定は :9000)、Web コンソールは --console-address で決める。コンソールは指定しないとランダムなポートになる、と README にある。
mc で接続を登録して確かめる
mc alias set 名前 URL ユーザー パスワード で接続先に名前を付け、mc admin info で状態を見る。
実際に起動したコマンドとログです(ポートは他の作業と重ならない 19130・19131 にしています。通常は 9000・9001 がよく使われます)。
$ minio --version
minio version RELEASE.2025-10-15T17-29-55Z (commit-id=9e49d5e7a648f00e26f2246f4dc28e6b07f8c84a)
Runtime: go1.27.1 linux/amd64
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Copyright: 2015-2025 MinIO, Inc.
$ export MINIO_ROOT_USER=rjcadmin
$ export MINIO_ROOT_PASSWORD=rjc-dummy-secret-130
$ minio server ./data1 --address 127.0.0.1:19130 --console-address 127.0.0.1:19131
INFO: Formatting 1st pool, 1 set(s), 1 drives per set.
INFO: WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
MinIO Object Storage Server
Copyright: 2015-2026 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2025-10-15T17-29-55Z (go1.27.1 linux/amd64)
API: http://127.0.0.1:19130
WebUI: http://127.0.0.1:19131
Docs: https://docs.min.io
1ドライブの起動では「ホストが落ちるとデータが使えなくなる」という警告が出ます。開発用ならこのままで動きます。続けて mc で接続先を登録しました。
$ mc alias set local http://127.0.0.1:19130 rjcadmin rjc-dummy-secret-130
Added `local` successfully.
$ mc admin info local
● 127.0.0.1:19130
Uptime: 9 seconds
Version: 2025-10-15T17-29-55Z
Network: 1/1 OK
Drives: 1/1 OK
Pool: 1
┌──────┬────────────────────────┬─────────────────────┬──────────────┐
│ Pool │ Drives Usage │ Erasure stripe size │ Erasure sets │
│ 1st │ 14.7% (total: 7.8 GiB) │ 1 │ 1 │
└──────┴────────────────────────┴─────────────────────┴──────────────┘
1 drive online, 0 drives offline, EC:0
起動のときに出たエラー・警告の原文
| 状況 | 出た文言 | 直し方 |
|---|---|---|
| パスワードを short(5文字)にした | FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials と、HINT に「MINIO_ROOT_PASSWORD length at least 8 characters」 |
ユーザー名3文字以上・パスワード8文字以上にする |
| 資格情報を指定せずに起動 | WARN: Detected default credentials 'minioadmin:minioadmin'(起動はする) |
環境変数で自分の値を渡す |
| ポートが使用中 | FATAL Unable to start the server: Specified port is already in use |
ss -ltnp で使っているプロセスを確かめ、別のポートにする |
データはディレクトリにどう置かれるか
起動後にアップロードしたファイルが、データ用ディレクトリにどう置かれたかを見ました。
$ find data1/photos -maxdepth 3
data1/photos/hello.txt
data1/photos/hello.txt/xl.meta
data1/photos/2026/big.bin
data1/photos/2026/big.bin/xl.meta
data1/photos/2026/big.bin/6d51e4dd-843a-4ce5-adc3-79d43ee95734
...
$ ls -l data1/photos/2026/big.bin/6d51e4dd-843a-4ce5-adc3-79d43ee95734/
-rw-r--r-- 1 root root 5243040 ... part.1
オブジェクト名がディレクトリになり、中にメタデータ(xl.meta)と本体(part.1)が入ります。12バイトの hello.txt は part ファイルが無く、本文が xl.meta の中に入っていました。データ用ディレクトリは MinIO 専用の形式なので、ここに直接ファイルを置いたり書き換えたりせず、必ず S3 API・mc・コンソールから操作します。
DockerでMinIOを起動する(公式の手順と注意)
この節では、Docker で MinIO を動かすときの公式の手順と、以前の記事の手順との違いが分かります。
2026年10月29日時点の公式 README は、「先に minio をビルドし、リポジトリの Dockerfile から自分でイメージを作る」手順を案内しています。この環境では Docker を起動していないため、以下は README の記載をもとにしたものです。
# README の手順:ビルドした minio をリポジトリ直下に置いてからイメージを作る
docker build -t myminio:minio .
docker run -p 9000:9000 -p 9001:9001 myminio:minio server /tmp/minio --console-address :9001
開発環境で Docker Compose を使う場合は、作ったイメージを指定し、資格情報とデータの置き場を足す形になります。次は README の docker run を Compose に置き換えた例です。
services:
minio:
image: myminio:minio # 自分でビルドしたイメージ
command: server /data --console-address :9001
ports:
- "127.0.0.1:9000:9000" # 開発用なら手元だけに公開
- "127.0.0.1:9001:9001"
environment:
MINIO_ROOT_USER: devadmin
MINIO_ROOT_PASSWORD: change-me-dev-only
volumes:
- minio-data:/data
volumes:
minio-data:
- 検索上位の記事でよく見る
minio/minioやquay.io/minio/minioのイメージを使う場合は、タグの日付を確かめます。README は以前のバイナリについて「更新されない」と書いているため、イメージも同じ扱いになると考えて選ぶのが安全です。 - 以前の記事にある環境変数
MINIO_ACCESS_KEY・MINIO_SECRET_KEYは、今の README ではMINIO_ROOT_USER・MINIO_ROOT_PASSWORDに置き換わっています。
Compose ファイルの書き方そのものは、関連記事「Docker Composeの使い方|compose.yamlの書き方と開発環境の作り方」で扱っています。
MinIOのWebコンソールの使い方(Chromiumで確かめた画面)
この節では、MinIO の Web コンソールにログインしてバケットを作り、ファイルを上げるまでの画面と、この版のコンソールでできないことが分かります。
Web コンソールは --console-address で指定したポート(ここでは http://127.0.0.1:19131)をブラウザで開き、MINIO_ROOT_USER と MINIO_ROOT_PASSWORD でログインします。Chromium で実際に操作した流れは次のとおりです。
| 操作 | 画面に出たもの |
|---|---|
| コンソールを開く | ページの題名は「MinIO Console」。右側に「OBJECT STORE Community Edition」のロゴと Username・Password の入力欄、Login ボタン。開くまで約1.1秒 |
| パスワードを間違える | 画面上部に赤い帯で「invalid login.」 |
| 正しくログイン | 「License」のダイアログ(GNU AGPL v3 の説明)が出て、Acknowledge を押すと閉じる |
| 左のメニュー | Create Bucket・Filter Buckets・Buckets(バケット一覧)・Documentation・License・Sign Out だけ |
| Create Bucket | 「Bucket Name*」の入力欄だけのダイアログ。空のままだと「Invalid bucket name」 |
| Upload → Upload File | ファイルを選ぶと右上に「Downloads / Uploads」の進み具合(100%)。一覧に hello.txt・12.0 B が出た |
| バケットを開く | Object Browser に作成日・Access(PRIVATE や CUSTOM)・容量とオブジェクト数、Rewind・Refresh・Upload・Create new path。バージョニングを有効にしたバケットでは「Show deleted objects」も出た |
コンソールで作ったバケットに上げたファイルは、mc からもすぐに見えました。
$ mc ls local/console-made
[日時省略] 12B STANDARD hello.txt
この版のコンソールには、ユーザー・ポリシー・設定・監視の画面がありませんでした。/identity/users や /policies などの URL を直接開いても、バケットの画面に戻されます。以前の記事のスクリーンショットにある「Identity」「Access Keys」などのメニューは、この版では表示されません。ユーザーやポリシーの管理は、次の節の mc admin で行います。
コンソールでできた
ログイン・ログアウト
バケットの作成と一覧
アップロード・ダウンロード・閲覧・削除済みの表示
mc で行った
ユーザー・ポリシー・アクセスキーの作成
バージョニング・ライフサイクルの設定
サーバーの状態確認(mc admin info)
mc(MinIO Client)の使い方とコマンド早見表
この節では、MinIO 用の CLI である mc で、バケット作成・アップロード・一覧・同期・ユーザー管理を行う方法が、実行結果つきで分かります。
mc は「エイリアス名/バケット/キー」の形でパスを書き、ls・cp・cat・mirror など Unix のコマンドに似た名前で操作します。MinIO 以外の S3 互換ストレージにも使えます。
| やりたいこと | mc のコマンド | aws cli で書くと |
|---|---|---|
| 接続先を登録 | mc alias set local URL USER PASS |
プロファイルに endpoint_url と鍵を書く |
| バケットを作る | mc mb local/photos |
aws s3 mb s3://photos |
| アップロード | mc cp file local/photos/ |
aws s3 cp file s3://photos/ |
| 一覧(再帰) | mc ls -r local/photos |
aws s3 ls s3://photos --recursive |
| 中身を表示 | mc cat local/photos/a.txt |
aws s3 cp s3://photos/a.txt - |
| フォルダーを同期 | mc mirror site local/backup |
aws s3 sync site s3://backup |
| 差分を見る | mc diff site local/backup |
(aws s3 sync --dryrun で近いことができる) |
| 中身ごとバケット削除 | mc rb --force local/backup |
aws s3 rb s3://backup --force |
| サーバーの状態 | mc admin info local |
(S3 API には無い) |
基本操作を続けて実行した結果です(日時の欄は省略しています)。
$ mc mb local/photos
Bucket created successfully `local/photos`.
$ mc mb local/photos
mc: <ERROR> Unable to make bucket `local/photos`. Your previous request to create the named bucket succeeded and you already own it.
$ mc cp hello.txt local/photos/
`/dev/shm/t130/hello.txt` -> `local/photos/hello.txt`
$ mc cp big.bin local/photos/2026/big.bin
┌──────────┬─────────────┬──────────┬──────────────┐
│ Total │ Transferred │ Duration │ Speed │
│ 5.00 MiB │ 5.00 MiB │ 00m00s │ 163.09 MiB/s │
└──────────┴─────────────┴──────────┴──────────────┘
$ mc ls -r local/photos
[日時省略] 5.0MiB STANDARD 2026/big.bin
[日時省略] 12B STANDARD hello.txt
$ mc cat local/photos/hello.txt
hello minio
$ mc stat local/photos/hello.txt
Name : hello.txt
Size : 12 B
ETag : 64384843a05de6e2170ce9fe61645556
Type : file
Metadata :
Content-Type: text/plain
$ mc du local/photos
5.0MiB 2 objects photos
mirror と diff は、手元のフォルダーとバケットの同期に使えます。1ファイルを書き換えたあとの diff では、変わったファイルだけが「!」付きで出ました。
$ mc mirror site ec/site-backup
`/dev/shm/t130/site/css/a.css` -> `ec/site-backup/css/a.css`
`/dev/shm/t130/site/index.html` -> `ec/site-backup/index.html`
$ echo "<h1>changed</h1>" > site/index.html
$ mc diff site ec/site-backup
! http://127.0.0.1:19132/site-backup/index.html
$ mc mirror --overwrite site ec/site-backup
$ mc rb ec/site-backup
mc: <ERROR> `ec/site-backup` is not empty. Retry this command with ‘--force’ flag if you want to remove `ec/site-backup` and all its contents
$ mc rb --force ec/site-backup
Removed `ec/site-backup` successfully.
ユーザーとポリシーを作る(mc admin)
アプリには管理者(root)の鍵を渡さず、必要な権限だけを持つユーザーを作ります。photos バケットを読むだけのポリシーを作り、ユーザーに付けました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": ["arn:aws:s3:::photos", "arn:aws:s3:::photos/*"]
}
]
}
$ mc admin user add local appuser app-dummy-secret-130
Added user `appuser` successfully.
$ mc admin policy create local photos-readonly ro.json
Created policy `photos-readonly` successfully.
$ mc admin policy attach local photos-readonly --user appuser
Attached Policies: [photos-readonly]
To User: appuser
$ mc alias set app http://127.0.0.1:19130 appuser app-dummy-secret-130
$ mc ls app/photos
[日時省略] 12B STANDARD hello.txt
[日時省略] 0B 2026/
$ mc cp p.txt app/photos/x.txt
mc: <ERROR> Failed to copy `/dev/shm/t130/p.txt`. Insufficient permissions to access this path `http://127.0.0.1:19130/photos/x.txt`
$ mc mb app/other
mc: <ERROR> Unable to make bucket `app/other`. Access Denied.
$ mc admin user svcacct add local appuser
Access Key: NCQPAQOLD53VUPTQCCUR
Secret Key: (表示された値。ここでは省略)
Expiration: no-expiry
ポリシーの書き方は AWS の IAM ポリシーと同じ JSON です。読み取り専用のユーザーでは、一覧と取得はでき、書き込みとバケット作成は断られました。svcacct add は、ユーザーに紐づくアクセスキー(サービスアカウント)を発行するコマンドで、アプリごとに鍵を分けて、不要になったら消す運用に向きます。
aws cliでMinIOを使う(--endpoint-url の指定)
この節では、AWS CLI を MinIO に向けて使う設定と、署名付き URL を発行するときの注意が、実行結果つきで分かります。
aws cli は、--endpoint-url か、プロファイルの endpoint_url に MinIO の URL を書くと、S3 と同じコマンドで MinIO を操作できます。毎回指定すると忘れたときに AWS へ向かってしまうので、専用のプロファイルを作るのが安全です。
# ~/.aws/credentials(値はダミー)
[minio]
aws_access_key_id = rjcadmin
aws_secret_access_key = rjc-dummy-secret-130
# ~/.aws/config
[profile minio]
region = us-east-1
endpoint_url = http://127.0.0.1:19130
$ aws --version
aws-cli/1.46.2 Python/3.13.18 Linux/6.18.44-fc-v185 botocore/1.43.62
$ aws --profile minio s3 mb s3://reports
make_bucket: reports
$ aws --profile minio s3 cp hello.txt s3://reports/2026/hello.txt
upload: ./hello.txt to s3://reports/2026/hello.txt
$ aws --profile minio s3 ls s3://reports --recursive
(日時省略) 12 2026/hello.txt
$ aws --profile minio s3api get-bucket-versioning --bucket photos
{
"Status": "Enabled"
}
$ aws --profile minio s3api head-object --bucket reports --key 2026/hello.txt
{
"AcceptRanges": "bytes",
"ContentLength": 12,
"ETag": "\"64384843a05de6e2170ce9fe61645556\"",
"ContentType": "text/plain",
"Metadata": {}
}
20MB のファイルを aws s3 cp で上げると、ETag の末尾に「-3」が付きました。aws cli が自動でマルチパートアップロード(3つに分けて送る)にしたためで、S3 と同じ動きです。
$ aws --profile minio s3api head-object --bucket reports --key mp.bin --query ETag
"\"f860dba6eca518305c229e80bf2c9720-3\""
aws s3 presign の署名の形式
この環境の aws-cli 1.46.2(バージョン1系)では、aws s3 presign の URL が SigV2 の形式(AWSAccessKeyId・Signature・Expires)で出ました。MinIO はこの URL でも読めましたが、プロファイルに s3 = signature_version = s3v4 を足すと SigV4 の形式(X-Amz-Algorithm など)に変わります。
$ aws --profile minio s3 presign s3://reports/hello.txt --expires-in 600
http://127.0.0.1:19130/reports/hello.txt?AWSAccessKeyId=rjcadmin&Signature=l%2FQh...&Expires=...
# ~/.aws/config の [profile minio] に追記
s3 =
signature_version = s3v4
$ aws --profile minio s3 presign s3://reports/hello.txt --expires-in 600
http://127.0.0.1:19130/reports/hello.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=rjcadmin%2F...
$ curl "(上の URL)"
hello minio
$ curl "$(aws --profile minio s3 presign s3://reports/hello.txt --expires-in 700000)"
<Error><Code>AuthorizationQueryParametersError</Code><Message>X-Amz-Expires must be less than a week (in seconds); that is, the given X-Amz-Expires must be less than 604800 seconds</Message>...
SigV4 の署名付き URL の有効期限は最長7日(604800秒)です。それより長い値は URL の発行はできても、使うときに AuthorizationQueryParametersError になりました。aws s3 コマンドの使い方全般は、関連記事「aws s3コマンド一覧|cp・sync・ls実行例とオプション早見表」で扱っています。
boto3でMinIOを使う(Pythonのコード例)
この節では、Python の boto3 から MinIO に接続し、アップロード・一覧・取得・署名付き URL・エラー処理を行うコードと、その実行結果が分かります。
boto3 は endpoint_url を MinIO に向け、addressing_style を path にしておくと確実に動きます。実際に動かしたコードです。
import boto3, urllib.request
from botocore.client import Config
from botocore.exceptions import ClientError
s3 = boto3.client(
"s3",
endpoint_url="http://127.0.0.1:19130",
aws_access_key_id="rjcadmin", # 検証用のダミー
aws_secret_access_key="rjc-dummy-secret-130",
region_name="us-east-1",
config=Config(signature_version="s3v4", s3={"addressing_style": "path"}),
)
s3.create_bucket(Bucket="boto-demo")
s3.put_object(Bucket="boto-demo", Key="a/hello.json",
Body=b'{"msg":"hi"}', ContentType="application/json")
s3.upload_file("big.bin", "boto-demo", "a/big.bin")
for o in s3.list_objects_v2(Bucket="boto-demo", Prefix="a/")["Contents"]:
print(o["Key"], o["Size"], o["ETag"])
print("get:", s3.get_object(Bucket="boto-demo", Key="a/hello.json")["Body"].read())
# 署名付き URL(GET と PUT)
url = s3.generate_presigned_url("get_object",
Params={"Bucket": "boto-demo", "Key": "a/hello.json"}, ExpiresIn=300)
print("via urllib:", urllib.request.urlopen(url).read())
put_url = s3.generate_presigned_url("put_object",
Params={"Bucket": "boto-demo", "Key": "up/from-browser.txt"}, ExpiresIn=300)
req = urllib.request.Request(put_url, data=b"uploaded by presigned PUT", method="PUT")
print("presigned PUT status:", urllib.request.urlopen(req).status)
try:
s3.get_object(Bucket="boto-demo", Key="nope.txt")
except ClientError as e:
print("ClientError:", e.response["Error"]["Code"],
e.response["ResponseMetadata"]["HTTPStatusCode"])
a/big.bin 5242880 "f5b2fae06e1a802fb9278ff3565d36b6"
a/hello.json 12 "b2bae62267a867591e2a82d9f0d33064"
get: b'{"msg":"hi"}'
via urllib: b'{"msg":"hi"}'
presigned PUT status: 200
ClientError: NoSuchKey 404
署名付き URL の PUT は、ブラウザやスマホアプリから鍵を持たせずに直接アップロードさせたいときに使います。S3 で動くコードは、接続先を変えるだけで MinIO でも同じ結果になりました。
virtual-hosted 形式で接続できない例
S3 には、バケット名を URL のパスに入れる「パス形式」(http://host/bucket/key)と、ホスト名に入れる「virtual-hosted 形式」(http://bucket.host/key)があります。接続先を localhost にして2つを比べました。
virtual : EndpointConnectionError - Could not connect to the endpoint URL: "http://boto-demo.localhost:19130/?list-type=2&encoding-type=url"
path : ok
virtual-hosted 形式では、boto3 は boto-demo.localhost という名前に接続しようとし、名前が引けずに失敗しました。接続先を 127.0.0.1 のような IP アドレスにした場合は、boto3 がパス形式に切り替えたため成功しています。MinIO を DNS 名で動かすときは、ワイルドカードの DNS を用意するか、パス形式に固定します。boto3 で S3 を操作する基本は関連記事「boto3でS3を操作する方法|アップロード・ダウンロード・一覧取得」、署名付き URL の詳しい使い方は関連記事「S3署名付きURLの発行方法 CLI・boto3とPUTアップロード例」で扱っています。
MinIOの署名付きURL・公開設定・バージョニング・ライフサイクル
この節では、mc で署名付き URL・匿名アクセスの公開範囲・バージョニング・ライフサイクルを設定し、どう振る舞うかを実物で確かめた結果が分かります。
署名付き URL と匿名アクセス
MinIO のバケットは既定で非公開(PRIVATE)で、署名の無いアクセスは 403 AccessDenied になります。mc の share download で期限付きの URL を作り、curl で確かめました。
$ mc share download --expire 1h local/photos/hello.txt
URL: http://127.0.0.1:19130/photos/hello.txt
Expire: 1 hours 0 minutes 0 seconds
Share: http://127.0.0.1:19130/photos/hello.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=rjcadmin%2F...%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=cf29...
$ curl -i "(Share の URL)"
HTTP/1.1 200 OK
Content-Length: 12
Content-Type: text/plain
ETag: "64384843a05de6e2170ce9fe61645556"
Server: MinIO
...
hello minio
$ curl -i http://127.0.0.1:19130/photos/hello.txt
HTTP/1.1 403 Forbidden
Content-Type: application/xml
Server: MinIO
...
<Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Key>hello.txt</Key><BucketName>photos</BucketName>...
# 署名の最後の1文字を変えた
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>...
# 有効期限 2秒で作り、4秒待って開いた
<Error><Code>AccessDenied</Code><Message>Request has expired</Message>...
一部のプレフィックスだけを誰でも読めるようにするには mc anonymous set を使います。public/ の下だけを download(読み取り)にしたところ、public/ は 200、それ以外は 403 のままでした。
$ mc anonymous set download local/photos/public
Access permission for `local/photos/public` is set to `download`
$ mc anonymous get local/photos
Access permission for `local/photos` is `custom`
$ curl -o /dev/null -w "%{http_code}\n" http://127.0.0.1:19130/photos/public/p.txt
200
$ curl -o /dev/null -w "%{http_code}\n" http://127.0.0.1:19130/photos/hello.txt
403
S3 のバケットポリシーと同じ考え方で、公開の範囲はできるだけ狭くします。ポリシーの条件の書き方は関連記事「S3バケットポリシーの書き方と例 IP制限・Condition早見表」で扱っています。
バージョニング:消しても前の版を取り出せる
バージョニングを有効にしたバケットでは、上書きや削除をしても前の版が残ります。v1→v2 と上書きしてから削除し、版の一覧を見ました。
$ mc version enable local/photos
local/photos versioning is enabled
$ echo v1 > note.txt; mc cp note.txt local/photos/note.txt
$ echo v2 > note.txt; mc cp note.txt local/photos/note.txt
$ mc rm local/photos/note.txt
Created delete marker `local/photos/note.txt` (versionId=a893668c-2dc4-4b93-b852-3c1907968eb7).
$ mc ls --versions local/photos/note.txt
[日時省略] 0B STANDARD a893668c-2dc4-4b93-b852-3c1907968eb7 v3 DEL note.txt
[日時省略] 3B STANDARD 1d340668-7f47-4d39-9fea-38ce3e041919 v2 PUT note.txt
[日時省略] 3B STANDARD edc798d5-b1b0-46e0-b3eb-a667d0d40ac7 v1 PUT note.txt
$ mc cat local/photos/note.txt
mc: <ERROR> Unable to read from `local/photos/note.txt`. Object does not exist.
$ mc cat --version-id 1d340668-7f47-4d39-9fea-38ce3e041919 local/photos/note.txt
v2
削除は「削除マーカー(DEL)」が一番上に積まれるだけで、v1・v2 は残っています。版を指定すれば取り出せました。削除マーカーの消し方と復元の手順は S3 と同じで、関連記事「S3バージョニングの有効化と復元 削除マーカーの消し方CLI」で扱っています。
ライフサイクル:前の版や一時ファイルを自動で消す
バージョニングを有効にすると、前の版の分だけ容量が増え続けます。ライフサイクルの規則で、tmp/ の下は30日で、前の版は7日で消えるようにしました。
$ mc ilm rule add --expire-days 30 --prefix "tmp/" local/photos
Lifecycle configuration rule added with ID `dbi8k7lsd818ll97f6lg` to local/photos.
$ mc ilm rule add --noncurrent-expire-days 7 local/photos
Lifecycle configuration rule added with ID `dbi8k7lsd818lrer5ii0` to local/photos.
$ mc ilm rule ls local/photos
┌──────────────────────┬─────────┬────────┬──────┬────────────────┬─────────────────────┐
│ ID │ STATUS │ PREFIX │ TAGS │ DAYS TO EXPIRE │ EXPIRE DELETEMARKER │
├──────────────────────┼─────────┼────────┼──────┼────────────────┼─────────────────────┤
│ dbi8k7lsd818ll97f6lg │ Enabled │ tmp/ │ - │ 30 │ false │
└──────────────────────┴─────────┴────────┴──────┴────────────────┴─────────────────────┘
┌──────────────────────┬─────────┬────────┬──────┬────────────────┬───────────────┐
│ ID │ STATUS │ PREFIX │ TAGS │ DAYS TO EXPIRE │ KEEP VERSIONS │
├──────────────────────┼─────────┼────────┼──────┼────────────────┼───────────────┤
│ dbi8k7lsd818lrer5ii0 │ Enabled │ - │ - │ 7 │ 0 │
└──────────────────────┴─────────┴────────┴──────┴────────────────┴───────────────┘
規則は日数単位のため、この記事では「登録できて一覧に出る」ところまでを確かめ、実際に消える様子(30日・7日後)は待っていません。
MinIOのerasure codingの実測(ドライブを消しても読めるか)
この節では、MinIO の erasure coding(データを分割してパリティを付け、複数のドライブに分けて保存する仕組み)が、ドライブを失ったときにどう振る舞うかを実測で確かめた結果が分かります。
4つのディレクトリをドライブとして起動すると、MinIO は1つの erasure set(4台)を作り、パリティ EC:2 になりました。8MB のファイルは、4台それぞれに約4MB ずつ置かれました(データ2+パリティ2)。
$ minio server "./ec/d{1...4}" --address 127.0.0.1:19132 --console-address 127.0.0.1:19133
INFO: Formatting 1st pool, 1 set(s), 4 drives per set.
INFO: WARNING: Host local has more than 2 drives of set. A host failure will result in data becoming unavailable.
$ mc admin info ec
...
│ Pool │ Drives Usage │ Erasure stripe size │ Erasure sets │
│ 1st │ 18.7% (total: 16 GiB) │ 4 │ 1 │
4 drives online, 0 drives offline, EC:2
$ for d in 1 2 3 4; do find ec/d$d/vault/ec8.bin -type f -name "part.*" -printf "d$d: %s\n"; done
d1: 4194560
d2: 4194560
d3: 4194560
d4: 4194560
8MB(8,388,608バイト)を保存するのに、4台合計で約16MB を使っています。EC:2 の4台構成では、使える容量は全体の半分です(同じマシンの4ディレクトリなので、合計容量は実際の4倍の 16 GiB と表示されています)。
次に、ドライブの中身を1台ずつ消して(新しい空のディスクに替えた状態を再現)、読み書きを確かめました。読めたかどうかは、元のファイルと SHA-256 が一致するかで判断しています。
| 消したドライブ | 読み取り(8MB) | 書き込み | そのあと |
|---|---|---|---|
| なし | 読めた | できた | ― |
| 1台(d1) | 読めた(SHA-256 一致) | できた | 約20秒で d1 に全オブジェクトが自動で戻った |
| 2台(d1・d2) | 読めた(SHA-256 一致) | 失敗:Resource requested is unwritable | 読み取りだけ続けられる |
| 3台(d1〜d3) | 失敗:Resource requested is unreadable | 失敗 | データは戻らない |
1台を消したとき、サーバーのログには次のように出て、自動の修復(ヒーリング)が始まりました。
Error: Unable to load healing tracker on '/dev/shm/t130/ec/d1': unformatted drive found, re-initializing.. (*fmt.wrapError)
Healing drive '/dev/shm/t130/ec/d1' - 'mc admin heal alias/ --verbose' to check the current status.
Healing drive '/dev/shm/t130/ec/d1' - use 4 parallel workers.
# 2台消したあと
$ echo w2 | mc pipe ec/vault/after-2-lost.txt
mc: <ERROR> Unable to write to one or more targets. Resource requested is unwritable, please reduce your request rate.
# 3台消したあと
$ mc cat ec/vault/ec8.bin
mc: <ERROR> Unable to read from `ec/vault/ec8.bin`. Resource requested is unreadable, please reduce your request rate.
この結果は、公式ドキュメントの「読み取りには K 個のシャード、書き込みには K 台のドライブが要る。パリティ EC:M がちょうど erasure set の半分なら、書き込みの定足数は K+1」という説明どおりです。4台・EC:2 では K=2 なので、2台まで失っても読め、書き込みには3台が要ります。文言に「please reduce your request rate」と付きますが、原因は負荷ではなく定足数(クォーラム)の不足でした。
- 同じマシンのディレクトリを並べても、マシンが落ちれば全部使えません。起動時の「Host local has more than 2 drives of set」の警告はこのことです。ディスクの故障には強くなりますが、サーバーの故障に備えるには複数台の構成が要ります(コミュニティ版で組むか、AIStor Enterprise の範囲)。
- 公式ドキュメントは、本番の構成ではパリティを EC:3 以上にするよう書いています。erasure set に入れられるドライブは既定で2〜16台です。
- erasure coding はバックアップの代わりではありません。誤って消した・上書きしたデータは全ドライブで同じように消えるため、バージョニングや別の場所への複製と組み合わせます。
性能の目安(手元の小さな測定)
mc には性能測定の mc support perf object がありますが、この環境では外部の SUBNET への接続を求められ、--airgap を付けても「Please register the cluster first by running 'mc license register local'」と出て動きませんでした。代わりに boto3 で、同じ大きさのオブジェクトを順番に PUT・GET する速さを2回ずつ測りました(2 CPU・メモリ上のディレクトリ・並列なし)。
| 大きさ×回数 | 1ドライブ PUT/GET | 4ドライブ EC:2 PUT/GET |
|---|---|---|
| 4KiB×200 | 291〜379 / 256〜438 回/秒 | 303〜312 / 350〜392 回/秒 |
| 64KiB×100 | 21.9〜22.4 / 27.4〜29.9 MiB/秒 | 13.5〜16.2 / 19.2〜23.3 MiB/秒 |
| 4MiB×20 | 155〜184 / 381〜416 MiB/秒 | 149〜154 / 337〜430 MiB/秒 |
小さいオブジェクトでは1回ごとの往復(HTTP と署名)が支配的で、ドライブ数の差は小さく出ました。64KiB では 4ドライブの方が遅く、4MiB では差がほとんどありません。同じマシンで測った小さな値なので、本番の見積もりは実際のディスクとネットワークで並列にして測ります。
MinIOとS3の違いと使い分け(判断表)
この節では、MinIO と Amazon S3 で同じところ・違うところと、どちらを選ぶかの判断の材料が分かります。
API は同じでも、誰が運用するかが違います。S3 は AWS がディスク・冗長化・更新を受け持ち、MinIO は自分で受け持ちます。
| 観点 | MinIO(コミュニティ版) | Amazon S3 |
|---|---|---|
| 置き場所 | 自分のサーバー・PC・社内 | AWS のリージョン |
| API | S3 API(aws cli・boto3 がそのまま動いた) | S3 API(本家) |
| 冗長化 | erasure coding を自分で設計(ドライブ数・パリティ) | AWS が受け持つ |
| ユーザー・権限 | mc admin でユーザーとポリシー(IAM と同じ JSON) | IAM・バケットポリシー |
| リージョン | 既定は us-east-1。この版はクライアントの指定と違っても通った | バケットごとに決まる(AWS の仕様) |
| URL の形 | IP・localhost ではパス形式が実質の前提 | virtual-hosted 形式が基本 |
| 費用 | ソフトは無料(AGPLv3)。サーバー・ディスク・運用の手間 | 容量・リクエスト・転送量の従量課金 |
| 更新・保守 | 2026年10月29日時点でリポジトリは保守終了。ソースから自分でビルド | AWS が更新 |
リージョンは実際に試しました。MinIO 側を ap-northeast-1 に設定し(mc admin config get ec site で region=ap-northeast-1 を確認)、クライアントを us-east-1・eu-west-1・ap-northeast-1 にしてバケットを作ると、この版ではどれも成功し、作ったバケットの所在地はすべて ap-northeast-1 と返りました。S3 の互換は「よく使う操作が同じ」という意味で、細かな振る舞いまで同じとは限りません。本番が S3 なら、最後の確認は S3 で行います。
どれを選ぶかは、次の順で考えると決めやすくなります。
- 1開発・テストで「手元の S3」が欲しい → MinIO(単体)データが消えても困らない用途。CI で毎回作って捨てる
- 2本番が AWS で、運用の手間を持ちたくない → Amazon S3冗長化・更新・監視を AWS に任せる
- 3データを社外に出せない・閉じた環境 → MinIO などのセルフホストディスク・バックアップ・更新を自分で持つ体制があるか
- 4セルフホストで保守と更新の保証が欲しい → 商用版(AIStor など)を比較ライセンスの範囲(単体か分散か)を公式で確かめる
- 5容量単価や転送量を下げたい → S3 互換のクラウドストレージも比較Wasabi・Cloudflare R2・Backblaze B2 など。料金体系は各社の公式で
| こういうとき | 向く選択 | 理由 |
|---|---|---|
| S3 を使うアプリの単体テスト・CI | MinIO(1ドライブ) | 約4秒で起動し、endpoint を変えるだけで同じコードが動いた |
| 本番の大事なデータ・止められないサービス | Amazon S3 など運用込みのサービス | 冗長化・更新・監視を自分で持たずに済む |
| 閉じたネットワークで長く使うストレージ | セルフホスト(保守の方針を決めてから) | コミュニティ版はソースからの自前ビルドと更新が前提になった |
| ファイル共有(OS からフォルダーとして使う) | NAS・ファイルサーバー | MinIO は HTTP の API で使う形で、フォルダーとしてマウントする道具ではない |
MinIOのよくあるエラーと直し方(原文つき)
この節では、MinIO を aws cli・boto3・mc・コンソールから使ったときに実際に出たエラーの原文と、原因・直し方が分かります。
| エラーの原文 | 出た場面 | 原因と直し方 |
|---|---|---|
An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we calculated does not match the signature you provided. |
aws cli でシークレットキーを間違えた。署名付き URL の一部が変わった | シークレットキーを確かめる。URL はコピーの途中で切れていないか、& がエスケープされていないかを見る |
An error occurred (InvalidAccessKeyId) ... The Access Key Id you provided does not exist in our records. |
存在しないアクセスキー | MINIO_ROOT_USER か、mc admin user で作ったユーザー名・サービスアカウントのキーを使う |
AccessDenied / Access Denied. |
署名なしで開いた。権限の無いユーザーでバケット作成 | 署名付き URL を使う・mc anonymous で公開範囲を決める・ポリシーに Action を足す |
Insufficient permissions to access this path |
読み取り専用ユーザーで mc cp | ポリシーに s3:PutObject を足すか、書き込めるユーザーを使う |
AccessDenied / Request has expired |
期限切れの署名付き URL | URL を発行し直す。サーバーと手元の時計のずれも確かめる |
X-Amz-Expires must be less than a week (in seconds) |
有効期限 700000 秒で presign | 604800 秒(7日)以下にする |
Could not connect to the endpoint URL: "http://127.0.0.1:19139/" |
サーバーが動いていない・ポート違い | 起動ログの API: の行のアドレスとポートに合わせる |
SSL validation failed ... [SSL: WRONG_VERSION_NUMBER] |
http で動く MinIO に https で接続 | endpoint を http:// にするか、MinIO に TLS の証明書を設定する |
Could not connect to the endpoint URL: "http://boto-demo.localhost:19130/..." |
boto3 の virtual-hosted 形式 | addressing_style: "path" にする |
NoSuchBucket / NoSuchKey |
バケット名・キーの綴り違い | mc ls・aws s3 ls で実際の名前を確かめる |
InvalidBucketName / Bucket name contains invalid characters |
My_Bucket のように大文字・アンダースコアを含む名前 | 小文字・数字・ハイフン(とドット)で3〜63文字にする |
Unable to locate credentials. |
--profile を付け忘れた aws cli | プロファイルを指定する。鍵を環境変数で渡す場合は AWS_ACCESS_KEY_ID なども確かめる |
invalid login. |
Web コンソールのパスワード違い | MINIO_ROOT_USER・MINIO_ROOT_PASSWORD か、作ったユーザーの値でログインする |
Resource requested is unwritable / unreadable |
erasure set のドライブが足りない | mc admin info でオフラインのドライブを確かめ、ディスクを戻す。負荷の問題ではない |
エラーの多くは「接続先」「鍵」「権限」のどれかです。迷ったら次の順に確かめると切り分けが速くなります。
- 1接続先が MinIO を向いているかaws cli は --debug、boto3 はエラーの URL を見る。endpoint を付け忘れると AWS に向かう
- 2http と https、ポートが起動ログと同じかAPI と Web コンソールはポートが別。S3 API に送るのは API の方
- 3鍵の組み合わせが正しいかInvalidAccessKeyId はキー、SignatureDoesNotMatch はシークレットの誤りが多い
- 4そのユーザーのポリシーで許されている操作かmc admin user info でポリシー名を見て、Action と Resource を確かめる
- 5サーバー側でドライブが欠けていないかmc admin info の「drives online/offline」と EC: の値を見る
よくある質問
Q. MinIOは無料で使えますか?
A. コミュニティ版は GNU AGPLv3 のオープンソースで、ソフトの利用料はかかりません。ただし2026年10月29日時点で配布はソースコードのみ、リポジトリは保守終了と表示されています。改変して外部に提供する場合などは AGPLv3 の義務を確かめます。
Q. MinIOとAmazon S3は同じものですか?
A. 別の製品です。MinIO は S3 と同じ API を話すため、aws cli や boto3 から同じように使えますが、運用(ディスク・冗長化・更新)は自分で受け持ちます。
Q. MinIOのデフォルトのユーザー名とパスワードは?
A. 環境変数を指定しないと minioadmin:minioadmin で起動し、「Detected default credentials」の警告が出ました。開発用でも MINIO_ROOT_USER と MINIO_ROOT_PASSWORD を指定しておくのが安全です。
Q. MinIOのポート9000と9001の違いは?
A. 9000 は S3 API(aws cli・boto3・mc が話す先)、9001 は Web コンソールとしてよく使われる番号です。API は --address、コンソールは --console-address で決め、コンソールは指定しないとランダムなポートになります。
Q. Webコンソールでユーザーを作れません。
A. この記事で動かした RELEASE.2025-10-15T17-29-55Z のコンソールには、ユーザー・ポリシーの画面がありませんでした。mc admin user add・mc admin policy create・mc admin policy attach で作ります。
Q. 1台のPCで複数ドライブにすれば安全ですか?
A. ディスク1〜2台の故障には耐えられますが、PC そのものが壊れれば全部使えなくなります。手元の実測でも、4台中3台を失うと読めなくなりました。大事なデータは別の場所への複製やバックアップと組み合わせます。
Q. MinIOのデータディレクトリを直接見てファイルを取り出せますか?
A. 取り出す前提にしないのが安全です。オブジェクトは xl.meta と part ファイルに分かれ、小さいものは xl.meta の中に入っていました。erasure coding では1台に全データがありません。読み書きは S3 API・mc・コンソールから行います。
Q. boto3で接続できないときに最初に見るところは?
A. endpoint_url と addressing_style です。localhost などのホスト名で virtual-hosted 形式になると、bucket.localhost に接続しようとして失敗しました。Config(s3={"addressing_style": "path"}) を付けると動きました。
Q. Dockerの minio/minio イメージは今でも使えますか?
A. 公式 README は、Dockerfile から自分でイメージを作る手順を案内しています。配布済みのイメージを使う場合は、タグの日付を確かめ、更新されない前提で選びます。この記事では Docker は動かしていません。
まとめ
- MinIOとは、S3 と同じ API で使えるオブジェクトストレージを自分で動かすソフトです。aws cli・boto3・mc は接続先を変えるだけで同じコマンド・コードが動きました。
- コミュニティ版は2026年10月29日時点で、ソース配布のみ・リポジトリは保守終了です。以前の記事のバイナリやイメージの手順は、更新されない前提で扱い、長く使うなら保守の方針を先に決めます。
- この版の Web コンソールはバケットとオブジェクトの操作が中心で、ユーザーとポリシーは mc admin で作ります。アプリには root の鍵を渡さず、必要な権限だけのユーザーを作ります。
- 4ドライブ・EC:2 では、2台分のデータを消しても読め、書き込みには3台が要り、3台を失うと読めませんでした。1台の喪失は約20秒で自動修復されました。マシン全体の故障や誤削除には別の備えが要ります。
- エラーは「接続先・鍵・権限・ドライブ」の順に切り分けると速く直せます。boto3 はパス形式、署名付き URL は7日以内、を押さえておくとつまずきが減ります。
参考・出典
以下はいずれも2026年10月29日に確認しました。
- MinIO(GitHub)「minio/minio README」:https://github.com/minio/minio
- MinIO(GitHub)「License Compliance」:https://github.com/minio/minio/blob/master/COMPLIANCE.md
- MinIO Documentation「Erasure Coding」:https://docs.min.io/community/minio-object-store/operations/concepts/erasure-coding.html
- MinIO Documentation「MinIO Client(mc)」:https://docs.min.io/community/minio-object-store/reference/minio-mc.html
- MinIO Documentation(AIStor)「Deploy on Red Hat Linux」:https://docs.min.io/community/minio-object-store/operations/deployments/baremetal-deploy-minio-on-redhat-linux.html
- MinIO「Download(AIStor Free・Enterprise)」:https://min.io/download
- GNU Affero General Public License v3.0:https://www.gnu.org/licenses/agpl-3.0.html
- Boto3 Documentation「S3 client」:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html
- AWS CLI Command Reference「s3 presign」:https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MinIOとは・使い方|S3互換ストレージを自前で動かす手順とエラー原文」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。