AWS製のS3マウントツール「Mountpoint for Amazon S3」を試してみた

Mountpoint for Amazon S3 は高スループットが求められるワークロード向けのS3マウントツールです。
2023.07.11

札幌オフィスの中川です。

少し前に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対応もされそうです。決してどんなケースでも採用できるツールではありませんが、今後使用できるケースが増えることは期待したいです。

今回は基本動作の確認までに留まりましたが、別の機会ではベンチマークをとってパフォーマス面の確認もできればと思います。

参考