それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

s3互換 minio を使って AmazonS3 の実験コストを節約する

Aws の S3 の代替サーバーを使う。

s3 の設定をいちいちするのはめんどくさいので、使い捨ての s3 が欲しくなる。

minio オブジェクトストレージ

minio というS3と同様のオブジェクトストレージが使えるサーバを使って、開発コスト(時間設定金銭)を下げてしまえ。

Docker で手軽に起動する

MASTER_KEY=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 ):$(openssl rand -hex 32)
docker run -it -e MINIO_SSE_MASTER_KEY=$MASTER_KEY restart=always -p 127.0.0.1:4569:9000  minio/minio server /data

ちなみに 4569 は fakes3 と合わせてある。

docker-compose に含めて、オブジェクトストレージ使い捨てのエミュレーションならdockerで十分

ローカルにオレオレS3としてサービスするんだったら。

オブジェクトストレージを自分で運営しようとすると、docker でもいいけど、フロント側でサーバー起動したほうが楽かもしれない。

サーバーのバイナリをとってきて、起動するのがいい。

/usr/bin/curl -LJO https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x ./minio
MASTER_KEY=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 ):$(openssl rand -hex 32)
export  MINIO_SSE_MASTER_KEY=$MASTER_KEY
./minio server /var/www/virtualhosts/path/storage --address  127.0.0.1:4569

こうしておけば、サービスとして動かせるので、S3の代わりにデータをどんどん放り込んでいける。

ただしmino にs3の完璧は互換性は無いし、ファイルのバージョニングなどの機能はないから注意が必要。

起動したら、次のような画面になる。

ここで AccessKey と Secret Keyを取得しておく

f:id:takuya_1st:20190829165317p:plain

ブラウザで( 今回は 127.0.0.1:4569:9000) にアクセスすると、なんとWebUIが使える。

これは評価高い。

f:id:takuya_1st:20190829165254p:plain

nginx でプロキシして、公開サーバとして使ってもいいと思う。

systemd でサービス化してみる。

systemd 起動する minio.service

[Unit]
Description=minio サーバーのインスタンス


[Service]
WorkingDirectory=/var/www/minio
ExecStartPre=/bin/bash update-minio.sh
ExecStart=/var/www/minio/minio server /var/www/minio/storage --address  127.0.0.1:4569


## 定期的に再起動して最新版を取得する
Restart=always
RuntimeMaxSec=864000

[Install]
WantedBy=network-online.target

systemd で起動しておく

sudo systemctl daemon-reload
sudo systemctl start minio
sudo systemctl status minio

サーバーバイナリの更新をどうするか

systemdで起動しても、もともとがwget で取得したバイナリなので、定期的にアップデートする必要がある。 apt で更新できる *.debが公開されてればよかったんだけどね。提供されてないようなので、自分で更新チェックをすることにした。どうせ1ファイルだし。

定期的に再起動しつつ、定期的にminio のサーバーバイナリを取得する

#!/usr/bin/env bash


cd  /var/www/minio


server_shas=$(curl -s https://dl.min.io/server/minio/release/linux-amd64/minio.shasum | cut -d' ' -f 1  )
local_sha=$( sha1sum minio | cut -d' ' -f 1  )


if [[  ! -e minio ]] ||
  [[ $server_shas != $local_sha ]] ||
  (( $(( $(date +%s) - $(date -r minio +%s)  )) > $(( 60*60*24*30 ))  )); then
  /usr/bin/curl -LJO https://dl.min.io/server/minio/release/linux-amd64/minio
  chmod +x ./minio
fi

s3cmd からの動作チェック

s3 互換ということなので、s3cmd のような s3 管理ツールからオブジェクトストレージとして使ってみる。

brew install s3cmd

~/.config/minio

設定ファイルを作っておく

[default]
host_base = 127.0.0.1:4569
host_bucket = 127.0.0.1:4569/%(bucket)s
bucket_location = us-east-1
use_https = True

access_key = HEDXXXXXXXXXXXXXXXXXXXXX
secret_key = cenXXXXXXXXX+XXXXXXXXXIkKe7LrqA

signature_v2 = True

minio を s3cmd で試してみます。

バケットの作成 mb:make bucket する。

takuya@.config$ s3cmd -c ~/.config/minio  mb    s3://sample
Bucket 's3://sample/' created

ファイルをアップロードする

takuya@.config$ s3cmd -c ~/.config/minio put -r /Users/takuya/Pictures/EAWBB3YUEAEmkOl-1.jpg  s3://sample
upload: '/Users/takuya/Pictures/EAWBB3YUEAEmkOl-1.jpg' -> 's3://sample/EAWBB3YUEAEmkOl-1.jpg'  [1 of 1]
 53125 of 53125   100% in    0s   388.63 kB/s  done

バケットの中身を確認する。

takuya@~$ s3cmd -c ~/.config/minio ls   s3://sample
2019-08-29 03:27     53125   s3://sample/EAWBB3YUEAEmkOl-1.jpg

バケットの閲覧

サイトにURLとして埋め込んで、アクセスキーなしにバケットを閲覧(HTTP/GET)しようとするには、管理画面でバケットのポリシーを設定するか,
公開ポリシーをs3cmd などで設定する必要がある。

まとめ

minio でAWS S3 にいちいちクレジットカードを登録しなくても、Amazon S3を使ったサーバーアプリケーションを使ったり、開発ができる。
クレジットカードの登録を経理通すとかめんどくさいし、ぱぱっと試せてるのは強いと思う。

今回は、試すというより、S3なくてminioでもういいじゃんってこと思ったので、S3をエミュレーションして永続ストレージとして使うような感じにした。

バージョニングとかgracier のようなバックアップなどは使えないが、分散ストレージは出来たりするので結構面白いソフトウェアなんじゃないかな

開発中のモックアップとしてはminioは大きすぎるのでfakes3のほうがいいかなと思った

参考資料