S3互換のストレージソフトMinioを試してみる

こんにちは。廣田です。
今回は、オブジェクトストレージサーバのMinioを試してみた記録です。

Minioについて

Minioは、Amazon S3に代表されるオブジェクトストレージを作ることができるソフトウェアです。Amazon S3のAPIと互換性があり、AWSが提供しているCLIや各言語向けのSDKを使うことができます。ソフトウェアそのものはGoで書かれており、Apache License 2.0の下で利用することができます。

Minioの起動

まずは動かしてみましょう。Dockerイメージが提供されているので、docker pullしてrunすれば使えます。お手軽です。

$ docker pull minio/minio
$ docker run -p 9000:9000 minio/minio server /export

起動すると、APIエンドポイントとアクセスキーが表示されます。終了する時はCtrl+Cです。

Created minio configuration file successfully at /root/.minio
Endpoint: http://127.0.0.1:9000
AccessKey: AKIAIOSFODNN7EXAMPLE
SecretKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Browser Access:
http://127.0.0.1:9000

Drive Capacity: 53 GiB Free, 59 GiB Total

「Browser Access」に表示されているURLにブラウザからアクセスすると、ストレージに保存されているファイルを確認できるページにアクセスできます。
スクリーンショット 2017-07-26 12.58.59

スクリーンショット_2017-07-26_13_02_38

データの永続化

Dockerで動かした場合、Minioのコンテナを破棄するとストレージに保存したファイルも消えてしまいます。このような場合、Dockerのvolumeオプションを使ってホストのディレクトリをマウントしてあげることでコンテナを破棄した時にファイルを残したり、新しく作成したMinioのコンテナから残しておいたファイルを参照できるようになります。

$ mkdir ~/minio
$ docker run -p 9000:9000 --name minio1 \
-v ~/minio/export/minio1:/export \
-v ~/minio/config/minio1:/root/.minio \
minio/minio server /export

アクセスキーの固定

デフォルトではMinioが起動する度にランダムなアクセスキーとシークレットが作成されますが、開発検証などで動かしたり止めたりする場合は同じものに固定しておいたほうが使いやすいと思います。コンテナの環境変数として”MINIO_ACCESS_KEY”と”MINIO_SECRET_KEY”を渡すことで、アクセスキーとシークレットを固定できます。

$ docker rm minio1(同名のコンテナは作成できないので一旦破棄)
$ docker run -p 9000:9000 --name minio1 \
-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
-v ~/minio/export/minio1:/export \
-v ~/minio/config/minio1:/root/.minio \
minio/minio server /export

Node.jsからアクセス

Node.jsからアクセスする場合、Minioの公式ライブラリまたはAWS SDKを使うことができます。ここでは、S3と互換性があることを検証するためAWS SDKを使ってアクセスしてみます。

サンプルコード(app.js)を以下に示します。Minioに接続する場合は、アクセスキーとシークレットに加えてエンドポイントとオプションを2つ(s3ForcePathStyle,signatureVersion)を指定する必要があります。

const AWS = require('aws-sdk');
const s3 = new AWS.S3({
  accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
  secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
  endpoint: 'http://127.0.0.1:9000',
  s3ForcePathStyle: 'true',
  signatureVersion: 'v4'
});

const params = {
  Bucket: 'darjeeling'
};
s3.listObjects(params, (error, data) => {
  if (error) {
    console.log(error);
  } else {
    console.log(data);
  }
});

コードの準備ができたら、npmでAWS SDKをインストールして実行してみましょう。Node.jsのバージョンは6.11.0を使っています。

$ npm install aws-sdk
$ node app.js
{ IsTruncated: false,
  Marker: '',
  NextMarker: 'head_phone.png',
  Contents:
    [ { Key: 'animal_hiyoko.png',
       LastModified: 2017-07-26T02:58:35.000Z,
       ETag: '"e7f31fd068c1d325433336a94f5c9b74"',
       Size: 25703,
       StorageClass: 'STANDARD',
       Owner: [Object] },
     { Key: 'bird_tsubame.png',
       LastModified: 2017-07-26T02:58:41.000Z,
       ETag: '"de049ee04abfc13d68163863690e3ed4"',
       Size: 22982,
       StorageClass: 'STANDARD',
       Owner: [Object] },
     { Key: 'head_phone.png',
       LastModified: 2017-07-26T02:58:45.000Z,
       ETag: '"381334446e1c54018e607cf9cb599b27"',
       Size: 31304,
       StorageClass: 'STANDARD',
       Owner: [Object] } ],
  Name: 'darjeeling',
  Prefix: '',
  Delimiter: '',
  MaxKeys: 1000,
  CommonPrefixes: [] }

ファイルの一覧が取得できました。簡単な例ですが、接続先を正しく設定できればあとはS3と同じように使えそうです。

まとめ

とりあえず動かしてみたレベルではありますが、ストレージサーバーを立てる手段として便利そうです。保存するファイルのサイズとS3の料金表を見ながら費用の計算をしたくないときや、ストレージサーバーをLAN内に閉じ込めつつデータのやり取りにS3のコードを流用して手間を省きたいときに良いのではないでしょうか。
今回はDockerイメージを使いましたが、バイナリファイルの場合もファイルを1つダウンロードして実行権限をつけるだけなのでお手軽に使うことができます。

今後も面白そうなソフト/ツールが出てきたらどんどん試していきたいと思います!

SNSでもご購読できます。