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 イメージが公式提供されている
" aria-label="前後の章">← 運用ルール / Skills →" aria-label="前後の章">← 提出運用 →