minioを使ってローカルにS3互換の環境を立ち上げてみた

ローカル環境でS3のテストを行うときに例えば以下の問題が考えられます。

  • 回線やサービスなどローカル環境以外の影響を受けることになるので障害時にテストすることができなくなる
  • 課金されてしまう
  • 公開したくないファイルをあげてしまう恐れがある

この問題を解決するために、ローカル環境でS3互換の環境を立ててくれるものはないか探してみたところ、以下のプロダクトが見つかりました。

min.io

これをDocker使って環境構築したところ、いくつか工夫すべきポイントがあったのでメモしておきます。

Dockerイメージ

minio公式のイメージを使いました。

hub.docker.com

Bitnami製もありこちらの方が環境変数で色々やってくれるので便利そうでしたが、 2021年9月時点での新しいバージョンのminioで使われている環境変数 MINIO_ROOT_USER MINIO_ROOT_PASSWORD を使用するとクラッシュしてしまうので公式イメージを使いました。

Entrypoint scripts do not support MINIO_ROOT_USER + MINIO_ROOT_PASSWORD · Issue #21 · bitnami/bitnami-docker-minio · GitHub

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-stylevirtual-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のパースエラーになってしまいました...

今回、コードは載せませんがファイルアップロードが成功したことを確認しました。


使ってみて何かあれば改めてエントリーを立てようと思います。今回はここまで。