MinIOを使用してS3互換のオブジェクトストレージをオンプレで構築

## はじめに

Amazon S3オブジェクトストレージは、WEBシステムのデータや、ログファイルの格納場所などとして、AWSサービスの中でも利用された方が多いかと思います。※1

> Amazon S3 は、任意の量のデータの保存と取得をどこからでも行えるように設計されたオブジェクトストレージです。S3 は、業界をリードする耐久性、可用性、パフォーマンス、セキュリティ、および事実上無制限のスケーラビリティを非常に低コストで提供する、シンプルなストレージサービスです。※2

拡張性や、耐障害性としては高い評価がある一方、転送量でも課金が発生するため、常にR/Wが発生するシステムの場合は注意が必要です。

Amazon S3オブジェクトストレージはAPIのエコシステムが多く存在し、そのエコシステムをそのまま活用するため、S3互換ソフトウエアが開発されています。AWS以外のクラウドベンダもAmazon S3互換のサービスを提供しています。※3

今回はコスト面や、外部にデータを置けない場合などの候補として、MinIOを使ったS3互換ストレージを検証したいと思います。

MinIOは以下の4つの特徴があります。

:::note
シンプルなアーキテクチャ
✔Go言語で記述され、単一バイナリで動作する設計
✔技術的、運用的にも導入ハードルが低いです
:::

:::note
ハイパフォーマンス
✔NVMeドライブ搭載の32ノードを100GbE ネットワーク上で構築し、読み込み（GETメソッド）で325GiB/秒、書き込み（PUTメソッド）で165 GiB/秒を記録
:::

:::note
Kubernetesネイティブ
✔MinIOはパブリック、プライベート、エッジ様々なクラウド上のKubernetesディストリビューションをサポート
:::


## 検証環境

OSはRocky Linux 9.3仮想マシン

```
$ cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.3 (Blue Onyx)"
```

ストレージは16GBの仮想SSDです。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           1.8G  8.0K  1.8G   1% /dev/shm
tmpfs           730M  8.6M  721M   2% /run
/dev/vda5        15G  1.4G   14G  10% /
/dev/vda2       936M  250M  687M  27% /boot
/dev/vda1        99M  7.0M   92M   8% /boot/efi
tmpfs           365M     0  365M   0% /run/user/1000
```

## Docker(Podman)のインストール

rhel系OSではPodmanの利用が推奨されているためこちらを利用します。※5

```
$ sudo dnf -y install podman

略

======================================================================================================
 Package                      Architecture     Version                      Repository           Size
======================================================================================================
Installing:
 podman                       x86_64           2:4.6.1-7.el9_3              appstream            15 M
Installing dependencies:
 conmon                       x86_64           2:2.1.8-1.el9                appstream            51 k
 container-selinux            noarch           3:2.221.0-1.el9              appstream            55 k
 containers-common            x86_64           2:1-55.el9                   appstream           131 k
 criu                         x86_64           3.18-1.el9                   appstream           552 k
 crun                         x86_64           1.8.7-1.el9                  appstream           205 k
 fuse-common                  x86_64           3.10.2-6.el9                 baseos              7.2 k
 fuse-overlayfs               x86_64           1.12-1.el9                   appstream            66 k
 fuse3                        x86_64           3.10.2-6.el9                 appstream            52 k
 fuse3-libs                   x86_64           3.10.2-6.el9                 appstream            91 k
 iptables-nft                 x86_64           1.8.8-6.el9_1                baseos              185 k
 libnet                       x86_64           1.2-6.el9                    appstream            58 k
 libnftnl                     x86_64           1.2.2-1.el9                  baseos               83 k
 libslirp                     x86_64           4.4.0-7.el9                  appstream            68 k
 netavark                     x86_64           2:1.7.0-2.el9_3              appstream           3.6 M
 nftables                     x86_64           1:1.0.4-11.el9_3             baseos              398 k
 protobuf-c                   x86_64           1.3.3-13.el9                 baseos               34 k
 shadow-utils-subid           x86_64           2:4.9-8.el9                  baseos               86 k
 slirp4netns                  x86_64           1.2.1-1.el9                  appstream            46 k
 yajl                         x86_64           2.1.0-22.el9                 appstream            37 k
Installing weak dependencies:
 aardvark-dns                 x86_64           2:1.7.0-1.el9                appstream           1.0 M
 criu-libs                    x86_64           3.18-1.el9                   appstream            30 k

Transaction Summary
======================================================================================================

略
```

docker composeを利用するためのパッケージも導入します。

```
$ sudo dnf install -y podman-docker

略

======================================================================================================
 Package                   Architecture       Version                     Repository             Size
======================================================================================================
Installing:
 podman-docker             noarch             2:4.6.1-7.el9_3             appstream              58 k

Transaction Summary
======================================================================================================
略
```

サービスの起動を行います。

```
sudo systemctl enable --now podman.socket
sudo systemctl status podman.socket
```


docker composeコマンドをインストールします。

```
sudo curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
sudo chmod 755 /usr/bin/docker-compose
```



## MinIOコンテナの起動

作業ディレクトリを作成し移動します。

```
$ mkdir minio
$ cd minio/
```

docker composeベースの構成ファイルを作成します。

```yaml
version: "3"
services:
  minio:
    image: minio/minio:latest
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: minio            
      MINIO_ROOT_PASSWORD: dev-password  
    volumes:
      - data:/export
      - config:/root/.minio
    command: server /export --console-address ":9001"
volumes:
  data:
  config:
```

コンテナを作成・起動します。

```
# docker-compose up -d
[+] Running 9/8
 ✔ minio 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                              9.0s
   ✔ 368b91b99e37 Download complete                                                              0.0s
   ✔ ea29d36b883e Download complete                                                              1.4s
   ✔ 299e050c843d Download complete                                                              1.8s
   ✔ a3b4ec08421f Download complete                                                              0.2s
   ✔ 4a5c805461ae Download complete                                                              0.2s
   ✔ 8e0d38efaf34 Download complete                                                              0.0s
   ✔ 192e202aef0b Download complete                                                              6.1s
   ✔ 04185fa70834 Download complete                                                              0.0s
[+] Running 1/2
 ⠴ Network minio_default    Created                                                              0.6s
 ✔ Container minio-minio-1  Started                                                              0.6s
```

動作状況を確認します。

```
# docker ps -a
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID  IMAGE                         COMMAND               CREATED        STATUS        PORTS                             NAMES
438402466aa3  docker.io/minio/minio:latest  server /export --...  8 seconds ago  Up 8 seconds  0.0.0.0:9000-9001->9000-9001/tcp  minio-minio-1
```

## コンソール動作確認

検証機のIP:9001にブラウザでアクセスし動作確認を行います。ユーザは`minio`、パスワードは`dev-password`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324111/32d47ad9-cfd9-3631-d691-5f7356c6522f.png)

ログインが成功すると様々な操作が行えるコンソールにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324111/7882daba-5ab3-3bcb-b050-915a272e12ca.png)

試しにバケットを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324111/627628a4-8801-761f-4b12-28dfee8a6f4a.png)

アクセスキーを作成するとS3互換の様々なソフトウエアから操作することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324111/11bc586c-078e-be46-701c-8fc197286e9c.png)

## おわりに

今回はRocky Linux上でMinIOの構築を行いました。オンプレミス環境でS3互換オブジェクトストレージを利用したい場合は候補に挙がるかと思います。そのほかのソフトウエアとしては分散ストレージCeph + ObjectGWなどがあります。

今後、性能測定や、バックアップなど、運用に必要な設計を行いたいと思います。


## 参考

1. 【AWS初心者向け】ストレージサービス「Amazon S3」とは？実際に使用してみた https://business.ntt-east.co.jp/content/cloudsolution/column-try-43.html
2. Amazon S3 のよくある質問 https://aws.amazon.com/jp/s3/faqs/
3. Amazon S3からAlibaba Cloud OSS へのデータの移行 https://www.alibabacloud.com/help/ja/oss/developer-reference/migrate-data-from-amazon-s3-to-alibaba-cloud-oss-1
4. MinIO https://min.io/
5. Podmanでのファイル作成の使用 https://docs.oracle.com/ja/learn/podman-compose/index.html#start-the-podman-socket