notebook

都内でWEB系エンジニアやってます。

minioを使ってS3の環境をローカルで再現する

minio

S3互換の環境を立ててくれるS3のクローンプロダクトだそうです

minio/minio: Minio is an object storage server compatible with Amazon S3 and licensed under Apache 2.0 License

github.com

開発環境などでS3を用いたCIをまわすときとかに料金を気にせずつかえそうですね

早速試してみましょう

インストール、起動

mkdir s3dir
curl https://dl.minio.io/server/minio/release/linux-amd64/minio > minio
chmod +x minio
./minio server s3dir

./minio ${command} ${directory}

サブコマンドとオブジェクトを保存するディレクトリを指定するとサーバが起動します

Endpoint:  http://192.168.30.93:9000  http://10.0.2.15:9000  http://127.0.0.1:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://172.19.0.1:9000
AccessKey: PX511CAFVA1T4DBVSV6B
SecretKey: YykbLA1NZ+vC9AhcialR6IgfB41tk4zebZnUPRbN
Region:    us-east-1

Browser Access:
   http://192.168.30.93:9000  http://10.0.2.15:9000  http://127.0.0.1:9000  http://172.17.0.1:9000  http://172.18.0.1:9000  http://172.19.0.1:9000

Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.30.93:9000 PX511CAFVA1T4DBVSV6B YykbLA1NZ+vC9AhcialR6IgfB41tk4zebZnUPRbN

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

エンドポイントやアクセスキーが表示されるのでそれを用いてCLIなどから操作していきます

WEB UI

デフォルトで9000番でサービスが起動してWEBからもminioに対して操作が出来ます

f:id:swfz:20160831031514p:plain

docker image

dockerのimageも用意してあるようなのでそっちを使ったほうが楽ですね

Minio Docs

https://docs.minio.io/docs/minio-docker-quickstart-guidedocs.minio.io

  • docker-compose.yml
  s3minio:
    image: minio/minio
    ports:
      - "9000:9000"
    volumes:
      - "./tmps3:/export"
    environment:
      - "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE"
      - "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

事前に./tmps3ディレクトリは作成しておきます

  • コンテナ起動
docker-compose up

これだけ、簡単すぎる!

一通り試してみる

環境構築が終わったのでSDK経由の操作をやってみます

credentialsはdocker-compose.ymlで指定した値を入力します

  • s3-in-minio.rb
require "aws-sdk-core"
require "tapp"

credentials = Aws::Credentials.new(
  'AKIAIOSFODNN7EXAMPLE',
  'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
)

client = Aws::S3::Client.new(
  credentials: credentials,
  region: 'us-east-1',
  endpoint: 'http://192.168.30.93:9000',
  force_path_style: true
)

client.list_buckets.tapp
res = client.list_objects(bucket: "sample")
res.contents.each do |o|
  puts "#{o.key}"
end

# バケットの作成
# client.create_bucket(bucket: 'aaa')
#
# ファイルのアップロード
# file = File.open("sample.txt")
# filename = File.basename("sample.txt")
# client.put_object(
#   bucket: "sample",
#   body: file,
#   key: filename
# )

# ファイルのダウンロード
# dl_filename = "index.html"
# File.open(dl_filename, "w") do |f|
#   client.get_object(bucket: "sample", key: dl_filename) do |chunk|
#     f.write(chunk)
#   end
# end

gemのインストール

[s3sample]$ gem install aws-sdk tapp

一通りためした後のbucketリストなどが表示されました

[s3sample]$ ruby s3-in-minio.rb
#<struct Aws::S3::Types::ListBucketsOutput
 buckets=
  [#<struct Aws::S3::Types::Bucket
    name="aaa",
    creation_date=2016-08-23 14:40:37 UTC>,
   #<struct Aws::S3::Types::Bucket
    name="sample",
    creation_date=2016-08-23 14:45:45 UTC>],
 owner=#<struct Aws::S3::Types::Owner display_name="minio", id="minio">>
index.html
sample.txt

まとめ

簡単にS3互換の環境をローカルに立てることが出来ました

プロダクションならS3でいいと思いますが、CI回したり、開発時のローカル環境用で使えそうです