追記: 空のバケットの事やゴミのことポリシー設定の事を考えると、やりたいことは、Minio (S3互換) で バージョン管理したデータを含めて永続化するでした(後で見つけた)。
目的
AWS S3を利用したアプリのローカルのデバッグのモックやユニットテストなどで、
- バケットはすでにインフラ側の設定として準備されている
- バケット内のオブジェクト/データは別処理が作成している
の様な構成の場合、MinIOのDockerコンテナーを使うのが良さそう。クライアント側からバケットを作り必要なデータをputするというのもあるかと思うが、コンテンテナー立上たら必要がデータが入っていてるのが便利かなぁと。
こちらのQiita記事 docker-composeでMinio起動時にデフォルトのbucketを作成する を参考にバケットの用意はできたが、テスト用のデータも仕込んでみた。
ディレクトリ構成
.
├── docker-compose.yml
├── entrypoint.sh
└── test_data
├── README.md # テストデータの説明などを書いておく
├── foobucket # テストデータ入りバケット
| ├── myobject1.csv
| └── myobject2.json
└── barbucket # 空バケットの準備はディレクトリだけ掘っておく
Docker Compose
エントリーポイントの差替え
参考にした記事の様にdocker-compose.yml
に展開して書いても良いのでしょうが、長くなるので別ファイルにした。この中で事前データを準備する。
内容的にはホスト側の./test_data
をさらってコンテナ側の/data
にMinIOが認識できる形にコピーしMinIO serverを立ち上げる。
#!/bin/sh
SRC=/test_data
DATA=/data
files=$SRC/*
for file in ${files}; do
if [ -d ${file} ] ; then
bucket=$(basename ${file})
mkdir -p ${DATA}/${bucket}
mkdir -p ${DATA}/.minio.sys/buckets/${bucket}
cp -pr ${SRC}/${bucket}/ ${DATA}/
fi
done
minio server /data
カスタムポリシーとかは不要だったので準備してませんが、リンク先の記事のようにpolicy.json
って用意したほうが良いのかなぁ?
docker-compose.yml
version: "3"
services:
minio:
image: minio/minio:latest
ports:
- "9000:9000"
volumes:
# - ./srv/data:/data
- ./test_data:/test_data:ro
- ./entrypoint.sh:/entrypoint.sh
entrypoint: sh
command: /entrypoint.sh
environment:
MINIO_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE
MINIO_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Dockerホスト側にデータを残すならコメントアウトを削除。
起動
$ docker-compose up -d && docker-compose logs -f
テスト
# 事前にAWS_PROFILEとか設定済みで
$ aws --endpoint-url http://localhost:9000 s3 ls
2020-10-24 20:28:10 barbucket
2020-10-24 20:28:10 foobucket
$ aws --endpoint-url http://localhost:9000 s3 ls s3://foobucket
2020-10-24 20:21:30 11 myobject1.csv
2020-10-24 20:22:28 12 myobject2.json
$ aws s3 ls s3://barbucket --endpoint-url http://localhost:9000
$
実はまだ現物とは組み合わせてないですがデバッグ・テストに使用する予定。