こんにちは。バックエンドエンジニアのまさくにです。
数年前に「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で問題なく動きましたし、開発も大変便利な時代になったのだと思います。ありがとう、世の中の天才開発者たち。でも僕の仕事時間が変わらないのはなぜでしょうか。
クローンと言えばマモーですね。僕もクローンが欲しいです。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。