S3 / MinIO
本番 S3 とローカル MinIO。
ストレージ: 本番 S3 / ローカル MinIO (AWS想定)
方針
- 本番: Amazon S3 (高可用性・低コスト・IAMで権限管理)
- ローカル: MinIO (S3互換APIをDockerコンテナで提供。オフライン可能・無料)
- コード側: 環境変数で接続先だけ切り替える。AWS SDK (boto3 / aws-sdk-go / @aws-sdk/client-s3) は両方で同じものを使う
docker-compose.yml への追加
services:
# ... 既存の app / db / redis ...
minio:
image: minio/minio:latest
ports:
- "9000:9000" # S3 API
- "9001:9001" # Web Console
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio-data:/data
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 10s
timeout: 5s
retries: 3
# 初期バケット作成 (起動時に1回だけ実行)
minio-setup:
image: minio/mc:latest
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 minioadmin minioadmin &&
mc mb -p local/app-uploads &&
mc mb -p local/app-backups
"
volumes:
minio-data:
.env.example
# === AWS共通 ===
AWS_REGION=ap-northeast-1
# === S3 バケット名 (本番/ローカル共通でコード側から参照) ===
S3_BUCKET_UPLOADS=app-uploads
S3_BUCKET_BACKUPS=app-backups
# === ローカル (MinIO) 用 ===
# 本番では未設定にする (IAMロール認証に切り替わる)
AWS_ENDPOINT_URL=http://minio:9000
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_S3_USE_PATH_STYLE=true
コードと運用
コード側の切り替え例 (Python / boto3)
import os
import boto3
from botocore.config import Config
def make_s3_client():
kwargs: dict = {"region_name": os.environ["AWS_REGION"]}
if endpoint := os.environ.get("AWS_ENDPOINT_URL"):
# ローカル開発 (MinIO): エンドポイントとアクセスキーを明示
kwargs["endpoint_url"] = endpoint
kwargs["aws_access_key_id"] = os.environ["AWS_ACCESS_KEY_ID"]
kwargs["aws_secret_access_key"] = os.environ["AWS_SECRET_ACCESS_KEY"]
kwargs["config"] = Config(s3={"addressing_style": "path"})
# 本番: 何も指定しないと IAM Role (Task Role / IRSA) で自動認証
return boto3.client("s3", **kwargs)
NOTE: 本番で
AWS_ACCESS_KEY_ID/SECRET_ACCESS_KEYを環境変数で渡すのはアンチパターン。ECS Task Role / EKS IRSA を使えば SDK が自動で credential を取得する。長期credentialを発行しないことがセキュリティの基本。
MinIO の運用メモ
- コンソール: http://localhost:9001 (admin:
minioadmin/minioadmin) - バケット操作・オブジェクト閲覧・IAMユーザ管理がGUIで可能
mc(MinIO Client) でCLI操作:docker compose exec minio-setup mc ls local/app-uploads- ARM Mac でも
linux/arm64イメージが公式提供されている