先日オブジェクトストレージである Amazon S3 を NFSとしてマウント可能とする Amazon S3 Files がアナウンスされましたので早速触っていきたいと思います。
Amazon S3 Files
AWS Lambda、Amazon EC2、Amazon ECS、Amazon EKS等、あらゆる AWS コンピューティングリソースと Amazon S3 をつなぐ新しいファイルシステムです。NFSv4.1 以降のすべての操作(作成・読み取り・更新・削除)をサポートしています。
S3 Files は内部的に Amazon EFS を基盤としており、アクティブなデータへのアクセスで約 1 ミリ秒という低レイテンシーを実現しています。セキュリティ面では、データの転送中は TLS 1.3 で暗号化され、保管時も SSE-S3 または AWS KMS のカスタマーマネージドキーによって常に保護されます。アクセス制御は IAM と統合されており、ファイルシステムレベルとオブジェクトレベルの両方できめ細かく権限管理が可能です。また、運用面では Amazon CloudWatch によるパフォーマンス監視と、AWS CloudTrail による管理イベントのログ記録にも対応しており、本番環境での利用にも十分な可観測性を備えています。
Amazon EFS と S3 Files
S3 Files は 内部的にEFSにより実現されていることがドキュメント上記載されています。つまり、クライアントとS3バケットの間にEFSが存在しNFS機能を提供してくれます。クライアントはEFSに対してNFS操作を行い、それが約60秒間隔でS3へ同期されるという内部構造となっています。
1MB以上のファイル読み込みの場合は、内部EFS層を介さず直接S3経由でGETを行うようです。1MB未満の場合読み込みは、EFSが一度S3から読み込みを行いクライアントへファイルを戻す形となります。
これらの挙動からEFS単独で利用した場合よりは読み込みレイテンシが増加する構造となっているため注意が必要です。
Mountpoint for Amazon S3 との違い
従来S3をNFSとしてマウントさせる機能として Mountpoint for Amazon S3 というものがありました。これはFUSEという仕組みで実現されていました。FUSEはアプリケーションが open や read といったファイル操作を行うと、それを受け取り、裏側でS3のAPIコールに変換して結果を返す、という流れになります。いわば「ファイル操作とS3 APIの通訳」のような役割を果たしています。キャッシュ層を持たず変換のオーバーヘッドが通常のS3パフォーマンスに加えて発生しますが、S3 Files の場合EFSがキャッシュ層としての役割を果たすため高速に動作します。
また Mountpoint ではファイルの削除や rename/mv が行えない等更新系にはかなりの制限が存在しています。読み込み専用と割り切った方がいいかもしれません。
さっそくやってみる
S3 Filesは汎用S3バケットにアタッチする形式をとるため、まずは任意の汎用S3バケットを作成します。
次に左ペインの File systems を指定します。

Create file system をクリックします。

先ほど作成したバケットを指定するとバージョニングを指定するよう指示されますので有効化します。

アクセスポイントを作成するVPCを指定して Create file systemをクリックします。

しばらく待つとファイルシステムが作成されマウントターゲットが各サブネットごとに作成されます。

次にEC2でNFS Client用インスタンスを作成します。以下の通り作成画面でS3 Filesを指定できるようになっています。

Mount command が表示されているので手元にコピーしておきます。
次にIAM ロールを作成します。以下の権限を付与しています。

これをEC2にアタッチします。

EC2のターミナルで先ほどコピーしたマウント用コマンドを実行します。
curl https://amazon-efs-utils.aws.com/efs-utils-installer.sh | sh -s -- --install-launch-wizard \
--mount-s3files fs-0d26255df6c3150ea /mnt/s3/fs1うまくいかない場合EC2にアタッチしたIAMロールの権限を再度確認します。そのあと以下の手順を試してください。
S3 files の詳細画面から Attach to an EC2 instance をクリックします。

先ほど作成したEC2インスタンスを選択します。

以下に表示される手順通りにコマンドを実行すればマウントされるはずです。

df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 459M 0 459M 0% /dev/shm
tmpfs 184M 556K 183M 1% /run
/dev/nvme0n1p1 8.0G 1.7G 6.3G 21% /
tmpfs 459M 0 459M 0% /tmp
/dev/nvme0n1p128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 92M 0 92M 0% /run/user/1000
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/s3filesでは最後にファイルの書き込みテストを行います。
echo "Hello S3 Files" | sudo tee /mnt/s3files/test.txt60秒程度待ちS3バケットを確認すると無事同期されています!

本来オブジェクトストレージでは行えないファイルへの追記も以下の通り動作しています。
echo "追記テスト" | sudo tee -a /mnt/s3files/test.txt
cat /mnt/s3files/test.txt
Hello S3 Files
追記テスト
