これは、なにをしたくて書いたもの?
Amazon S3バケットをファイルシステムにマウント使いたいと思うことがあるのですが、s3fsをちょっと試しておこうかなと思いまして。
リモートのストレージをファイルシステムとしてマウントしていろいろ作業はしたい、という時の選択肢としてはNFSかなと思うのですが、
ちょっと面倒なので。性能や可用性が求められていなければ、Amazon S3互換のストレージをファイルシステムとしてマウントするのも
ありかなと。
Amazon S3バケットをマウントする選択肢
Amazon S3バケットをマウントする選択肢としては、以下があります。
- Mountpoint for Amazon S3
- s3fs
- Goofys
一見、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署名による認証
インストール方法としても、OSのパッケージ管理システム等で簡単にインストール可能なようです。
- Amazon Linux
- Arch Linux
- Debian/Ubuntu Linux
- Fedora
- Gentoo
- RHEL/CentOS
- SUSE/openSUSE
- macOS(Homebrew)
- FreeBSD
Windowsも記載はありますが、コンパイルすることになるようです。
一方で、以下のような制限事項もあります。
- ファイルへのランダム書き込みまたは追記は、オブジェクト全体の書き換えとなりマルチパートアップロードされる
- ネットワーク環境によっては、ディレクトリのリスティングなどメタデータ操作のパフォーマンスが低下する
- AWS以外のプロバイダーの場合で結果整合性を使っているものは、一時的に古いデータが見えることがある
- ファイルやディレクトリをアトミックにリネームできない
- 同じバケットをマウントするクライアント間での調整は行われない
- ハードリンクはサポートしない
- inotifyはローカルの変更のみを検出し、他のクライアントやツールによる変更を検出しない
というわけで、変更が可能だといってもオブジェクトストレージという性質上パフォーマンス的には不利だったり、複数のアクセスに対する
調整は行われないといったあたりが注意点ですね。
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.
今度はクレデンシャルがないと言われました。それはそうですね。
クレデンシャルはどこで指定するのでしょう?このあたりに書いてあります。
- Examples
passwd_fileコマンドラインオプションAWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEY環境変数${HOME}/.aws/credentials${HOME}/.passwd-s3fs/etc/passwd-s3fs
ファイルで指定する場合は、ファイルの所有者のみがアクセス可能なように設定する必要があります。
$ 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でマウントしてみました。
クレデンシャルの指定方法が独特?だったりしたくらいで、特に困ることなく導入できました。
オブジェクトストレージをマウントするというところで注意点はあるのですが、使えるところでは使いたいというか、覚えておきたいですね。