MinIO Clientを使ってみた

3回連続でMinIOネタになっちゃった。

MinIOではmcというCLIを提供していることを知ったので試してみた。 詳しい使い方はこちらに書いてある。

MinIO | MinIO Client Quickstart Guide

事前準備:Minio Serverを起動しておく

dockerを用いて手元にMinIO Serverを立てておく。 詳しくは過去記事 MinIOを触ってみた - rsym’s diary を参照。今回の記事ではここへ向けてmcを実行する。

$ docker run -d --name minio_container -p 9000:9000 minio/minio server /data
fc35d67f860df59715922eb1dff6ed60c8d1f8941d59032a1064907796883848

$ docker ps -f name=minio_container
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                                       NAMES
fc35d67f860d   minio/minio   "/usr/bin/docker-ent…"   33 seconds ago   Up 31 seconds   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   minio_container

MinIO Clientのインストール

Mac(Homebrew)、Linux(Binary)、Windows(Binary)、Dockerといろんな環境で利用できるように用意されている。 goで記述されたソースからインストールすることもできる。 今回はMac(Homebrew)を利用してみる。

$ brew install minio/stable/mc

エイリアスの設定

次に、エンドポイントやアクセスキーなどの情報にエイリアスを付与する。 mcではエイリアスを用いてオブジェクトストレージへアクセスする。

コマンドの構文は以下の通り。

mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> --api <API-SIGNATURE> --path <BUCKET-LOOKUP-TYPE>

実際に設定してみる。 デフォルトのアクセスキーでMinio Serverを起動したので、アクセスキーはminioadmin:minioadminである。

$ mc alias set minio http://127.0.0.1:9000 minioadmin minioadmin
mc: Configuration written to `/Users/<username>/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/Users/<username>/.mc/share`.
mc: Initialized share uploads `/Users/<username>/.mc/share/uploads.json` file.
mc: Initialized share downloads `/Users/<username>/.mc/share/downloads.json` file.
Added `minio` successfully.

エイリアス~/.mc/config.jsonというファイルにjsonで出力される。 上記コマンドで設定したエイリアスminioという名前で記述されている。 minio以外にも、gcslocalplays3という4つのエイリアスがデフォルトで記述されている。 エイリアスを設定しておけば、GCSやS3でmcを利用することもできる。

$ cat ~/.mc/config.json
{
        "version": "10",
        "aliases": {
                "gcs": {
                        "url": "https://storage.googleapis.com",
                        "accessKey": "YOUR-ACCESS-KEY-HERE",
                        "secretKey": "YOUR-SECRET-KEY-HERE",
                        "api": "S3v2",
                        "path": "dns"
                },
                "local": {
                        "url": "http://localhost:9000",
                        "accessKey": "",
                        "secretKey": "",
                        "api": "S3v4",
                        "path": "auto"
                },
                "minio": {    ⬅これが設定したエイリアス
                        "url": "http://127.0.0.1:9000",
                        "accessKey": "minioadmin",
                        "secretKey": "minioadmin",
                        "api": "s3v4",
                        "path": "auto"
                },
                "play": {
                        "url": "https://play.min.io",
                        "accessKey": "***********************",
                        "secretKey": "***********************",
                        "api": "S3v4",
                        "path": "auto"
                },
                "s3": {
                        "url": "https://s3.amazonaws.com",
                        "accessKey": "YOUR-ACCESS-KEY-HERE",
                        "secretKey": "YOUR-SECRET-KEY-HERE",
                        "api": "S3v4",
                        "path": "dns"
                }
        }
}%

~/.mc/config.json以外に~/.mc/share/uploads.json~/.mc/share/downloads.jsonというファイルも生成されている。 これらはmcコマンドでアップロード・ダウンロード用の共有URLを生成したときに、そのURLが記録されるファイルのようだ。 download.jsonの出力例については後述する。

いろいろ実行してみる

各実行コマンドのminioの部分がエイリアスである。 <alias>/<bucket>/path/to/<object>というふうに記述することで、目的のバケット・オブジェクトを参照できる。

バケット作成

$ mc mb minio/sample-bucket
Bucket created successfully `minio/sample-bucket`.

オブジェクトのPUT

$ mc cp sample-object minio/sample-bucket/
 0 B / ?  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓

$ mc cp sample-object2 minio/sample-bucket/
 0 B / ?  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓

バケットとオブジェクトの参照

$ mc ls -r minio/
[2021-06-19 16:43:30 JST]     0B sample-bucket/sample-object
[2021-06-19 16:44:26 JST]     0B sample-bucket/sample-object2

特定のオブジェクトをダウンロードするための共有URLを生成

URLは~/.mc/share/downloads.jsonにも記録される。

$ mc share download minio/sample-bucket/sample-object
URL: http://127.0.0.1:9000/sample-bucket/sample-object
Expire: 7 days 0 hours 0 minutes 0 seconds
Share: http://127.0.0.1:9000/sample-bucket/sample-object?X-Amz-Algorithm=.....................

$ cat ~/.mc/share/downloads.json
{
        "version": "1",
        "shares": {
                "http://127.0.0.1:9000/sample-bucket/sample-object?X-Amz-Algorithm=.....................": {
                        "share": "http://127.0.0.1:9000/sample-bucket/sample-object",
                        "versionID": "",
                        "date": "2021-06-19T08:04:29.236446Z",
                        "expiry": 604800000000000
                }
        }
}%

ユーザ作成

ACCESSKEY:SAMPLEUSER、SECRETKEY:SAMPLEKEYとして生成する。

$ mc admin user add minio SAMPLEUSER SAMPLEKEY
Added user `SAMPLEUSER` successfully.

$ mc admin user list minio
enabled    SAMPLEUSER

使ってみての所感

S3だとs3cmdaws s3を利用することもあるが、これらのCLIと遜色ない使いやすさだと感じた。 brewで入れてaliasを入れればすぐに利用できるし、aliasがあることで複数のバケットを使い分けられるのも便利。 s3cmdaws s3でも使い分けはできるけど、mcのほうがよりコンパクトに記述できる点は個人的にいいなと感じた。

ただし、さすがにS3やGCSの全機能をカバーしているわけではなさそうなので(CloudFrontディストリビューションの利用とか)、S3/GCSのCLIの完全な代替えとまではいかなそう。 それでも使い勝手がかなりいいので、積極的に利用してみようかなと思った。

余談:MinIOの遊び環境

設定されているのエイリアスのうちplayというのは https://play.min.io/ という遊び環境として利用できるMinIO Serverへのエイリアスである。 バケット作成、オブジェクトのPUT/DELETE、ユーザ管理、など自由に利用できる。 とりあえずMinIOを触ってみたいという人は、この環境を活用するのも手だろう。

ただし、文字通り「遊び環境」であり、だれでも自由に利用できる環境である。 第三者が用意したバケットやオブジェクトなども参照できるし、自身が作成したものも第三者から参照できるのでその点は要注意。 たとえば mc ls playと実行するだけで既存バケットやオブジェクトを参照できる。 用途を限定した上で活用しよう。