課題:AWS S3があるのになぜ自前でObject Storageを構築するのか?
AWS S3やGoogle Cloud Storageのようなクラウドストレージ(Cloud Storage)のコストは、一見安く見えます。しかし、データ容量が数十テラバイトに達し、転送量(egress)が増加すると、月々の請求額に驚かされることになります。さらに、日本国内の企業にとって、機密データを海外サーバーに保存することは、データ主権に関する規定に抵触する場合もあります。
そこで最適な解決策となるのが、S3 APIと完全な互換性を持つObject Storageシステムを自前で構築することです。MinIOは、その極めて高いパフォーマンスと柔軟な拡張性から、最も有力な候補として注目されています。しかし、CentOS Stream 9のようなセキュリティ要件の厳しいOSにMinIOをインストールするのは、単にコマンドを一つ実行すれば済むという話ではありません。SELinuxやFirewalldを適切に処理しなければ、「Permission Denied」エラー grow が頻発したり、外部からダッシュボードにアクセスできなかったりといった問題に直面します。
以前、金融系のプロジェクトを担当した際、データがオンプレミスのインフラから一切出ないようにするという要件がありました。その時、AWS S3は真っ先に候補から外れました。そこでCentOS Stream上にMinIOクラスターを構築したのですが、現在まで非常にスムーズに稼働しています。以下に、その経験から導き出した標準的なセットアップ手順をまとめます。
ステップ 1:環境準備とシステムユーザーの作成
安全性を確保するため、MinIOをroot権限で実行することは避けるべきです。まず、専用のユーザーを作成し、データ保存用のディレクトリを準備します。
# システムの更新
sudo dnf update -y
# MinIO用のシステムユーザーを作成
sudo useradd -r minio-user -s /sbin/nologin
# データと設定用のディレクトリを作成
sudo mkdir -p /mnt/data /etc/minio
sudo chown minio-user:minio-user /mnt/data /etc/minio
ステップ 2:MinIOバイナリのダウンロードとインストール
複雑な配布パッケージを使う代わりに、バージョンの管理が容易なMinIO公式サイトのバイナリを直接使用する方法を推奨します。
# サーバー版をダウンロード
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 実行権限を付与し、システムディレクトリに移動
chmod +x minio
sudo mv minio /usr/local/bin/
コマンド minio --version を実行して、正常に動作するか確認してください。バージョン情報が表示されれば、半分は成功したようなものです。
ステップ 3:環境変数の設定 (Environment Variables)
MinIOは環境変数ファイルを通じて設定パラメータを管理します。/etc/default/minio ファイルを作成し、管理アカウント、ポート、データパスなどを定義します。
sudo nano /etc/default/minio
ファイルに以下の内容を貼り付けます(パスワードはより強力なものに変更してください):
# データ保存ディレクトリ
MINIO_VOLUMES="/mnt/data"
# API用のアドレスとポート
MINIO_OPTS="--address :9000 --console-address :9001"
# 最高管理者アカウント
MINIO_ROOT_USER=admin_minio_itfz
MINIO_ROOT_PASSWORD=Kono_Pasuwado_Wo_Henko_Shite_Kudasai
# (オプション) プロキシを使用する場合のドメイン
# MINIO_SERVER_URL="https://minio.yourdomain.com"
ステップ 4:Systemdサービスの設定
MinIOをシステム起動時に自動開始させ、管理を容易にするために、systemd用のサービスファイルを作成します。
sudo nano /etc/systemd/system/minio.service
サービスファイルの内容:
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"/etc/default/minio で MINIO_VOLUMES 変数が設定されていません\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# クラッシュ時に自動再起動
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
ステップ 5:SELinuxとFirewalldの処理 – 避けて通れない難所
これは多くのネット上のガイドで見落とされがちな部分であり、サービスが起動しなかったりクライアントが接続できなかったりする原因になります。CentOS Stream 9では、デフォルトでSELinuxがEnforcingモードになっています。
SELinuxの設定
MinIOサービスには、データディレクトリへの読み書き権限と、ネットワークポートへのバインド権限が必要です。SELinuxを無効化するのではなく(非専門的で安全性が低いため)、正しくラベルを割り当てましょう。
# バイナリにラベルを付与
sudo chcon -t bin_t /usr/local/bin/minio
# MinIOが書き込み権限を持てるよう、データディレクトリにラベルを付与
sudo semanage fcontext -a -t mnt_t "/mnt/data(/.*)?"
sudo restorecon -Rv /mnt/data
Firewalldの設定
MinIOはAPI用にポート9000、コンソール用にポート9001を使用します。これらを開放します:
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --permanent --add-port=9001/tcp
sudo firewall-cmd --reload
ステップ 6:有効化と確認
いよいよ成果を確認する時です。デーモンをリロードしてサービスを開始します。
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio
# ステータスを確認
sudo systemctl status minio
active (running) という文字が緑色で表示されれば成功です!ウェブインターフェース(http://あなたのIP:9001)にアクセスできるようになります。
MinIO運用における実務的なヒント
大規模なMinIOクラスターを運用する中で気づいた、いくつかの重要なポイントを紹介します:
- HTTPSの使用: 本番環境では、決してMinIOをHTTPで運用しないでください。Nginxをリバースプロキシとして使用し、Let’s EncryptでSSLを導入して通信を保護すべきです。
- モニタリング (Monitoring): MinIOはPrometheus互換の
/minio/v2/metrics/clusterエンドポイントを提供しています。Grafanaと連携させて、容量や読み書き速度をリアルタイムで監視しましょう。 - 設定のバックアップ: データは
/mnt/dataにありますが、ユーザー設定やポリシーなどはその中の隠しディレクトリ.minio.sysに保存されています。このディレクトリを手動で操作することは絶対に避けてください。
CentOS Stream 9で独自のObject Storageシステムを構築することは、コスト削減だけでなく、データインフラを完全にコントロールすることにも繋がります。SELinuxとFirewalldによる保護により、外部からの攻撃に対しても非常に強固なシステムを構築できるでしょう。

