CLOVER🍀

That was when it all began.

Amazon S3互換のオブジェクトストレージMinIOをs3fsでマウントする

これは、なにをしたくて書いたもの?

Amazon S3バケットをファイルシステムにマウント使いたいと思うことがあるのですが、s3fsをちょっと試しておこうかなと思いまして。

リモートのストレージをファイルシステムとしてマウントしていろいろ作業はしたい、という時の選択肢としてはNFSかなと思うのですが、
ちょっと面倒なので。性能や可用性が求められていなければ、Amazon S3互換のストレージをファイルシステムとしてマウントするのも
ありかなと。

Amazon S3バケットをマウントする選択肢

Amazon S3バケットをマウントする選択肢としては、以下があります。

一見、AWSの提供するMountpoint for Amazon S3がよいのかなと思うのですが。

Mountpoint for Amazon S3 – 一般公開されており、本番環境のワークロードにも対応可能 | Amazon Web Services ブログ

Mountpoint for Amazon S3 の使用 - Amazon Simple Storage Service

現時点の最新版であるv1.5.0においても変更操作はサポートされていないので、ちょっと微妙です。

but probably not the right fit for applications that:

・use file operations that S3 doesn't natively support, like directory renaming or symlinks
・make edits to existing files (don't work on your Git repository or run vim in Mountpoint 😄)

https://github.com/awslabs/mountpoint-s3/blob/v1.5.0/README.md

Goofysについては、すでに開発が止まっている様子です。

s3fsはまだまだ開発が続いていそうなのと、ファイルの変更などもできそうだったので今回はこちらにします。

また、Amazon S3の代わりにMinIOをマウントしたいと思います。

MinIO | S3 & Kubernetes Native Object Storage for AI

s3fs

s3fsは、Linux、macOSおよびFreeBSDでFUSE(ユーザー空間のファイルシステム)経由でAmazon S3バケットをマウントできるものです。

GitHub - s3fs-fuse/s3fs-fuse: FUSE-based file system backed by Amazon S3

s3fsの特徴はこちら。

  • ファイル、ディレクトリ、シンボリックリンク、モード、uid/gid、拡張属性の読み取り/書き込みを含むPOSIXのサブセット
  • Amazon S3およびその他Amazon S3ベースのオブジェクト ストアとの互換性
  • ランダム書き込みおよび追記が可能
  • 大きなファイルのマルチパートアップロードが可能
  • リネームが可能(サーバーサイドのコピーを利用)
  • オプションでサーバーサイド暗号化が可能
  • MD5ハッシュによるデータの整合性確認
  • インメモリーメタデータキャッシュ
  • ローカルディスクデータキャッシュ
  • ユーザー指定のリージョンの利用(Amazon GovCloudを含む)
  • v2またはv4署名による認証

Features

インストール方法としても、OSのパッケージ管理システム等で簡単にインストール可能なようです。

Installation

Windowsも記載はありますが、コンパイルすることになるようです。

一方で、以下のような制限事項もあります。

  • ファイルへのランダム書き込みまたは追記は、オブジェクト全体の書き換えとなりマルチパートアップロードされる
  • ネットワーク環境によっては、ディレクトリのリスティングなどメタデータ操作のパフォーマンスが低下する
  • AWS以外のプロバイダーの場合で結果整合性を使っているものは、一時的に古いデータが見えることがある
  • ファイルやディレクトリをアトミックにリネームできない
  • 同じバケットをマウントするクライアント間での調整は行われない
  • ハードリンクはサポートしない
  • inotifyはローカルの変更のみを検出し、他のクライアントやツールによる変更を検出しない

Limitations

というわけで、変更が可能だといってもオブジェクトストレージという性質上パフォーマンス的には不利だったり、複数のアクセスに対する
調整は行われないといったあたりが注意点ですね。
NFS等を使っても相応にトレードオフはありますが。

ドキュメントはこちら。

Home · s3fs-fuse/s3fs-fuse Wiki · GitHub

ベースとなるAmazon S3での使い方や設定はこちらですね。

Fuse Over Amazon · s3fs-fuse/s3fs-fuse Wiki · GitHub

各種Amazon S3互換のオブジェクトストレージでの使い方も書かれています。

Non Amazon S3 · s3fs-fuse/s3fs-fuse Wiki · GitHub

FAQも見ておいた方がよいでしょう。

FAQ · s3fs-fuse/s3fs-fuse Wiki · GitHub

ちなみに、Google Cloud Strorage向けのページもあったりします。

Google Cloud Storage · s3fs-fuse/s3fs-fuse Wiki · GitHub

今回は、こちらのs3fsを使っていきます。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

今回はこのUbuntu Linux 22.04 LTSを2つ用意し、片方にはMinIOをインストールして、もう片方にはs3fsをインストールしてMinIOを
ファイルシステムとしてマウントします。

MinIOをインストールする方のサーバーのIPアドレスは、192.168.33.11とします。

MinIOをインストールする

まずはMinIOをインストールします。

MinIO | Code and downloads to create high performance object storage

$ curl -LO https://dl.min.io/server/minio/release/linux-amd64/minio_20240321231343.0.0_amd64.deb
$ sudo dpkg -i minio_20240321231343.0.0_amd64.deb

バージョン。

$ minio --version
minio version RELEASE.2024-03-21T23-13-43Z (commit-id=7fd76dbbb71eeba0dd1d7c16e7d96ec1a9deba52)
Runtime: go1.21.8 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2024 MinIO, Inc.

データ用のディレクトリを作成して起動。

$ mkdir data
$ MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password minio server data --console-address ":9001"

管理ユーザーの名前とパスワードは、ダウンロードページのサンプルと同じadmin/passwordとします。

MinIOのクライアントもインストール。

$ curl -LO https://dl.min.io/client/mc/release/linux-amd64/mcli_20240320210729.0.0_amd64.deb
$ sudo dpkg -i mcli_20240320210729.0.0_amd64.deb

バージョン。

$ mcli --version
mcli version RELEASE.2024-03-20T21-07-29Z (commit-id=9043bbf545d244b2dee9eefc5031d5dca1ccf78f)
Runtime: go1.21.8 linux/amd64
Copyright (c) 2015-2024 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

MinIOサーバーへの接続設定をして、バケットを作成しておきます。

$ mcli alias set myminio http://localhost:9000 admin password
$ mcli mb myminio/my-bucket

ファイルの作成とアップロード。

$ echo 'Hello World' > hello.txt
$ mcli cp hello.txt myminio/my-bucket/hello.txt

MinIOの操作はここまでです。

s3fsをインストールしてMinIOのバケットをマウントする

それでは、s3fsをインストールしてMinIOのバケットをマウントしましょう。

まずはs3fsのインストール。

$ sudo apt install s3fs

とても簡単にインストールできますね。

バージョン。

$ s3fs --version
Amazon Simple Storage Service File System V1.90 (commit:unknown) with GnuTLS(gcrypt)
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ヘルプを見てみます。

$ s3fs --help
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

バケット名だけではなく、パスも指定してマウントできそうですね。

では、ドキュメントにあるとおりにMinIOへマウントを指定してみます。

$ s3fs my-bucket -o url=http://192.168.33.11:9000 -o use_path_request_style
s3fs: missing MOUNTPOINT argument.
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

Non Amazon S3 · s3fs-fuse/s3fs-fuse Wiki · GitHub

マウントポイントの指定が足りません、と。どうやらこのページにはオプションを中心に記載しているようですね。

マウントポイントなるディレクトリを作成して

$ mkdir mountpoint

マウント。

$ s3fs my-bucket mountpoint -o url=http://192.168.33.11:9000 -o use_path_request_style
s3fs: could not determine how to establish security credentials.

今度はクレデンシャルがないと言われました。それはそうですね。

クレデンシャルはどこで指定するのでしょう?このあたりに書いてあります。

ファイルで指定する場合は、ファイルの所有者のみがアクセス可能なように設定する必要があります。

$ echo 'admin:password' > $HOME/.passwd-s3fs
$ chmod 600 $HOME/.passwd-s3fs

再度実行。

$ s3fs my-bucket mountpoint -o url=http://192.168.33.11:9000 -o use_path_request_style

今度はうまくいきました。

$ ll mountpoint
合計 5
drwx------ 1 xxxxx xxxxx    0  1月  1  1970 ./
drwxr-x--- 5 xxxxx xxxxx 4096  3月 23 21:50 ../
-rw-r----- 1 xxxxx xxxxx   12  3月 23 21:49 hello.txt


$ cat mountpoint/hello.txt
Hello World

ファイルの変更もできます。

$ echo 'Hello World!!' > mountpoint/hello.txt
$ cat mountpoint/hello.txt
Hello World!!

止め方は…わからなかったのでプロセスをkillしました…。

ここで1度、クレデンシャルを削除しておきます。

$ rm .passwd-s3fs

OSの起動時にマウントする

OSの起動時にマウントするためには、以下のように/etc/fstabに追記します。

my-bucket /path/to/mountpoint fuse.s3fs _netdev,allow_other,passwd_file=/path/to/.passwd-s3fs,use_path_request_style,url=http://[MinIOが動作ししているサーバー]:9000 0 0

追記後はOSを再起動するか、以下のコマンドで反映します。

$ sudo mount -a

おわりに

Amazon S3互換のオブジェクトストレージMinIOを、s3fsでマウントしてみました。

クレデンシャルの指定方法が独特?だったりしたくらいで、特に困ることなく導入できました。

オブジェクトストレージをマウントするというところで注意点はあるのですが、使えるところでは使いたいというか、覚えておきたいですね。