🤖

MinIOからRustFSへ:Rails Active StorageのS3代替ツールの移行

に公開

概要

これは Rails のローカル開発環境において、Active Storage の S3 代替として使っていた MinIO を RustFS に置き換えた対応についてまとめた記事です。

MinIO の Docker Image 配布停止

Rails のローカル環境下での Active Storage として S3 互換性のある MinIO を使っていました。
しかしながら、最近 Docker Image の配布が停止されるということで代替ツールを探していました。

元の MinIO 設定状況

  • compose ファイルで Rails と MinIO を起動して、storage.yml に MinIO の設定を記載することで利用していました。
  • mkcert を使いオレオレ証明書を作り、MinIO の TLS 化もしていました。
    mkcert --key-file localhost-key.pem --cert-file localhost.pem localhost minio
    
  • minio/mc を使いバケットの作成もしていました。
compose.yml
services:
  rails:
    # 省略
    ports:
      - "3100:3100"
    environment:
      - MINIO_LOCAL_URI=https://minio:9000

  db:
    # 省略

  minio:
    image: minio/minio:latest
    environment:
      MINIO_ROOT_USER: "minio"
      MINIO_ROOT_PASSWORD: "minio123"
      MINIO_SITE_REGION: "ap-northeast-1"
      MINIO_SERVER_URL: "https://localhost:9000"
    command: ["minio", "server", "--address", ":9000", "--console-address", ":9001", "/data"]
    volumes:
      - minio:/data:delegated
      - ./localhost-key.pem:/root/.minio/certs/private.key
      - ./localhost.pem:/root/.minio/certs/public.crt
    ports:
      - "9000:9000"
      - "9001:9001"

  createbuckets:
    image: minio/mc
    environment:
      MINIO_SITE_REGION: "ap-northeast-1"
    depends_on:
      - minio
    volumes:
      - ./localhost-key.pem:/root/.mc/certs/private.key
      - ./localhost.pem:/root/.mc/certs/public.crt
    entrypoint: >
      /bin/sh -c "
      /usr/bin/mc --insecure alias set myminio https://minio:9000 minio minio123;
      /usr/bin/mc --insecure mb myminio/local --region=ap-northeast-1;
      /usr/bin/mc --insecure policy set public myminio/local;
      exit 0;
      "
config/storage.yml
minio_local:
  service: S3
  access_key_id: minio
  secret_access_key: minio123
  endpoint: <%= ENV.fetch('MINIO_LOCAL_URI', "") %>
  bucket: local
  region: ap-northeast-1
  force_path_style: true

RustFS とは

  • https://github.com/rustfs/rustfs
    • Rust 製の S3 互換のオブジェクトストレージツールです。
    • README に記載の通りまだアルファ版のようなので、本番環境での利用はしないように明記されています。
      • ⚠️ RustFS is under rapid development. Do NOT use in production environments!

RustFS の導入

  • Docker Image を使って RustFS を起動します。
  • MinIO の時と同様に mkcert を使い証明書を作成してそれを割り当てています。
    mkcert --key-file localhost-key.pem --cert-file localhost.pem localhost rustfs
    
  • バケット作成処理も minio/mc から aws-cli を使ったものに置き換えました。
  • storage.yml に RustFS との通信設定を記載する。
compose.yml
services:
  rails:
    # 省略
    ports:
      - "3100:3100"
    environment:
      - RUSTFS_LOCAL_URI=https://rustfs:9000

  db:
    # 省略

  rustfs:
    image: rustfs/rustfs:alpha
    environment:
      RUSTFS_ACCESS_KEY: "rustfsadmin"
      RUSTFS_SECRET_KEY: "rustfsadmin"
      RUSTFS_REGION: "ap-northeast-1"
      RUSTFS_TLS_PATH: "/certs"
      RUSTFS_SERVER_URL: "https://localhost:9000"
      RUSTFS_ADDRESS: ":9000"
      RUSTFS_CONSOLE_ADDRESS: ":9001"
    volumes:
      - rustfs_data:/data:delegated
      - rustfs_logs:/logs:delegated
      - ./localhost-key.pem:/certs/rustfs_key.pem:ro
      - ./localhost.pem:/certs/rustfs_cert.pem:ro
    ports:
      - "9000:9000"
      - "9001:9001"

  createbuckets:
    image: amazon/aws-cli:latest
    environment:
      AWS_ACCESS_KEY_ID: "rustfsadmin"
      AWS_SECRET_ACCESS_KEY: "rustfsadmin"
      AWS_DEFAULT_REGION: "ap-northeast-1"
    depends_on:
      - rustfs
    volumes:
      - ./localhost-key.pem:/root/.aws/certs/private.key
      - ./localhost.pem:/root/.aws/certs/public.crt
    entrypoint: >
      /bin/sh -c "
      echo 'Waiting for RustFS to be ready...' &&
      sleep 3 &&
      echo 'Creating local bucket...' &&
      (aws --endpoint-url https://rustfs:9000 --no-verify-ssl s3 mb s3://local --region ap-northeast-1 || echo 'Bucket local already exists') &&
      echo 'Setting public policy for local bucket...' &&
      (aws --endpoint-url https://rustfs:9000 --no-verify-ssl s3api put-bucket-policy --bucket local --policy '{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::local/*\"]}]}' || echo 'Policy setting skipped or not supported') &&
      echo 'RustFS buckets setup completed!' &&
      exit 0;
      "
storage.yml
rustfs_local:
  service: S3
  access_key_id: rustfsadmin
  secret_access_key: rustfsadmin
  endpoint: <%= ENV.fetch('RUSTFS_LOCAL_URI', "") %>
  bucket: local
  region: ap-northeast-1
  force_path_style: true

所感

MinIO から RustFS への置き換えは特に難しくなく、Rails 側の設定としては、access_key_id, secret_access_key, endpoint を置き換えるだけで済んだの楽でした。
TLS の設定もほとんどそのまま引き継げることができたので良かったです。(もう一つ候補に上がっていたGarageは TLS 対応がされていなかったので、断念しました。)

Discussion