AWS S3ライクなオブジェクトストレージMinioを使ってみた

  • 3
    Like
  • 0
    Comment

はじめに

オブジェクトストレージとかS3使えばいいっしょとか思っていたんですが、
開発環境を作ったときに開発者一人ひとりにS3のバケット切って管理してもらうとか、
まあめんどくさくいつか絶対共有で使うバケットができてしまうなって思っており、何かないかなって探してたらMinioを見つけた。

Minioとは

公式ページから引用すると

Minio is a distributed object storage server built for cloud applications and devops.

意訳
Minioは、クラウドアプリケーションとdevops用に作られた分散オブジェクトストレージサーバーです。

他にもなんか色々書かれてて気になったところで言うと、
- Amazon S3 v4 APIの実装してあるからAWS CLIとか使える
- ライセンスはApache License 2.0
- Goで書いたから軽量でいい感じ

スクリーンショット

ログイン画面

スクリーンショット 2017-05-08 17.23.55.png

WEB UI

スクリーンショット 2017-05-08 19.10.59.png

サーバ構築

クイックスタートを参考に立ててみた。
僕はdockerが大好きなのでdockerで試すことにした。
大好きな理由はローカルの環境を汚さないことと、共有が楽だからである。

クイックスタートに書かれてる内容は下記である。
しかし、アクセスキーが立ち上げるたびに違ったりすると開発時にはこまるので固定化する方法を探すことにした。

$ docker pull minio/minio
$ docker run -p 9000:9000 minio/minio server /export

上記にポートの変更とバックグラウンド実行とアクセスキーの固定とデータの永続化を追加して上げると下記になる。アクセスキーとシークレットキーはAWSのサンプル用のキーと合わせた。実際に実行する場合は環境変数などに埋めて渡したり docker secret コマンドを使ったりするべきだと思う。

$ docker run -p 8080:9000 \
  -d \
  -e MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE \
  -e MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
  -v "/mnt/export/minio:/export" \
  -v "/mnt/config/minio:/root/.minio" \
  minio/minio server /export

あとは表示された情報でアクセスするだけで動作が確認できる
(Browser Accessはdocker hostのip+port番号に読み替える必要がある)

Endpoint:  http://172.100.0.1:9000  http://127.0.0.1:9000
AccessKey: AKIAIOSFODNN7EXAMPLE
SecretKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Region:    us-east-1
SQS ARNs:  <none>

Browser Access:
   http://172.100.0.1:9000  http://127.0.0.1:9000

AWS CLIで操作

公式のドキュメント参照すると

やること

  • Minio Serverを立てる(上でやった)
  • AWS CLIインストール($ pip install awscli)
  • configure設定

というわけでconfigureの設定のみです。

direnv を使っているので好きなディレクトリで$ direnv edit . をしてやりたいところですが、direnv 説明がめんどくさいのでコマンドベースで設定します。

$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-east-1

以上。

あとはコマンドを実行していくだけです。

バケットの作成
$ aws --endpoint-url http://192.168.99.100:8080/ s3 mb s3://test1
make_bucket: test1
バケットの一覧
$ aws --endpoint-url http://192.168.99.100:8080/ s3 ls
2017-05-08 18:54:37 test1
オブジェクトの追加
$ aws --endpoint-url http://192.168.99.100:8080/ s3 cp hogehoge.txt s3://test1
upload: ./hogehoge.txt to s3://test1/hogehoge.txt
バケットの中身一覧
$ aws --endpoint-url http://192.168.99.100:8080/ s3 ls s3://test1
2017-05-08 18:54:37          6 hogehoge.txt
オブジェクトの削除
$ aws --endpoint-url http://192.168.99.100:8080/ s3 rm s3://test1/hogehoge.txt
delete: s3://test1/hogehoge.txt
バケットの削除
$ aws --endpoint-url http://192.168.99.100:8080/ s3 rb s3://test1
remove_bucket: test1

見ての通りAWS CLIのコマンドがそのまま使えるので(要endpoint-url)巷にあるawsライブラリのほとんどがそのまま使えると思われる(未検証)

良いところ

  • 構築ワンコマンド
  • AWS CLIで操作できる(他のクライントも動く)
  • 一時的にシェアー用のリンクを生成できる
  • ファイルをおいたとか削除したイベントが取得できるみたいなのでhookしたりできるみたい

良くないところ

調査不足感が否めないです。

  • IAMユーザー的なのが複数用意できない?
  • バケットごとでユーザーによるアクセス制限できない?
  • 分散の設定調べてない

まとめ

気軽に試せて楽しい。開発用途ぐらいならこれぐらいできればよさそう。
間違っているところなどあればコメントや編集リクエスト送っていただけると。