minioを使ってローカルにS3互換の環境を立ち上げてみた
ローカル環境でS3のテストを行うときに例えば以下の問題が考えられます。
- 回線やサービスなどローカル環境以外の影響を受けることになるので障害時にテストすることができなくなる
- 課金されてしまう
- 公開したくないファイルをあげてしまう恐れがある
この問題を解決するために、ローカル環境でS3互換の環境を立ててくれるものはないか探してみたところ、以下のプロダクトが見つかりました。
これをDocker使って環境構築したところ、いくつか工夫すべきポイントがあったのでメモしておきます。
Dockerイメージ
minio公式のイメージを使いました。
Bitnami製もありこちらの方が環境変数で色々やってくれるので便利そうでしたが、
2021年9月時点での新しいバージョンのminioで使われている環境変数 MINIO_ROOT_USER
MINIO_ROOT_PASSWORD
を使用するとクラッシュしてしまうので公式イメージを使いました。
docker compose 設定
version: '3' services: minio: image: minio/minio:latest container_name: "mybucket.minio" entrypoint: sh -c " mkdir -p /data/mybucket; mkdir -p /data/.minio.sys/buckets/mybucket; minio server /data --console-address ':37135'" ports: - 37135:37135 # 管理画面のポート - 9000:9000 # APIのポート environment: - MINIO_ROOT_USER=minio # 管理画面のユーザ、APIのアクセスキー - MINIO_ROOT_PASSWORD=password # 管理画面のパスワード、APIのシークレット - MINIO_DOMAIN=minio volumes: - minio:/data volumes: minio:
- container_name, MINIO_DOMAIN
こちらの設定は、2種類のアドレスモデル path-style
と virtual-hosted style
両方に対応できるようにしています。
container_nameで、mybucket.minio
、サービス名に minio
を設定することで、
dockerのネットワークから http://mybucket.minio:9000
, http://minio:9000
両方でアクセスできるようになります。
- entrypoint
ここではバケットの作成と管理画面のポートを指定しています。
mkdirでディレクトリを作成することで、バケットを作成することができます。
また、管理画面のポートはランダムできまるので、サービスを立ち上げる際に、--console-address ':37135'
を指定することで 37135
で管理画面のポートを設定しています。
- MINIO_ROOT_USER, MINIO_ROOT_PASSWORD
これは管理画面のユーザ、パスワードです。またAPIのアクセスキー、シークレットにも使えます。
- volumes
データを永続化するため、ボリューム設定しています。
使ってみる
- aws s3コマンド
# aws s3 --endpoint-url http://127.0.0.1:9000 ls --profile minio 2021-09-27 00:00:00 mybucket
- s3cmd
こちらはXMLのパースエラーになってしまいました...
今回、コードは載せませんがファイルアップロードが成功したことを確認しました。
使ってみて何かあれば改めてエントリーを立てようと思います。今回はここまで。