Minioを試した

tl;dr

今回やったこと

Minioを立ち上げて色々なクライアントで叩いてみた。 MinioHaystackを参考にしたS3互換のオブジェクトストレージで下のような特徴がある。

  • Minio はGoで書かれている
  • Haystackに影響を受けているらしい
  • 少なくともdefaultでは匿名ユーザーで利用可能(ObjectStorage界のSQLiteっぽい)
  • 専用のライブラリが用意されている
  • S3互換なのでS3エコシステムを流用可能

今回知ったこと

  • s3fsではマウント失敗, 何故かtcpdumpでパケット見つけられず要調査 - Minio はURLのハンドリングが上手くない : - S3cmd でPutBucket は機能しない
  • 匿名ユーザを受け付けるので単なるCurlで利用可能
  • s3curlにURL末尾が/のGetBucketでGetObject(Key名null)するバグあり

公式クライアント(mc) から利用する

Minio は以下のコマンドで立ち上げる。

1
$ minio mode memory limit 100m expire 1h

公式クライアント(mc)が用意されている。今回はバイナリを落とした。 Usageをみるとls, mb, cp, catなど基本操作っぽいサブコマンドが存在するので使ってみる。

1
2
3
mc ls http://127.0.0.1:9000
mc mb http://127.0.0.1:80/test
mc cp ./access.log http://127.0.0.1:9000/trial-minio

実行結果

s3curlで使って見る

s3curlでもmbは動いた。

s3curlインストール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ yum install perl-ExtUtils-Manifest
$ curl -L http://cpanmin.us | perl - --sudo App::cpanminus
$ cpanm YAML HTTP::Date Digest::HMAC_SHA1 URI::Escape
$ sudo `which cpanm` ExtUtils::MM_Unix Digest::HMAC_SHA1 URI::Escape
export PERL5LIB=/home/xtetsuji/lib:/var/lib/site_perl
# Digest::HMAC_SHA1が入らなかったのでとりあえずyumから入れた。
$ sudo yum install perl-Digest
$ wget https://raw.github.com/ksauzz/s3curl/master/s3curl.pl
$ chmod 755 ./s3curl.pl
$ mv ./s3curl.pl ~/local/bin

s3curl -> minio@localhost

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ s3curl.pl --id minio --key dummy --put /dev/null -- -v http://localhost:9000/test2
# 以下別コンソールでみたtcpdump結果
# 作るのは成功した
PUT /test2 HTTP/1.1
User-Agent: curl/7.29.0
Host: localhost:9000
Accept: */*
Transfer-Encoding: chunked
Date: Sat, 17 Oct 2015 09:47:30 GMT
Authorization: AWS minio:RYoc+6rJ8/d2f1b9NLF0fftVhQs=

s3cmd 使って見る

結論書くとPutBucket に失敗する。 MinioのAPIディスパッチがアクセスURL末尾の/の影響でPutObjectと判断されてしまうから。

s3cmdのインストール

v1.6.0を使いたく(yumだと1.5.0)下を行った。 pip入れるのは面倒だったので直接setup.pyした。

1
2
3
4
$ wget http://sourceforge.net/projects/s3tools/files/s3cmd/1.6.0/s3cmd-1.6.0.tar.gz/download -O s3cmd-1.6.0.tar.gz
$ tar zxvf s3cmd-1.6.0.tar.gz
$ cd ./s3cmd-1.6.0
$ python setup.py install

s3cmd -> minio@localhost

以下のようになり失敗した。curlを使い調べた結果、 URL末尾に/があるとPutObjectと解釈されているっぽかった。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ s3cmd mb s3://test --no-ssl
# 別コンソールから覗いたやり取り
PUT http://127.0.0.1:9000/test/ HTTP/1.1
Host: 127.0.0.1:9000
Accept-Encoding: identity
Content-Length: 0
Authorization: AWS minio:LwYzYPYokVJYVupuDDvjb2coda4=

HTTP/1.1 403 Forbidden
...

そのほか

あとでPRを出して解消しました。

調べてたらs3curlに不具合があった。 PutBucket の末尾に/を入れたらkey名nullのPutObjectになる。 さすがにこれはダメだと思う。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ ./s3curl.pl --id minio --key dummy --put /dev/null -- -H "x-amz-date: Sat, 17 Oct 2015 10:11:30 GMT" -H "Date:" -v http://127.0.0.1/test9/
PUT /test9/null HTTP/1.1
User-Agent: curl/7.29.0
Host: 127.0.0.1
Accept: */*
Transfer-Encoding: chunked
Date: Sat, 17 Oct 2015 11:00:34 GMT
Authorization: AWS minio:CVXie3vSB6ZnDU0B4o1g3E8R0y8=
x-amz-date: Sat, 17 Oct 2015 10:11:30 GMT
Expect: 100-continue

HTTP/1.1 403 Forbidden
comments powered by Disqus