Amazon S3互換のオブジェクトストレージRustFSを使ってみる
はじめに
データエンジニアをやっておりますTaichiです。
先日、MinIO の Docker イメージが公式から配布停止になりました。 Issue コメントにもある通り、コミュニティ版は今後「ソースコード配布のみ」で、自分でビルドしてねという方針に変わっています。
ちょっとした手元の検証環境にMinIOを使っていた自分としては、docker runで簡単に立ち上がり、Amazon S3 互換 APIで操作できるOSSが欲しいなと思っています。
そういうわけで、MinIO 以外の OSS オブジェクトストレージをいくつか調べてみたところ、
RustFS が手軽に利用できそうだったので、今回は RustFS を試してみました。
RustFSの主な特徴
1. Rust 製 & 高性能
その名の通りRustFSはRustで実装されており、メモリ安全性とパフォーマンスを売りにしている。
公式 README には、小さいオブジェクト(4KB)に関しては、MinIO 比で約 2.3 倍高速と書いてあります。
2.3x faster than MinIO for 4KB object payloads.
2. Amazon S3互換
公式 README でも 「Amazon S3 互換」 を名乗っており、既存の AWS SDK / S3 ツール群をそのまま使えることを前面に押し出しています。
100% S3 Compatible Works with any cloud provider or client, anywhere.
3. WebUIの提供
RustFS には、オブジェクトストレージ本体と一緒に動く 専用の Web コンソール(RustFS Console) が同梱されています。
- ブラウザからログインしてバケット作成・オブジェクトアップロードができる
- バケットやユーザ、アクセスキーなどを GUI で確認・操作できる
- MinIO Console と同じような「とりあえずブラウザで触って挙動を確認する」用途に向いている
4. シングルバイナリ & Dockerイメージ提供
RustFS の構成は MinIO にかなり似ており、以下のような特徴があります。
- サーババイナリは基本 1 つ
- アドレスやボリュームパス、アクセスキーなどは 環境変数かコマンドライン引数で指定
- 管理コンソール(WebUI)も同じプロセスからポートを分けて提供
公式 Docker イメージも提供されており、MinIO 的な「ちょっと使いたい」用途にハマるプロダクトとなっています。
ハンズオン
環境前提
- Docker version 28.4.0
- Docker Compose version v2.39.4-desktop.1
- Python 3.12.10
RustFSの起動
今回は公式ドキュメントのDockerでの手順を参考に起動していきます。
以下のようにdocker-compose.yamlファイルを用意しました。
services:
rustfs:
image: rustfs/rustfs:latest
ports:
- "9002:9000"
- "9001:9001"
environment:
- RUSTFS_ADDRESS=0.0.0.0:9000
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
- RUSTFS_CONSOLE_ENABLE=true
volumes:
- rustfs-data:/data
command: ["--console-enable", "/data"]
volumes:
rustfs-data:
docker compose upコマンドでRustFSを起動していきます。
docker compose up
ログにWebUIのURLが出力される。
> Console WebUI available at: http://172.19.0.2:9001/rustfs/console/index.html
> Console WebUI (localhost): http://127.0.0.1:9001/rustfs/console/index.html
Console WebUI (localhost)の方にアクセスします。

ログインキーは、docker-compose.yaml内で指定したrustfsadminを利用します。

WebUIでファイルアップロードしてみる
まずはバケット作成
testバケットを作成する。


ファイルをアップロード
testバケットを開き、「ファイルをアップロード/フォルダ」を押下します。

今回は試しにサンプルファイルsample.txtをアップロードします。

無事アップロード完了!

プレビュー機能で中身確認
アップロードしたsample.txtを押下すると、オブジェクト詳細画面に遷移します。

プレビューを押下する。

ファイルの中身を見ることができました。

Pythonからファイルアップロードしてみる
今度はWebUIではなくPythonのboto3を用いてRustFSにファイルをアップロードしたいと思います。
boto3クライアントの設定
エンドポイントURLはdocker-compose.yamlで設定したポートを指定します。
import boto3
import json
# RustFS接続設定
s3_client = boto3.client(
's3',
endpoint_url='http://localhost:9002', # RustFS APIエンドポイント
aws_access_key_id='rustfsadmin',
aws_secret_access_key='rustfsadmin',
region_name='us-east-1'
)
バケット作成
boto3を用いて、バケットを作成します。
bucket_name = 'my-bucket'
s3_client.create_bucket(Bucket=bucket_name)

ファイルアップロード
今度はjsonデータを用意して、boto3でアップロードしてみます。
data = {
"name": "test",
"value": 123,
"items": ["a", "b", "c"]
}
# JSONをアップロード
s3_client.put_object(
Bucket=bucket_name,
Key='data/sample.json', # オブジェクトキー(ファイルパス)
Body=json.dumps(data, ensure_ascii=False, indent=2),
ContentType='application/json'
)
無事アップロードできました。

MinIOからRustFSへの移行
最後に簡単に、MinIOからRustFSへの移行について触れようと思います。
ここでは、GitHub上のディスカッションで解説されていた方法を紹介します。
やり方はMinIO Clinet(mc)からmirrorコマンドを実行するだけで、とてもシンプルです。
mc mirror minio/(ソースバケット) rustfs/(ターゲットバケット)
mirrorコマンドは、増分同期に対応しているのでコマンド実行が失敗した際はリランすることで
差分同期することが可能になります。
まとめ
いかがでしたでしょうか。
私の所感としては、
-
docker-compose.yamlも MinIO とほぼ同じような記述で対応できる - WebUI も直感的で使いやすい
といった点から、今後手元でオブジェクトストレージを使った簡易検証をするときは、RustFS がかなり有力な選択肢になるなと感じました。
他にも「この OSS も良いですよ」といったものがあれば、コメントいただけると嬉しいです。
NTT DATA公式アカウントです。 技術を愛するNTT DATAの技術者が、気軽に楽しく発信していきます。 当社のサービスなどについてのお問い合わせは、 お問い合わせフォーム nttdata.com/jp/ja/contact-us/ へお願いします。