Ubuntu Server上でMinIOを使用したS3準拠オブジェクトストレージの構築

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

午前2時のディスク容量不足という悪夢

電話のベルが鳴り響く。監視システムが赤色のアラートを出している:Disk Usage 98%。私は急いでサーバーにSSH接続し、df -hコマンドを叩くと、/var/www/uploadsパーティションの容量が枯渇していることに気づいた。これは、アプリケーションサーバーに直接ファイルを保存していた代償だ。

その時、私には2つの選択肢があった。1つはクラウドのディスクをアップグレードすることだが、数百GBで毎月20ドルから50ドルのコストがかかる。もう1つはAWS S3に移行することだが、国際ネットワークの遅延がネックになる。結局、私は最も効率的な方法を選んだ。既存のUbuntuインフラ上にMinIOを使って独自のオブジェクトストレージを構築することだ。

MinIOを使用すると、ストレージ部分をアプリケーションロジックから完全に分離できる. S3 APIと100%互換性があるため、AWS S3で動作するPython、Node.js、PHPのライブラリは、ロジックのコードを1行も変えることなくMinIO上でスムーズに動作する。

なぜセルフホストにMinIOが選ばれるのか?

Nginx経由で伝統的なファイル保存を行うと、ファイル数が数百万件に達した際にディレクトリツリーの管理が地獄と化す。MinIOは、データをオブジェクトとして保存することでこの問題を解決する. ユーザーはBucketObject Keyを扱うだけでよく、背後の複雑なメタデータ管理はすべてMinIOが引き受けてくれる。

Ubuntu環境において、MinIOはsystemdを有効活用することで非常に安定して動作する。Go言語で書かれたMinIOのバイナリは非常に軽量だが、ハードウェア性能が十分であれば、数十GB/sの透通量(スループット)で数テラバイトのデータを処理する能力がある。実際、私は4台の古いHDDでクラスターを運用しているが、読み込み速度は容易に300-400MB/sに達している。

Ubuntu Serverへの実戦デプロイ

本番環境レベルのシステムにするため、MinIOを手動コマンドではなくバックグラウンドサービスとして実行するように構成する。

1. 安全な環境のセットアップ

まず、OSの最新のセキュリティパッチを適用することから始める。

sudo apt update && sudo apt upgrade -y

次に、専用のシステムユーザーを作成する。サーバーがスクリプト攻撃を受けた際のリスクを最小限に抑えるため、絶対にroot権限でMinIOを実行してはならない。

sudo useradd -r minio-user -s /sbin/nologin

2. MinIOバイナリのインストール

.debファイルを使用する代わりに、バージョン管理を容易にするためにバイナリを直接ダウンロードする方法を推奨する。

wget https://dl.min.io/server/minio/release/linux-amd64/minio
sudo chmod +x minio
sudo mv minio /usr/local/bin/

データ保存領域を準備する。ここがすべての物理ファイルが格納される場所になる。

sudo mkdir /mnt/data
sudo chown minio-user:minio-user /mnt/data

3. 環境変数の設定

ログイン情報とパスを管理するために、/etc/default/minioに設定ファイルを作成する。ポート9000を狙うスキャンボットを避けるため、デフォルトのパスワードはすぐに変更すること。

MINIO_VOLUMES="/mnt/data"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER="system_admin"
MINIO_ROOT_PASSWORD="StrongPassword2024"
MINIO_SERVER_URL="https://minio.yourdomain.com"

重要な注意点:ブラウザからのファイルアップロード時にCORSエラーが発生するのを防ぐため、MINIO_SERVER_URLは設定予定のドメインと一致させる必要がある。

4. Systemdによる管理

OS起動時にMinIOを自動開始させ、クラッシュ後に自動復旧させるために、サービスファイルを定義する。

sudo nano /etc/systemd/system/minio.service

パフォーマンスに最適化された構成内容は以下の通り:

[Unit]
Description=MinIO
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

おなじみのコマンドでサービスを有効化する:

sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio

sudo systemctl status minioコマンドでactive (running)と緑色で表示されれば、構築の90%は完了だ。

NginxリバースプロキシとSSLの設定

Nginxを前面に配置することで、リバースプロキシとSSLターミネーションをより効率的に処理できる。注意点として、Nginxのデフォルトのアップロード制限は1MBであるため、大容量ファイルをアップロードできるようにこの数値を増やす必要がある。

server {
    listen 80;
    server_name minio.yourdomain.com;
    client_max_body_size 1000M; # 1GBまでのファイルアップロードを許可

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;

        proxy_pass http://localhost:9000;
    }
}

HTTPSを有効にするためにcertbot --nginxを実行するのを忘れないこと。SSL暗号化なしでインターネット上を流れるデータは、泥棒に秘密をさらけ出しているのと同じだ。

Pythonによる接続テスト

新しいシステムへの書き込み権限を確認するために、Pythonスクリプトでテストを行う:

from minio import Minio

# クライアントの初期化
client = Minio(
    "minio.yourdomain.com",
    access_key="system_admin",
    secret_key="StrongPassword2024",
    secure=True
)

# テスト用バケットの作成
bucket = "media-production"
if not client.bucket_exists(bucket):
    client.make_bucket(bucket)
    print(f"成功: {bucket} を作成しました")

実戦から学んだ教訓

すべてのメディアファイルをMinIOに移行した後、アプリケーションサーバーのI/O wait負荷が40%減少した。バックアップもよりプロフェッショナルになった。手動のrsyncの代わりに、mc(MinIO Client)ツールを使用して、毎晩別のバックアップサイトにデータをミラーリングしている。

よくある間違いとして、MINIO_VOLUMESを相対パスで指定してしまうことがある。MinIOは絶対パスの使用を強制している。間違っているとサービスがハングアップするため、原因を探るためにjournalctl -u minioをくまなく調べる羽目になる。

結びに代えて

MinIOを自前で運用することは、毎月数万円のストレージコストを節約できるだけでなく、データの完全な制御権を手に入れることにも繋がる。もしプロジェクトのファイル保存問題で悩んでいるなら、今日からインストールを始めてみてほしい。何か問題が発生した際は、journalctlコマンドで詳細なログを確認し、迅速に対処しよう。

Share: