MinIOからRustFSへの移行:Docker ComposeでのS3互換ストレージ構築ガイド
はじめに
ローカル開発環境でS3互換ストレージを構築する際、長らくMinIOがデファクトスタンダードとして利用されてきました。しかし、関連リポジトリのアーカイブ化やライセンス変更などの背景があり、代替となるソリューションへの移行を検討している開発現場も増えています。
この記事では、MinIOの代替として活用できる軽量なS3互換ストレージ「RustFS」をDocker Composeに導入し、バケットの自動初期化までを行うセットアップ方法を解説します。
背景 / 課題
これまで、多くのプロジェクトでは以下のような構成でMinIOを利用していました。
- S3API互換のローカルストレージとしての利用
-
mc(MinIO Client) コマンドを用いた初期化バッチの実行
しかし、開発環境のセットアップや継続的な保守を考えると、より軽量で、将来のメンテナンス性に不安のない代替ツールの選択肢を持っておくことは重要です。RustFSは、MinIOの利用体験を損なわずに置き換えが可能なツールのひとつです。
解決策 / 実装
実際にdocker-compose.ymlを利用して、RustFSのサーバーと初期化(バケット生成や公開設定)を行うコンテナを定義します。
Step 1: docker-compose.ymlの設定
以下の設定をプロジェクトのdocker-compose.ymlに追加(またはMinIOから置き換え)します。
x-rustfs-environment: &rustfs-environment
RUSTFS_ACCESS_KEY: ${AWS_ACCESS_KEY_ID:-access}
RUSTFS_SECRET_KEY: ${AWS_SECRET_ACCESS_KEY:-secretkey}
RUSTFS_BUCKET: ${AWS_BUCKET:-bucketlocal}
services:
filesystem:
image: rustfs/rustfs:latest
command: server /data --console-address ":9001"
ports:
- '${DOCKER_FILESYSTEM_PORT:-9000}:9000'
- '${DOCKER_FILESYSTEM_PORT_UI:-9001}:9001'
environment:
<<: *rustfs-environment
volumes:
- filesystem:/data
healthcheck:
test:
[
"CMD", "sh", "-c",
"curl -f http://127.0.0.1:9000/health && curl -f http://127.0.0.1:9001/rustfs/console/health",
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
filesystem-init:
image: rustfs/rc:latest
depends_on:
filesystem:
condition: service_healthy
environment:
<<: *rustfs-environment
entrypoint: >
/bin/sh -c "rc alias set local http://filesystem:9000
$${RUSTFS_ACCESS_KEY} $${RUSTFS_SECRET_KEY};
rc mb local/$${RUSTFS_BUCKET} --ignore-existing;
rc anonymous set download local/$${RUSTFS_BUCKET};"
Step 2: 設定のポイント解説
上記のコードでは、安定した自動初期化を実現するための工夫がいくつか盛り込まれています。
1. 環境変数の共通化(YAMLアンカー)
x-rustfs-environment: &rustfs-environmentというYAMLのアンカー機能(Extension fields)を利用して、コンテナ間で共通の環境変数を定義しています。
これにより、サーバーコンテナ(filesystem)と初期化コンテナ(filesystem-init)の両方で同じアクセスキーやバケット名(${AWS_BUCKET:-bucketlocal}など)を再利用でき、設定の記述漏れや不整合を防いでいます。
2. ヘルスチェックの活用(Healthcheck)
filesystemサービスで詳細なヘルスチェックを定義しています。API用ポート(9000)とコンソール用ポート(9001)の両方が正常に応答するかを検証することで、ストレージサーバーの起動完了を正確に検知しています。
3. 初期化コンテナの実行制御(depends_on)
depends_onでcondition: service_healthyを指定している点が重要です。これにより、RustFS本体の起動とヘルスチェックの通過が完全に終了してから、初期化スクリプトが安全に実行されることが保証されます。コンテナ起動順序によるエラー(サーバーが立ち上がる前にクライアントが接続しにいって失敗する等)を防ぎます。
4. クライアントツールの移行(rcコマンド)
MinIOのmc(MinIO Client)コマンドに相当するものとして、RustFSではrcコマンドを使用します。
entrypoint内で以下の初期化プロセスを実行しています。
-
rc alias set: ローカルのRustFSサーバーへ接続情報を登録(環境変数を利用) -
rc mb: 指定したバケットを作成(--ignore-existingオプションで既存時はスキップ) -
rc anonymous set download: 開発環境でのファイル表示を容易にするため、バケットをダウンロード(Read)可能に設定
旧来のMINIO_ROOT_USER等の環境変数は、必要に応じてRUSTFS_ACCESS_KEYなどに名前を置き換えて設定(*rustfs-environmentにて定義)してください。
結果
この設定により、開発者がdocker-compose up -dを実行するだけで、以下の環境が完全に自動構築されます。
- 軽量なS3互換ローカルストレージ環境
- プロジェクトで必要なバケットの自動作成
- パブリックアクセスの自動許可(Webブラウザからの画像確認などがそのまま可能)
管理コンソールにログインして手動でバケットを作り、ポリシーを設定するような手間が一切なくなります。
まとめ
- MinIOの代替としてRustFSを採用することで、リポジトリアーカイブ化等の影響を受けない安定した開発基盤を確保できる
- クライアントツールは
mcからrcへ変更されるが、基本的なコマンド体系や使い勝手はほぼ同様 - Docker Composeのヘルスチェック機能を活用することで、起動完了を待ってからバケット作成までを完全自動化できる
ローカル環境のS3互換ストレージ構築手順を見直したい方は、ぜひこの構成を試してみてください。