現実的な問題:AWS S3が財布を空にするとき
午前2時、私はAWSのコストダッシュボードを眺めてため息をついていました。小さなステージングプロジェクトなのに、S3の請求額がどんどん増えていたからです。デモ用の画像群の保存料とGET/PUTリクエストの料金だけで、毎月50ドル近くかかっていました。コードを修正することなくS3 APIと完全な互換性を持ち、かつコストを抑えるために自前のインフラで動作するオブジェクトストレージの解決策が必要でした。
そこで、Fedora Server上にMinIOを構築することにしました。しかし、現実は理論よりも厳しいものです。インストールしてもサービスが起動しなかったり、起動してもchmod 777を設定したはずなのに「Permission Denied」エラーが発生したりします。もしあなたがFedora上でSELinuxやFirewalldの設定に苦労しているなら、この記事がその解決策になります。
なぜFedoraでMinIOはうまく動かないのか?
Fedoraは素晴らしいディストリビューションですが、セキュリティに関しては非常に厳格です。MinIOのインストールを妨げる主な要因は3つあります。
- SELinux: デフォルトのEnforcingモードは、MinIOが未知のフォルダにデータを書き込もうとするのをブロックします。
- Firewalld: Fedoraはデフォルトですべてのポートを閉じています。ポート9000と9001を開放しなければ、使い物になりません。
- Systemd의 権限設定: rootユーザーでMinIOを実行するのはセキュリティ上の自殺行為です。しかし、専用ユーザーを作成して構成すると、ファイルシステムの権限エラーが発生しやすくなります。
インストール方法の選択:Dockerかバイナリか?
手軽さを求めてDockerを勧める人も多いでしょう。しかし、ベアメタルのパフォーマンスを最大限に引き出し、systemdを通じてリソースを直接管理したいのであれば、バイナリ(Binary)によるインストールがより堅実な選択肢です。
FedoraでのMinIOインストールとセキュリティ強化の手順
ステップ1:システムの準備
ライブラリの競合を避けるため、常にシステムのアップデートから始めます。
sudo dnf update -y
sudo dnf install wget policycoreutils-python-utils -y
ステップ2:MinIOバイナリのダウンロードとインストール
リポジトリにある古いバージョンではなく、最新のセキュリティ機能を利用するために最新版を取得します。
wget https://dl.min.io/server/minio/release/linux-amd64/minio
sudo chmod +x minio
sudo mv minio /usr/local/bin/
ステップ3:ユーザー作成と権限設定
アプリケーションを隔離するため、ログイン権限を持たないシステムユーザーを作成します。
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user
# データディレクトリの作成
sudo mkdir -p /mnt/minio_data
sudo chown minio-user:minio-user /mnt/minio_data
ステップ4:SELinux問題を完全に解決する
ここが最も重要な部分です。SELinuxを無効化する(これは非常に危険です)代わりに、FedoraにMinIOが安全なアプリケーションであることを教え込みます。実行ファイルとデータディレクトリに適切なラベル(label)を割り当てる必要があります。
# バイナリとデータにラベルを割り当てる
sudo semanage fcontext -a -t bin_t "/usr/local/bin/minio"
sudo semanage fcontext -a -t var_lib_t "/mnt/minio_data(/.*)?"
sudo restorecon -Rv /usr/local/bin/minio
sudo restorecon -Rv /mnt/minio_data
restoreconコマンドは、宣言したばかりのセキュリティラベルを適用します。このステップを怠ると、MinIOは起動時に「Access Denied」エラーを報告します。
ステップ5:環境設定
/etc/default/minioファイルを作成します。ここにはログイン情報とストレージパスを記述します。
MINIO_VOLUMES="/mnt/minio_data"
MINIO_OPTS="--address :9000 --console-address :9001"
MINIO_ROOT_USER="admin_minio"
MINIO_ROOT_PASSWORD="強力なパスワードに書き換えてください123"
ステップ6:Systemdサービスの設定
サービスを簡単に管理できるよう、/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
ステップ7:Firewalldのポート開放
この手順を行わないと、ブラウザからアクセスした際に「Connection Timed Out」エラーが発生します。
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --reload
ステップ8:システムの起動
MinIOを初めて有効化します。
sudo systemctl daemon-reload
sudo systemctl enable --now minio
sudo systemctl status minioコマンドで確認してください。active (running)と緑色で表示されていれば成功です!
運用における実践的なアドバイス
毎月500GBのデータを処理するシステムでMinIOを運用してきた経験から、いくつか注意点があります。
- BtrfsとCoW: FedoraはデフォルトでBtrfsを使用しています。Copy-on-Write (CoW) 機能はMinIOのデータベースの書き込み速度を低下させる可能性があります。データディレクトリに対して
sudo chattr +C /mnt/minio_dataコマンドを実行し、CoWを無効化してください。 - ログ: エラーが発生した際、推測で動かないでください。
journalctl -u minio -fを使用してリアルタイムのログを確認しましょう。 - SSL: HTTPSなしでポート9001をインターネットに公開しないでください。最善の方法は、Nginxをリバースプロキシとして使用し、SSL処理を担当させることです。
S3互換ストレージを自前で構築することは、データを完全にコントロールできるだけでなく、クラウド費用を年間で大幅に節約することにもつながります。設定の成功を祈っています!

