MinIOオブジェクトストレージとmcクライアントを動かしてみる

はじめに

S3みたいなオブジェクトストレージで、ローカルで動かせるものが、なにかないか探しているときに、Minioというのがあることを教えてもらって、ちょっとインストールして、画像ファイルがダウンロードできるようになるまでやってみようと思います。
あと少しだけmcクライアントも使ってみたいと思います。
インストールはDokcerを用いてやろうと思います。

動かしてみる

環境

$ uname -srvmpio
Linux 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release  -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal


$ docker version
Client: Docker Engine - Community
 Version:           20.10.3
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        48d30b5
 Built:             Fri Jan 29 14:33:21 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.3
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       46229ca
  Built:            Fri Jan 29 14:31:32 2021
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

MinIOサーバを動かしてみる

メディアを用意しておく

初期データとして置いておくメディアファイルを置いておきます。
${YOUR_PROJECT_PATH}/media/imagesを作成して、適当な画像(01.png)を置いておきます。
今回は以下の画像を置いておきます。

f:id:yuya_hirooka:20210212112530p:plain

$ cd ${YOUR_PROJECT_PATH}/media

$ ls 

Serverのインストール

前述の通り、Dockerで
以下のコマンドでDocker上で動かすことができます。

$ docker run -v ${pwd}/media:/data -p 9000:9000 minio/minio:RELEASE.2021-02-11T08-23-43Z.hotfix.b3c56b53f server /data
Endpoint: http://172.17.0.2:9000  http://127.0.0.1:9000 

Browser Access:
   http://172.17.0.2:9000  http://127.0.0.1:9000

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD'

ここで、-v ${YOUR_PROJECT_PATH}/media:/dataで先程画像を配置して置いたディレクトリをコンテナの/dataにマウントしておきます。
ここでマウントされたディレクトリに、設定ファイルも含めたMinIOの諸々が保存されることになります。また、${YOUR_PROJECT_PATH}/mediaの配下に作成したimagesが作成されるバケット名となります。
また、ログに出力されている通り、デフォルトでのrootクレデンシャルは、minioadmin:minadminになります。この値はそれぞれMINIO_ROOT_USERMINIO_ROOT_PASSWORD環境変数から変更することができます。

UIを開いてバケットを確認 & ポリシーの変更

起動までできたので早速UIを開いて見たいと思います。
以下のURLからアクセスできます。

f:id:yuya_hirooka:20210212210016p:plain

ここのAccess KeySercret Keyはそれぞれデフォルト値であるminioadminを入力します。
すると以下のようながめに遷移します。

f:id:yuya_hirooka:20210212210239p:plain

画面からわかるとおりすでにimagesというバケットが作成されています。
このバケットのポリシーを変更しておきます。 サイドメニューのimagesにマウスオーバーすると三点リーダのようなものが表示されるのでそこをクリックすると以下のような選択肢が開かれるので、

f:id:yuya_hirooka:20210212210701p:plain

Edit policyを選択肢ます。
そして以下のようなポリシーを追加するためのダイアログが 表示されるので、今回はそのままAddボタンを押します。

f:id:yuya_hirooka:20210212210817p:plain

これで、サーバの準備は完了です。

cURLデータを取得する

サーバの準備はできたので取得してみようと思います。
以下のコマンドを叩きます。

$ curl localhost:9000/images/01.png --output 01.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18968  100 18968    0     0  18.0M      0 --:--:-- --:--:-- --:--:-- 18.0M

$ ll
合計 80
drwxr-xr-x  2 yuya-hirooka docker  4096  2月 12 21:12 ./
drwxrwxrwt 81 root         root   53248  2月 12 21:12 ../
-rw-r--r--  1 yuya-hirooka docker 18968  2月 12 21:12 01.png

mcクライアントを使ってみる

Clientのインストール

MiniIOのクライアントをインストールします。
Dockerを使うことも可能なようですが、今回はバイナリをインストールして利用してみたいと思います。
以下のコマンドを叩きます。

$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc
$ sudo mv mc /usr/bin/
$ mc --version
mc version RELEASE.2021-02-10T07-32-57Z

configエイリアスを登録しておく

msではいくつかのストレージの向き先をエイリアスという形で保存しておくことができます。
新しいエイリアスmc alias set [ALIAS URL] [ACCESSKEY] [SECRETKEY]コマンドで追加することができます。
例えば今回作成したサーバのエイリアスを登録しておくには以下のようにコマンドを実行します。

$ mc alias set test http://127.0.0.1:9000 minioadmin minioadmin

登録したエイリアス一覧をみるためにはmc alias lsコマンドを用いて確認することができます。

$ mc alias ls
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       : 
  Path      : auto

play 
  URL       : https://play.min.io
  AccessKey : Q3AM3UQ867SPQQA43P2F
  SecretKey : zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
  API       : S3v4
  Path      : auto

s3   
  URL       : https://s3.amazonaws.com
  AccessKey : YOUR-ACCESS-KEY-HERE
  SecretKey : YOUR-SECRET-KEY-HERE
  API       : S3v4
  Path      : dns

test 
  URL       : http://127.0.0.1:9000
  AccessKey : minioadmin
  SecretKey : minioadmin
  API       : s3v4
  Path      : auto

バケットを作成して、ファイルをアップロードしてみる

バケットを作成するにはmc mb [FLAGS] TARGET [TARGET...]のコマンドを利用することで行えます。

$ mc mb test/image-01

次に、作成したバケットにイメージをアップロードします。
mc cp [FLAGS] SOURCE [SOURCE...] TARGETで行なうことができます。
作成したバケット01.pngをアップロードするには以下のコマンドで行なうことができます。

$ mc mv 01.png test/image-01

UIを確認するとバケットが作成されファイルがアップロードされているのが確認できます。

f:id:yuya_hirooka:20210212214013p:plain

mcコマンドで出来ることをざっくりまとめておく

最後にmcコマンドで行えることをまとめておきます。
mcコマンドは第一の引数でざっくりと行なうことが決定されます。 例えばバケットを作成して、ファイルをアップロードしてみるでは、mbmvを使いました。
その他にも以下のようなコマンドがあります。

コマンド 説明
alias コンフィグファイルを設定したり削除したりする
ls バケットやオブジェクトの一覧を表示する
mb バケットを作成する
rb バケットを削除する
cp オブジェクトをコピーする
mirror リモートサイトにオブジェクトをシンクロナイズする
cat オブジェクトのコンテンツを表示する
head オブジェクトの最初のn行を表示する
pipe 標準入力からの入力ストリームをオブジェクトに変換する
share 一時的にオブジェクトにアクセスできるようになるURLを生成する
find オブジェクトを検索する
sql オブジェクトに対してsqlクエリを発行する
stat オブジェクトのメタデータを表示
mv オブジェクトを移動させる
tree treeフォーマットでオブジェクトを表示する
du ディスクの使用量を再帰的にサマライズする
retention オブジェクトの保持期間を設定する
legalhold リーガルホールドをマネージする
diff 2つのオブジェクトの名前、サイズ、データなどのdiffを表示
rm オブジェクトを削除する
version バケットのバージョニングをマネージする
ilm バケットのライフサイクルをマネージする
encrypt バケットの暗号化の設定をマネージする
event オブジェクトの通知をマネージします
watch オブジェクトの通知イベントを監視する
undo PUT/DELETE オペレーションをundoする
policy アノニマスユーザのバケットに対するアクセスポリシーを変更する
tag バケットとオブジェクトのタグをマネージする
replicate サーバーサイドのバケットレプリケーションを設定する
admin MinIOサーバーをマネージする
update mcコマンドを最新のリリースにバージョンアップする