🪣

ローカル開発環境のS3互換ストレージとしてRustFSを使う

に公開

ローカル開発環境でS3互換ストレージとしてMinIOを使っていたのですが、MinIOはいろいろあってとうとうメンテナンスモードになってしまいました。

MinIOが良かったのは下記の点です。

  • S3互換APIを提供している
  • Dockerイメージが提供されていて簡単に立ち上げられる
    • DevContainerで簡単に使える
  • GUIでバケットやオブジェクトの操作ができる

代替となるものをいくつか試したところ、RustFSが上記を満たしていたので紹介します。RustFSのライセンスはApache2.0です。

Docker Composeでの設定例

RustFSをDocker Composeで立ち上げる場合の設定例です。
これでコンソールも含めて立ち上がります。

services:
  rustfs:
    image: rustfs/rustfs:1.0.0-alpha.72
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - rustfs-data:/data
    environment:
      - RUSTFS_ACCESS_KEY=rustfsadmin
      - RUSTFS_SECRET_KEY=rustfsadmin
      - RUSTFS_CONSOLE_ENABLE=true
    command: >
      --address :9000
      --console-enable
      --access-key rustfsadmin
      --secret-key rustfsadmin
      /data
    restart: unless-stopped

volumes:
  rustfs-data:

RustFSコンソール

RustFSにはコンソールが備わっており、先ほどの設定で起動した場合はhttp://localhost:9001にアクセスすることで利用できます。
Access Key と Secret Key でログインします。

RustFS Console

GUIでバケットやオブジェクトの操作ができるので便利です。

AWS CLIでの利用例

S3互換APIを提供しているので、AWS CLIで操作できます。

export AWS_ACCESS_KEY_ID=rustfsadmin
export AWS_SECRET_ACCESS_KEY=rustfsadmin
$ aws --endpoint-url=http://rustfs:9000 s3 ls
2025-12-07 14:08:22 sample-bucket
$ aws --endpoint-url=http://rustfs:9000 s3 cp README.md s3://sample-bucket/README.md
upload: ./README.md to s3://sample-bucket/README.md           

Presigned URLの発行も可能です。

$ aws --endpoint-url=http://rustfs:9000 s3 presign s3://sample-bucket/README.md --expires-in 3600
http://rustfs:9000/sample-bucket/README.md?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=rustfsadmin%2F20251213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251213T100354Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=64ba030a9d7083a0a7c26dc68b76f57d8477213f0a2ce71b3a7e04210f171039

$ curl -i "http://rustfs:9000/sample-bucket/README.md?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=rustfsadmin%2F20251213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251213T100354Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=64ba030a9d7083a0a7c26dc68b76f57d8477213f0a2ce71b3a7e04210f171039"
HTTP/1.1 200 OK
accept-ranges: bytes
content-length: 363
content-type: text/markdown
etag: "e7680d626c5d14322d46b094b4f0f2ae"
last-modified: Sun, 07 Dec 2025 23:07:20 GMT
x-amz-meta-content-type: text/markdown
vary: accept-encoding
vary: origin, access-control-request-method, access-control-request-headers
access-control-allow-origin: *
access-control-expose-headers: *
x-request-id: 85b9b51b-2b5d-4bc3-9aac-c9dfdfd9d70a
date: Sat, 13 Dec 2025 10:04:07 GMT

# rustfs-sample

...

サンプルプロジェクト

下記のプロジェクトをDevContainerで開くとRustFSが立ち上がります。こちらで動作確認をしました。

その他

Garageも試したのですが、ノード1台の場合でもレイアウトを設定する必要があって、Dockerで立ち上げるのと同時にそれらを行うのが難しかったので、今回は見送りました。
(単にローカル開発環境のS3互換という用途には向いていなかっただけ)

Discussion