minio

S3 互換のシンプルなオブジェクトストレージ Minio を使う

More than 1 year has passed since last update.

概要

Minio (https://www.minio.io/) は AWS の S3 と互換の API を持ったオブジェクトストレージ。
golang で書かれており実行ファイル 1つを起動するだけでストレージサーバーになるという気軽さが売り。

分散化は必須では無くて、その分簡単にオブジェクトストレージが構築できるのでスモール環境で利用したり、S3 利用アプリケーション開発時のローカルテスト用に使うと便利。

久しぶりに触ってみたら案外良い感じに仕上がっていたのでお勧め記事を書くことにした。

Minio サーバーの起動

インストール

公式サイトから wget 等でダウンロードするか、go でビルド。

go get -u github.com/minio/minio

コマンドラインから

特に準備は必要なく、保存先ローカルストレージパスを指定して minio を起動するだけ。
起動時コンソールにアクセスキーとシークレットキー、リージョン名が表示されるのでメモしておく。

minio server /mnt/store

bind を指定するには --address スイッチを指定する。指定の書式は IP:PORT で省略時のデフォルト値は :9000

minio server --address 192.168.0.1:9000 /mnt/store

Docker コンテナで起動

コンテナでの起動が最近のお勧めパターンらしい。

docker run -p 9000:9000 -d --name minio minio/minio server /export

引数(minio/minio 部分以降)は minio にそのまま渡されるので変更可能だけれども、通常このままでOK。
この例だと /export はコンテナ内ファイルシステムなので実際は永続化のために /export を volume でどこかに配置することになると思う。

Docker のコンソールログにアクセスキーとシークレットキー、リージョン名が表示されるので表示させてメモしておく。

docker logs minio

最近のインテルCPUを搭載したミドルランク以上な NAS では仮想化環境として Docker コンテナを実行できるものがある。(QNAP や Synology など)
そういった NAS の上で Minio コンテナを起動すると NAS のストレージ部分をマウントして使えてとても魅力的なシステムとなる。

Minio を利用するクライアントサイド

ブラウザUI

miyuki.yippee_2017-02-19_12-44-29.jpg

起動後 API のアドレスにブラウザでアクセスするとファイル管理ができる UI が表示される。
ファイルのアップロード、ダウンロード、削除とかがここでできるのでこれだけでも十分有用だったりする。

アクセス時の認証にアクセスキーとシークレットキーを聞かれるので入力する。
複数アカウントに対応しているわけではないので、そういう意味でも簡易 UI として捉えるのが良い。

cli クライアント

コマンドライン上からファイルをコピー等管理するために mc (minio-client) という名前のコマンドが用意されている。
昔から Linux を使っている人は Midnight Commander (mc) とコマンド名が重なっていて気になるかもしれない。

mc も go で書かれているので実行ファイル 1つだけのお手軽さ。

実行の際には ~/.mc/config.json の設定が必要。ここにアクセス先サーバーとアクセスキー等を「サーバー名」毎に予め設定しておく。

config.json
{
  "version": "8",
  "hosts": {
    "(任意のサーバー名)": {
      "url": "http://(サーバーのアドレスとポート):9000/",
      "accessKey": "(minio 起動時に表示されるアクセスキー)",
      "secretKey": "(minio 起動時に表示されるシークレットキー)",
      "api": "S3v4"
    }
  }
}

config ファイルを直接編集しなくても mc コマンドで追記することもできる。

mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> <API-SIGNATURE>

S3 サーバーも記述できるので利用するサーバーを複数登録しておいてサーバー名で分別しながら使う事が可能。

サーバー名やバケットはパス名として与える形になる。

mc ls (サーバー名)/(バケット名)/(ファイルパス)

これまで S3 アクセスの cli は s3cmd を好んで使っていたけれども、mc はそれに近い感じだったので乗り換えることにした。
S3 互換なので当然 AWS cli や s3cmd も使えるので、お好みで選択する。

Minio SDK

公式に存在している Minio SDK は go/java/node/python となっている。
といっても AWS SDK の S3 も使えるのでそれ以外のプログラミング言語(rubyとか)でも困ることは無い感じ。

product 環境が S3 を指向しているとしたら最初から AWS SDK を使う場面が多いかもしれない。

使いどころ

オブジェクトストレージはファイルシステムと違って疎結合なのだけれども、それゆえにマシンや環境に依存しない形でファイルストアしたい時には有用ではないかと考える。

常に悩まされ続ける Docker の永続ストレージ問題だけれども、マイクロサーバーアーキテクチャや環境依存性を考慮すると Volume Driver に依存するより API 経由でのやりとりの方が簡潔になったりする。
読み書きが頻繁なシステムに適用はできないけれども、日々データを収集し続けて蓄積して行くようなシステムではオブジェクトストレージの方が簡素に構成できる。

といったわけで使い道が見つかり次第なのだけれども、それが見つかると便利かつお手頃なので気軽に試して貰いたい次第。