AWS製のS3マウントツール「Mountpoint for Amazon S3」を試してみた
札幌オフィスの中川です。
少し前に S3 バケットをローカルファイルシステムとしてマウントするためのファイルクライアントツールとして、Mountpoint for Amazon S3 が登場していました。
ファイルシステム上の操作を Get や List のような S3 オブジェクト API に変換し、アプリケーションが open や read といったファイル操作を通じて S3 にアクセスできるようにします。
ツールは Rust で書かれており、ペタバイトクラスのデータ処理を必要とするような読み取り負荷の高いワークロード向けに最適化されています。
また、先日のアップデートで書き込みも一部サポートされました。 ※2023 年 7 月時点では新規ファイルの作成のみサポートされており、既存のファイルへの更新や削除はサポートされてません
本記事では Mountpoint for Amazon S3 の導入から動作確認したことを紹介します。
やってみた
以下の環境で動作確認します。
- OS は Amazon Linux 2023
- OS 上の操作はすべて root 権限で実施
- EC2 の IAM ロールに S3 バケットへのアクセス権を付与
導入
Readmeに従って導入します。まず、必要なコンポーネントをインストールします。
$ yum install fuse fuse-devel cmake3 clang git pkg-config
続いて Rust のコンパイラーをインストールします。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source "$HOME/.cargo/env"
リポジトリをクローンして、コンパイルを実行します。
$ git clone --recurse-submodules https://github.com/awslabs/mountpoint-s3.git
cd mountpoint-s3
$ cargo build --release
コンパイルが完了すると target/release/ 配下に mount-s3
というバイナリファイルが生成されます。実行できるように、mount-s3 をパスが通っているディレクトリに移動させます。
$ mv target/release/mount-s3 /usr/bin/
基本操作の確認
マウント、ファイル読み込み、アンマウント
S3 バケットを作成します。
$ S3_BUCKET_NAME=【作成するバケット名】
$ aws s3 mb s3://${S3_BUCKET_NAME}
適当なファイル作り、S3 にコピーします。
$ touch testfile_01
$ aws s3 cp testfile_01 s3://${S3_BUCKET_NAME}/
/mnt に対して、マウントします。
$ mount-s3 ${S3_BUCKET_NAME} /mnt
S3 にコピーしたファイルが表示され、マウントできていることを確認できます
$ ls /mnt
testfile_01
アンマウントも確認します。アンマウントは OS 標準の umount
コマンドを使います。
$ umount /mnt
$ ls /mnt
ファイル作成【結果:可能】
再度マウントし、他の動作を検証します。
今回のアップデートでファイル作成が可能になっているので試します。touch コマンドで作成してみます。
$ touch /mnt/testfile_02
touch: setting times of '/mnt/testfile_02': Function not implemented
$ echo $?
1
関数の実装がされていない旨の表示がされ、異常終了と扱われていました。ただ、実際にディレクトリや S3 を確認してみると、ファイルが作成されていることを確認できます。
$ ls /mnt
testfile_01 testfile_02
$ aws s3 ls ${S3_BUCKET_NAME}
2023-07-11 06:27:41 0 testfile_01
2023-07-11 06:39:51 0 testfile_02
念のため、空でないファイルを作成して確認します。
$ cat << EOF > /mnt/testfile_03
> test
> 03
> desu
> EOF
$ ls /mnt/
testfile_01 testfile_02 testfile_03
$ cat /mnt/testfile_03
test
03
desu
ファイル内容含め問題なくファイル作成できることを確認しました。ファイルの作成方法によっては異常終了となる場合があるので気をつけたほうが良いようです。
ファイル更新【結果:不可】
続いて、ファイル更新についても試してみます。仕様ではファイル更新はサポートされておりません。
作成したファイルに追記してみます。
$ echo "test 4" >> /mnt/testfile_03
bash: /mnt/testfile_03: Operation not permitted
$ cat /mnt/testfile_03
test
03
desu
操作が許可されていないエラーとなり、ファイル更新もされませんでした。
ファイル削除【結果:不可】
ファイル削除も試してみます。
$ rm /mnt/testfile_03
rm: remove regular file '/mnt/testfile_03'? y
rm: cannot remove '/mnt/testfile_03': Function not implemented
削除についても、仕様通りサポートされておりませんでした。
ユースケースについて
S3 マウントツールといえば、これまで s3fs や goofys といったツールが使われてきましたが、Mountpoint for Amazon S3 はこれらのツールとユースケースが異なります。
Mountpoint for Amazon S3 は大規模分析アプリケーションなどでの利用が想定されています。
ゲノム研究や機械学習トレーニングパイプラインで使われるツールでは、S3 API がネイティブにサポートされておらず、ローカルファイルシステムから大量のファイルを入出力しなくてはいけないことがあります。
Mountpoint for Amazon S3 を使うことによって、上記のようなドメイン特化したツールでも、大量の S3 データを並行して読み取りや新規ファイルの作成が可能になります。
以下を満たすようなケースであれば、本ツールを検討しても良いのではないかと思います。
- 高スループットが求められ読み取り負荷が高いワークロード
- ファイルシステムとしてアクセスが必須(S3 API がサポートされていない)
- 完全な POSIX サポートを必要としていない
- 書き込みは新規ファイルのみ
- 既存ファイルへの更新や削除の操作はしない
もし完全な POSIX サポートを必要としているようであれば、Amazon FSx for Lustre の S3 リンク機能や Amazon File Cache といったサービスの利用を検討ください。
さいごに
AWS から S3 のマウントツールとして Mountpoint for Amazon S3 が登場しました。
Mountpoint for Amazon S3 ではよりローカルファイルアクセスが必要な分析アプリケーションなどを想定して作られています。
ロードマップを見ると将来的には Windows 対応もされそうです。どんなケースでも採用できるツールではありませんが、今後使用できるケースが増えることは期待したいです。
今回は基本動作の確認までに留まりましたが、別の機会ではベンチマークをとってパフォーマス面の確認もできればと思います。