鱒身(Masu_mi)のブログ

知った事をメモする場所。

Minioを試した

tl;dr

今回やったこと

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

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

今回知ったこと

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

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

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

$ minio mode memory limit 100m expire 1h

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

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インストール

$ 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

$ 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=
Expect: 100-continue

s3cmd 使って見る

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

s3cmdのインストール

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

$ 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と解釈されているっぽかった。

$ 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
...

そのほか

調べてたらs3curl に不具合があった。PutBucket の末尾に”/”を入れたらkey名”null”PutObject になる。 さすがにこれはダメだと思う。あと、sudo -E が何故か効かないので直したい。

$ ./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