minioをmcコマンドから操作する – バケット作成からアクセス可能にする

なぜmcコマンドから行うの?

minioを4年近く使っています。
misskeyやmastodonを初め、Object Storageを利用するものに対し、S3代替として利用できるようにするためです。
minioを利用すれば家のストレージをS3互換なObject Storageとして利用できます。

misskeyやmastodonはSNSのため画像のアセットの量が多く、転送量もかかります。
小規模サーバであればパブリッククラウドでも問題ありませんが、規模が大きくなるにつれてコストが厳しくなってきます。
そこでminioは救世主でした。

少し前のアップデートで、Web UIからObjectのBrowse以外の機能が排除されました。
これについては様々な議論が巻き起こっていますが、このブログでは触れません。

以前はWeb UIからバケットやユーザの作成、ポリシーの割当などを行っていましたが、今後は代替のWeb UIを使うか、mcコマンドより行う必要があります。

代替のWeb UIも存在するようですが、公式でないため、いつまで更新が行われるか不安ですので、公式のコマンドラインツールであるmcで一通りの操作を行いました。

公式のコマンドラインツールのページを見ればすべて書いてありますが、情報が散見していますし、Enterprise用の情報と混ざっているため、こちらにまとめ直すこととします。

今回は、misskeyやmastodonで使う時を想定します。
Getはminioのendpointが露出するのを避けるために、リバースプロキシを挟んで対応。
Bucket自体のPolicyは特定のDirectoryのみ、Getを許可するものです。

mcコマンドの準備

mcコマンド用のバイナリファイルを公式ページよりダウンロードしてください。
https://docs.min.io/community/minio-object-store/reference/minio-mc.html
公式のコマンドリファレンスも上記ページにありますので、ぜひ目を通してください。

minioサーバの登録

minioにつなぎます。
専用に作成したユーザから行っても問題ないかと思いますが、面倒ですので起動時に指定したrootアカウントを登録します。

mc alias set <お好きな登録名(以下alias)> http://<minioサーバのIP>:9000 <ユーザ名> <パスワード>

今回はminio-homeとして登録しました。
以下のように表示されれば成功です。

Added minio-home successfully.

正常に登録されたことを確認します

mc admin info minio-home

以下のような表示が得られます。

●  <minioサーバのIP>:9000
   Uptime: 10 hours
   Version: 2025-09-07T16:13:09Z
   Network: 1/1 OK
   Drives: 1/1 OK
   Pool: 1

┌──────┬───────────────────────┬─────────────────────┬──────────────┐
│ Pool │ Drives Usage          │ Erasure stripe size │ Erasure sets │
│ 1st  │ 27.3% (total: 14 TiB) │ 1                   │ 1            │
└──────┴───────────────────────┴─────────────────────┴──────────────┘

406 GiB Used, 2 Buckets, 1,407,670 Objects
1 drive online, 0 drives offline, EC:0

バケット関連の設定

minioサーバの登録が終わったら、バケットを利用できる状態にするため以下のことが必要です。
1. バケットの作成
2.ユーザの作成
3. ポリシーの作成
4. ユーザへのポリシーのアタッチ
5. バケットへのポリシーのアタッチ

以下ではそれらの手順をご紹介します。

バケットの作成

バケット作成にはmc mbコマンドを利用します。

mc mb <alias>/<バケット名>

今回はtest-bucketというバケットを作成します。

>mc mb minio-home/test-bucket
Bucket created successfully `minio-home/test-bucket`.

lsコマンドでバケットが作成されたことを確認します。

>mc ls minio-home
[2025-10-06 12:36:52 JST]     0B test-bucket/

ユーザの作成

続いて、作成したバケットを操作するためのユーザの作成します。
コマンドは以下のようになります。

mc admin user add <alias> <アクセスキー> <シークレット>

今回は以下のように作成します。
・アクセスキー: test-user
・シークレット: MYoAj9KCKOcijU

>mc admin user add minio-home test-user MYoAj9KCKOcijU
Added user `test-user` successfully.

以下のコマンドでユーザが作成されたことを確認します。

>mc admin user ls minio-home
enabled    test-user

ポリシーの作成

以下のコマンドでポリシーの一覧を確認できます。

mc admin policy ls <alias>
>mc admin policy ls minio-home
consoleAdmin
diagnostics
readonly
readwrite
writeonly

デフォルトで上記のポリシーが存在しています。

それぞれのポリシーの内容は以下のコマンドで確認できます。

mc admin policy info <alias> <ポリシー名>

もともと存在するreadonlyポリシーの内容を確認してみます。

>mc admin policy info minio-home readonly
{
 "PolicyName": "readonly",
 "Policy": {
  "Version": "2012-10-17",
  "Statement": [
   {
    "Effect": "Allow",
    "Action": [
     "s3:GetBucketLocation",
     "s3:GetObject"
    ],
    "Resource": [
     "arn:aws:s3:::*"
    ]
   }
  ]
 }
}

AWS S3互換のポリシーが確認できます。
これらのデフォルトポリシーは対象のBucketを絞らない形ですので、絞ったPolicyを作成します。

内容をご理解している方はポリシーを直接編集してもよいですし、以下のようなGeneratorを利用することも可能です。
https://awspolicygen.s3.amazonaws.com/policygen.html

tmpの下に以下のようなtest-bucketにのみ全てのアクションを許可するポリシーを作成します。

>cat /tmp/test-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:*"
         ],
         "Resource": [
            "arn:aws:s3:::test-bucket/*"
         ]
      }
   ]
}

以下のコマンドで読み込ませます。

mc admin policy create <alias> <policy名> /tmp/test-policy.json

今回は以下のようになります。

>mc admin policy create minio-home test-policy /tmp/test-policy.json
Created policy `test-policy` successfully.

ポリシーの追加がされたことを確認します。

>mc admin policy ls minio-home
consoleAdmin
diagnostics
readonly
readwrite
writeonly
test-policy

>mc admin policy info minio-home test-policy
{
 "PolicyName": "test-policy",
 "Policy": {
  "Version": "2012-10-17",
  "Statement": [
   {
    "Effect": "Allow",
    "Action": [
     "s3:*"
    ],
    "Resource": [
     "arn:aws:s3:::test-bucket/*"
    ]
   }
  ]
 },
 "CreateDate": "2025-10-06T03:57:43.841Z",
 "UpdateDate": "2025-10-06T03:57:43.841Z"
}

ユーザへのポリシーのアタッチ

作成したユーザtest-userに、作成したポリシーtest-policyをアタッチします。
以下のコマンドを利用します。

mc admin policy attach <alias> <ポリシー名> --user <ユーザ名>

今回は以下のようになります。

>mc admin policy attach minio-home test-policy --user test-user
Attached Policies: [test-policy]
To User: test-user

ポリシーがアタッチできたことを確認します。

>mc admin user ls minio-home
enabled    test-user             test-policy

ユーザ名の横に、ポリシー名が表示されます。

バケットへのポリシーのアタッチ

今回はバケット内のObjectのGetはPublicに許可します。
例えばリバースプロキシを挟んで毎回認証させたうえでGetする場合、この手順は不要で、Privateなバケットのままで構いません。
またバケットごと公開したい場合はPublicなバケットにすることもできます。
今回はリバースプロキシを挟んでGetしますが、毎回認証を行うまではする必要がないため、バケットにカスタムなポリシーをアタッチします。

まず、mc anonymous getコマンドでBucketのポリシーを確認します。

>mc anonymous get minio-home/test-bucket
Access permission for `minio-home/test-bucket` is `private`

バケットはprivateな状態です。

もともと定義が存在するものは以下の4つです。
・none – 匿名アクセスを無効化
・download – downloadのみ匿名アクセス可
・upload – uploadのみ匿名アクセス可
・public – download・upload両方とも匿名アクセス可

それぞれのもともと定義されたポリシーに設定する場合は以下のようなコマンドを利用します。

>mc anonymous set none <alias>/<バケット名>
>mc anonymous set download <alias>/<バケット名>
>mc anonymous set upload <alias>/<バケット名>
>mc anonymous set public <alias>/<バケット名>

今回はカスタムして、jsonで設定しておきます。

ユーザの時と同じく、jsonファイルを用意します。

>cat /tmp/test-bucket-policy.json
{
 "Statement": [
  {
   "Action": [
    "s3:GetObject"
   ],
   "Effect": "Allow",
   "Principal": {
    "AWS": [
     "*"
    ]
   },
   "Resource": [
    "arn:aws:s3:::test-bucket/*"
   ]
  }
 ],
 "Version": "2012-10-17"
}

バケットにアタッチするためには、以下のコマンドを利用します。

mc anonymous set-json <jsonファイル> <alias>/<bucket名>

今回は以下のようになります。

>mc anonymous set-json /tmp/test-bucket-policy.json minio-home/test-bucket
Access permission for `minio-home/test-bucket` is set from `/tmp/test-bucket-policy.json`

ポリシーを適応できたことを確認します。

>mc anonymous get minio-home/test-bucket
Access permission for `minio-home/test-bucket` is `custom`

>mc anonymous get-json minio-home/test-bucket
{
 "Statement": [
  {
   "Action": [
    "s3:GetObject"
   ],
   "Effect": "Allow",
   "Principal": {
    "AWS": [
     "*"
    ]
   },
   "Resource": [
    "arn:aws:s3:::test-bucket/*"
   ]
  }
 ],
 "Version": "2012-10-17"
}

動作の確認

今回はAWS cliを利用して動作を確認します。

まずprofileを利用してminioを登録します。

>aws configure --profile minio-home
AWS Access Key ID [None]: test-user
AWS Secret Access Key [None]: MYoAj9KCKOcijU
Default region name [None]: us-east-1
Default output format [None]:

AWS Signature Version 4を有効にします。

aws configure set default.s3.signature_version s3v4

先程作成したバケットのみが読み取れることを確認します。

>aws --endpoint-url http://<minioサーバのIP>:9000 --profile minio-home s3 ls
2025-10-06 12:36:52 test-bucket

テスト用のファイルを用意してアップロードします。
今回は001.1Mbytes.datというファイルを用意しました。

>aws --endpoint-url http://<minioサーバのIP>:9000 --profile minio-home s3 cp 001.1Mbytes.dat s3://test-bucket
upload: ./001.1Mbytes.dat to s3://test-bucket/001.1Mbytes.dat

アップロードが完了したことを確認します。

>aws --endpoint-url http://<minioサーバのIP>:9000 --profile minio-home s3 ls s3://test-bucket
2025-10-06 13:34:12    1048576 001.1Mbytes.dat

wgetでObjectが取得できることを確認します。

>wget -O /dev/null http://<minioサーバのIP>:9000/test-bucket/001.1Mbytes.dat
--2025-10-06 13:36:05-- http://192.168.15.40:9000/test-bucket/001.1Mbytes.dat
192.168.15.40:9000 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1048576 (1.0M) [binary/octet-stream]
`/dev/null' に保存中

/dev/null 100%[===================================================================================================================>] 1.00M 5.19MB/s 時間 0.2s

2025-10-06 13:36:06 (5.19 MB/s) - `/dev/null' へ保存完了 [1048576/1048576]

さいごに

S3互換をセルフホストすることで、大量のデータを扱わなければならない場合、コストカットになります。

web uiがなくなったことで、少し面倒になりました。
ただ、minioはaws s3互換ですので、aws cliからも操作できますし、公式のコマンドラインツール mcも公開されています。

各社のS3互換Object Storageで同じように操作が行えますので、コマンドラインツールに慣れておくとよいと思います。

この記事に書いてある内容について何らかのご意見やご要望がある方は以下のメールアドレスまでご連絡ください
[email protected]

タイトルとURLをコピーしました