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

# はじめに

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

# Minioとは

[公式ページ](https://minio.io/)から引用すると

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

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

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

# スクリーンショット

ログイン画面

<img width="1436" alt="スクリーンショット 2017-05-08 17.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/ceefad80-4ad5-87b3-af79-9012e4f1bb83.png">

WEB UI

<img width="1435" alt="スクリーンショット 2017-05-08 19.10.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/82745/79b89f61-8abb-6869-456c-ab95c17183d2.png">

# サーバ構築

[クイックスタート](https://docs.minio.io/docs/minio-quickstart-guide)を参考に立ててみた。
僕はdockerが大好きなのでdockerで試すことにした。
大好きな理由はローカルの環境を汚さないことと、共有が楽だからである。

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

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

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

```bash
$ 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で操作

[公式のドキュメント](https://docs.minio.io/docs/aws-cli-with-minio)参照すると

やること

- Minio Serverを立てる(上でやった)
- [AWS CLI](https://aws.amazon.com/jp/cli/)インストール(`$ pip install awscli`)
- configure設定

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

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

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

以上。

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

```bash:バケットの作成
$ aws --endpoint-url http://192.168.99.100:8080/ s3 mb s3://test1
make_bucket: test1
```

```bash:バケットの一覧
$ aws --endpoint-url http://192.168.99.100:8080/ s3 ls
2017-05-08 18:54:37 test1
```

```bash:オブジェクトの追加
$ aws --endpoint-url http://192.168.99.100:8080/ s3 cp hogehoge.txt s3://test1
upload: ./hogehoge.txt to s3://test1/hogehoge.txt
```

```bash:バケットの中身一覧
$ aws --endpoint-url http://192.168.99.100:8080/ s3 ls s3://test1
2017-05-08 18:54:37          6 hogehoge.txt
```

```bash:オブジェクトの削除
$ aws --endpoint-url http://192.168.99.100:8080/ s3 rm s3://test1/hogehoge.txt
delete: s3://test1/hogehoge.txt
```

```bash:バケットの削除
$ 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ユーザー的なのが複数用意できない？
- バケットごとでユーザーによるアクセス制限できない？
- 分散の設定調べてない

# まとめ

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