NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2018.06.29
バックエンドへの道

開発のためにローカルにもS3が欲しいというわがまま、MINIOが叶えてくれました

まさくに

こんにちは。バックエンドエンジニアのまさくにです。

数年前に「Vagrantはどこに消えた?」などと思っていましたが、私もうダメ、認めざるをえない。Dockerのことを愛してしまった。もうDockerなしのWebサイト、Webサービス制作は考えられなくなってきました。Webに関わる多くの方がそうなのではないでしょうか。

ただ、本番環境をAWSで作ろうというとき(ECSを使うなどであれば話は別かもしれませんが)、「どうやって構成をローカルのDockerで再現しようか」と迷うリソースがあります。直近の案件ですと、S3が必要でした。

そこだけAWSで作っておいて、開発時につなぎにいくというのもなくはない。でも、できればローカルだけで構築して依存をなくしたい。そこだけステージングや本番と違うロジックなんかは使いたくない。いい方法ないかなぁ、ないかなぁと思ってですね、一生懸命、探しました。

わりとすぐに見つかったので、本日はDockerで簡単に動かせるS3のクローンにスタジオまで来てもらっています! それではどうぞー!

S3互換のMINIO

概要

探してみたところ、MINIOというソフトウェアを見つけました。このMINIOはS3に互換のあるオブジェクトストレージです。GOで作成されており、最初にリリースされたのは2016年2月のようです。知りませんでした。機能的にはS3のクローンにおさまらず、暗号化や独自のファイルシステムなどを備え、AWS SDKでも接続ができるとのこと。すごいな。

起動

公式ドキュメントを見ながらDockerで入れます。

$ docker run -p 9000:9000 minio/minio server/tmp/minio

すぐに下記のような情報が表示されました。起動したようです。

Endpoint:  http://172.17.0.2:9000  http://127.0.0.1:9000
AccessKey: RDGENDYW5WGHAYOTGT5M
SecretKey: VpulAXhwypwY1EAqpamO+ZQI5eT1y7azkD3uzsdL

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 RDGENDYW5WGHAYOTGT5M VpulAXhwypwY1EAqpamO+ZQI5eT1y7azkD3uzsdL

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

バケットを作る

AWS CLIでバケットを作ってみます。AWS CLIはあらかじめインストールしておいてください。先ほど表示された認証情報でprofileをまず作っておきました。

$ aws configure --profile minio_test
AWS Access Key ID : RDGENDYW5WGHAYOTGT5M
AWS Secret Access Key : VpulAXhwypwY1EAqpamO+ZQI5eT1y7azkD3uzsdL
Default region name :
Default output format :

それではバケットを作ります。本物のAWSへアクセスをするわけではないので、endpointの指定が必要です。

$ aws --endpoint-url http://127.0.0.1:9000 --profile minio_test s3 mb s3://minio-test-bucket
make_bucket: minio-test-bucket

作られたようです。

作ったバケットを確認する

下記コマンドでバケットの存在を確認できます。

$ aws --endpoint-url http://127.0.0.1:9000 --profile minio_test s3 ls
2018-05-24 18:49:45 minio-test-bucket

ちゃんとある。

オブジェクトをアップロードする

下記コマンドでMINIOへファイルをアップロードできます。

ito_masakuni@lig-mi % echo 'nemui no da' > nnd.txt
ito_masakuni@lig-mi % aws --endpoint-url http://127.0.0.1:9000 --profile minio_test s3 cp ./nnd.txt s3://minio-test-bucket
upload: ./nnd.txt to s3://minio-test-bucket/nnd.txt

管理画面について

ここでWeb管理画面からファイルを確認してみます。http://127.0.0.1:9000/ へアクセスするとAccess KeyとSecret Keyを聞かれますので、先ほどまでと同じものを入力してログインしてください。

超便利じゃないですか……。

オブジェクトを削除する

ファイルを削除します。

$ aws --endpoint-url http://127.0.0.1:9000 --profile minio_test s3 rm s3://minio-test-bucket/nnd.txt
delete: s3://minio-test-bucket/nnd.txt

削除されていますね。まあこの管理画面から削除してもいいんですけど。

誰かの仕事が誰かの仕事を支えている

MINIOを使えばオブジェクトストレージまで何の苦もなくローカル環境に構築することができます。さらにAWS SDKを使用できることから、本番環境と差異なくコードを書くことも可能です。一点、「EndPointを変更する」ことだけお気をつけください。

ほかにもElasticMQというSQSクローンがあり、こちらもDockerで問題なく動きましたし、開発も大変便利な時代になったのだと思います。ありがとう、世の中の天才開発者たち。でも僕の仕事時間が変わらないのはなぜでしょうか。

クローンと言えばマモーですね。僕もクローンが欲しいです。