コマンド1つで作れる！かんたん自宅Amazon S3互換環境！

#Amazon S3って？
**追記:
以下の記事で紹介したS3互換環境を使って，サムネイルサーバーを作ってみました！！**

**[サーバーレスの入門に！自宅サーバーレス+自宅S3環境で作るサーバーレス・サムネイルサーバー！](http://qiita.com/kotauchisunsun/items/856e7ecb65bb06f85ffa)**





ざっくりというとAmazonが提供している"ファイルサーバーのようなもの"です．

公式ドキュメントによると

>Amazon Simple Storage Service はインターネット用のストレージサービスです。また、ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計されています。

引用：[Amazon S3 とは何ですか？](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)

厳密にはAmazon S3はオブジェクトストレージの一種で，

> オブジェクトストレージはデータをファイル単位やブロック単位ではなく、オブジェクトという単位で扱います。オブジェクトにはストレージシステムのなかで固有のID（URI）が付与され、データとそれを扱うためのメタデータによって構成されています。 メタデータは通常のファイルシステムでも作成日や作成者などの情報を持っていましたが、オブジェクトではデータの種類、保存期間やコピー回数など、より多くの情報を付加できます。

引用：[オブジェクトストレージとは何か](http://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/beginner/object-storage/)

というものです．

S3のイメージを私なりに，すごく粗い言い方をすると，「RESTFullなAPIを備えたKVSのようなファイルサーバー」と，とらえています．
基本的には，KVSと同じで，固有のキー(ID)を持ってて，そこに対し，ファイルのデータが入ります．それがCurlのようなHTTPリクエストでファイルをアップロードしたり，ダウンロードしたりすることが出来る．一方で，普通のファイルシステムのように階層構造を作ったりすることはしないストレージ．というイメージでしょうか．

#Minioって？

https://www.minio.io/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/8921f32c-8a90-a59a-f79e-7efd1ed12b5b.png)

Go言語で作られたAmazon S3互換のオブジェクトストレージのシステムです．
ライセンスはApache License 2.0で，Lambda Functionsにも対応しているようで，Amazon Lambdaとの連携もできるようです．今回はこのMinioを導入してみようと思います．

他にもAmazon S3互換を謳うオープンソースのプロダクトはあるのですが，一時期のマストドンブームの際に，

[Mastodon のインスタンス作成時につまづいたところメモ](http://qiita.com/rerofumi/items/025f458089d462846a5f)

という記事を読んで，「Amazon S3も互換品ならオンプレミスで動かせるんだ！」と気づき，やってみようと思いました．Minioに関する記事は非常に少ないですが，読んでみると，かなり簡単に導入が出来たので，私も紹介したくなりました．


#事前に必要な環境
Minioを一番簡単に使える方法はdockerです．そのため，事前にdockerが入っていることが前提です．そのため，ubuntuであれば

```
$ sudo apt-get install docker.io
```

の導入が必要です．


#インストール方法
今回作るMinioのインスタンスは，

| 設定する変数 | 値 | 
|:-:|:-:|
| Access Key | AKIAIOSFODNN7EXAMPLE |
| Secret Key | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

という設定で，8080ポートでサービスします．

```bash
$ sudo docker run --rm -p 8080:9000 -it \
       -e MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE \
       -e MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
       minio/minio server /export
```

**これで自宅にAmazon S3互換環境構築完了です！！**

上手く起動すると，このような表示になります．

```
$ sudo docker run --rm -p 8080:9000 -it -e MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE   -e MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY   minio/minio server /export
Created minio configuration file successfully at /root/.minio

Endpoint:  http://172.17.0.2:9000  http://127.0.0.1:9000
AccessKey: AKIAIOSFODNN7EXAMPLE 
SecretKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 

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

Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://172.17.0.2:9000 AKIAIOSFODNN7EXAMPLE wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Object API (Amazon S3 compatible):
   Go:         https://docs.minio.io/docs/golang-client-quickstart-guide
   Java:       https://docs.minio.io/docs/java-client-quickstart-guide
   Python:     https://docs.minio.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.minio.io/docs/dotnet-client-quickstart-guide

Drive Capacity: 87 GiB Free, 96 GiB Total
```

今回は，簡単に導入するため，永続化やコンテナの使いまわしは，無視しています．


#WebUIでの動作確認
Minioは標準でWebUIを持っています．先ほどのコマンドから，8080ポートで稼働しているのでwebブラウザで確認してみます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/87e09bfb-b291-9912-f4f5-b23a2f637080.png)

このような画面で，Access KeyとSecret Keyを求められるので，先ほどのキーを入れるとログインできます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139643/92ecc742-ff21-84ba-17aa-3087dee7e841.png)

ログインするとこんな感じの画面になります．右下の赤い+マークの部分から，「バケットの作成」「ファイルのアップロード」が出来ます．


#awscliからMinioを使う
##awscliとは

説明不要かもしれませんが，AWSを使うためのコマンドラインツールで，Amazonが公式に作っています．MinioはAmazon S3互換なので，このツールのS3の部分の機能が使えます．
公式の説明は，

*AWS Command Line Interface は、AWS のサービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数の AWS サービスを制御し、スクリプトを使用してこれらを自動化することができます。*

引用:[AWS Command Line Interface とは](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html)



##awscliの導入・設定

awscliのインストールもすごく簡単です．

```bash
$ sudo apt-get install python-pip
$ sudo pip install awscli
```

それに加えて，awscliの設定もします．基本的には，先ほどのAccess KeyとSecret Keyの2つを設定します．

```bash
$ aws configure
AWS Access Key ID [****************MPLE]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [****************EKEY]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: 
Default output format [None]:
```

これで準備は完了しました！


##awscliでの動作確認

少しだけAmazon S3について解説すると，最初にバケットと呼ばれるものを作ります．これがイメージとしてはフォルダに近くて，これにファイルをアップロードしていきます．しかし，フォルダとは違って階層的にフォルダを掘っていくことはできません．1フォルダに全ファイルを突っ込んでいく形で運用していきます．

awscli自体の使い方は，S3で使う時とほぼ同じです．しかし，１つだけオプションを付け加える必要があります．
それが--endpoint-urlという引数で，ここに自分が建てたMinioのサーバーを指定します．

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

```bash:バケットの一覧表示
$ aws --endpoint-url http://localhost:8080 s3 ls
2017-07-23 17:17:04 miniotest
```

```bash:ファイルのアップロード
$ aws --endpoint-url http://localhost:8080 s3 cp testfile s3://miniotest/testfile_from_local
upload: ./testfile to s3://miniotest/testfile_from_local
```

```bash:ファイルのダウンロード
$ aws --endpoint-url http://localhost:8080 s3 cp s3://miniotest/testfile_from_local testfile_from_s3
download: s3://miniotest/testfile_from_local to ./testfile_from_s3
```

```bash:ファイルの削除
$ aws --endpoint-url http://localhost:8080 s3 rm s3://miniotest/testfile_from_local
delete: s3://miniotest/testfile_from_local
```

```bash:バケット内のファイルの一覧表示
$ aws --endpoint-url http://localhost:8080 s3 ls s3://miniotest
2017-07-23 17:19:00          0 testfile_from_local
```

```bash:バケットの削除
$ aws --endpoint-url http://localhost:8080 s3 rb s3://miniotest
remove_bucket: miniotest
```


#まとめ

この土日に思い立って作ってみましたが非常に簡単でした．
私自身，AWSの経験がなく，既に自分でサーバーを借りているのに，追加で借りるのもなー．と思っていました．その中で，こんなに簡単にS3環境が建てられるのはうれしかったです．
また，今回はawscliの使い方を勉強するのも目的でした．最初は，「互換品だから公式のツールじゃまともに動いてくれないかな・・・」と若干不安な点もありましたが，動作には問題は出なかったので，非常に楽でした．そう考えると，MinioはよくできたS3互換環境なのかな．と思いました．
「会社内でS3使いたいけど，パブリッククラウドだとセキュリティが・・・」とか，「S3を勉強がてら軽く使ってみたいな．」という人には，Minioは簡単に建てられるのでおススメです．