あんパン

こしあん派

オブジェクトストレージ Minioで遊ぶ

これはKMC Advent Calendar 2015 15日目の記事です。

昨日は id:jf712 さんの @uiureo さん誕生日おめでとうございます - 霊安日記 でした。

目次

はじめに

こんにちは、id:masawadaです。KMC内でもアカウント名はmasawadaです。東京にある電気通信大学という大学に通っています*1。YAPC2015で入部しました。

本日はAmazon S3互換のオブジェクトストレージMinioを紹介します。

Minioとは

MinioはAmazon S3互換のオブジェクトストレージを構築するソフトウェアです。

Golangで記述されておりApache License v2の元で公開されています。

本体は非常にコンパクトで、ひとつのバイナリをfetchし実行権限をつけて叩くだけで起動することができます。例えばMacであれば以下の3コマンドで起動することができます。

$ curl https://dl.minio.io:9000/updates/minio/2015/Dec/darwin-amd64/minio > minio
$ chmod +x minio
$ ./minio server ./

以下のテキストは2015年12月12日時点でのものです。これ以降のバージョンでの動作は保証しません。

Minioの使い方

サーバを起動する

「はじめに」でも記述した通り、以下の3コマンドで取得と実行をすることができます。

$ curl https://dl.minio.io:9000/updates/minio/2015/Dec/darwin-amd64/minio > minio
$ chmod +x minio
$ ./minio server ./

64bitのLinuxであればURLが

https://dl.minio.io:9000/updates/minio/2015/Dec/linux-amd64/minio

に変わるだけです。詳しくはこのページをご覧ください。

実行するとカレントディレクトリを起点にオブジェクトストレージのサーバが起動します。初回起動時に$HOME/.minio/config.jsonが作成され、accessKeyIdおよびsecretAccessKeyが生成されます。これらのキーはMinioを起動したコンソールにも表示されるので、控えておきましょう。

サーバを叩く

MinioにはmcというCLIがあり、これを用いることでオブジェクトストレージを操作することができます。しかしコマンドがAmazon S3のAPIとは対応しておらず直感的でないのでここでは取り扱いません。詳しくはGitHubのリポジトリをご覧ください。

Node.jsから叩く

MinioのJavaScript向けライブラリがあるため、これを用いることができます。事前にnpm i minioしましょう。

以下のコードを保存し実行権限を付与して叩くことでBucketsのリストを表示することができます。

#!/usr/bin/env node

var Minio = require('minio');

var s3client = new Minio({
  url:  'http://localhost:9000',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY'
});

s3client.listBuckets(function(e, bucketStream) {
  bucketStream.on('data', function(obj) {
    console.log(obj);
  });
});

Minioオブジェクトを初期化する際、ライブラリのバージョンが0.2.9ではエンドポイントをurlで指定します。2015年12月15日現在のmasterブランチにあるライブラリではこれがendPointとなるので注意してください。

Rubyから叩く

RubyにはMinioの公式ライブラリが存在しません。そこで、aws/aws-sdk-rubyを利用します。事前にgem install aws-sdkしましょう。

以下のコードを保存し実行権限を付与して叩くことで、Bucketsのリストを表示することができます。

#!/usr/bin/env ruby

require 'aws-sdk'

credentials = Aws::Credentials.new(
  'YOUR-ACCESSKEYID',
  'YOUR-SECRETACCESSKEY',
  nil
)

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

res = client.list_buckets
res.buckets.each do |bucket|
  p bucket.name
end

Amazon S3互換オブジェクトストレージに関する雑談

Minio向けライブラリのコードを読むとわかりますが、Amazon S3以外のS3互換オブジェクトストレージを叩く際、regionはus-east-1を指定しておくと良いそうです(おそらく何を指定しても同じと思いますが、、)。

S3互換のオブジェクトストレージには

  • Minio
  • Google Cloud Storage (Compatibility Mode)
  • Openstack Swift + Swift3 middleware
  • Ceph Object Gateway
  • Riak CS

などがあり、このうちMinio以外はSignatureの生成方式が若干古いため大方のMinio向けライブラリでは対応できません*2。ざっと見minio/minio-goのみ対応しているようでした。実際、openstack/swift3を見たところVersion 4 is not readyとなっていたので注意が必要です。

総評

1バイナリでそれなりのサーバが立ち上がるMinio、意外と使えるのではないかという感想です。特に、簡単なウェブサービスなどであればAmazon S3を開発のテストに使わなくても良くなるなどでメリットを享受できそうです。

ただ、開発のスピードがかなり速いため先人の記録が使い物にならないこともしばしばあります。前述の通り、GitHubのドキュメントを読んでいたらnpmに上がっているライブラリのバージョンがほんの僅かに古く、masterブランチのサンプルコードが一切動かないという現象に遭遇しました。

じっくりと本体及びライブラリのコードを読む姿勢が大切と思います。

明日は id:itochan315 さんの番です。

宣伝

京大マイコンクラブではオブジェクトストレージが大好きな部員を募集しています。年齢性別所属宗教等の制限はありません。東京の大学に通っていても入部可能です。詳しくは以下の案内をご覧ください。

*1:大阪電気通信大学でも、国立(くにたち)にあるわけでもありません

*2:https://github.com/minio/minio-go/blob/dd3182/README.md