🤖
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- RustFS の TLS 設定方法: https://docs.rustfs.com/integration/tls-configured.html
- バケット作成処理も 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