ちょっと話題の記事

[アップデート] Mountpoint for Amazon S3 が GA されました。

αリリースとなっていた高スループットが求められる環境向けの AWS 製 S3 マウントツール「Mountpoint for Amazon S3」が一般公開されました。
2023.08.15

こんにちは、AWS事業本部の平木です!

少し前より、αリリースとして公開されていた Mountpoint for Amazon S3 が GA (一般公開)されたため執筆しました。

αリリース分のブログは下記をご覧ください。

Mountpoint for Amazon S3 とは

Mountpoint for Amazon S3 は、Linux アプリケーションが直接 Amazon S3 バケットへのファイルベースでの接続を可能にするオープンソースのファイルクライアントです。
これにより、大規模な読み込み負荷のあるアプリケーション(例えばデータレイク、機械学習トレーニング、画像レンダリング、自動運転車シミュレーション、ETL等)でも本番環境で使用できます。

特徴

パフォーマンスと安定性

マウントポイントは、各 EC2 インスタンスと S3 間の最大100 GB/秒のデータ転送など、S3 が提供する柔軟なスループットを活用できます。これにより、大量の S3 への高効率なアクセスが可能になります。

柔軟な内部操作

Mountpoint for Amazon S3 は、Linux Virtual File System(VFS)を使用してシステム操作をマウントポイントへの呼び出しに変換し、その後 S3 への呼び出し(LIST、GET、PUTなど)に変換します。
これにより、ネットワーク帯域幅を最大限に活用して処理能力を強化し、時間を節約しつつコンピューティングコストを削減できます。

Mountpoint for Amazon S3 と s3fs の違い

従来、EC2 と S3 を同期させるツールとして、s3fs を使用していました。
s3fs はパフォーマンスに課題がありましたが、Mountpoint for Amazon S3 を使用することでバケットの内容をローカル ファイルであるかのように走査し、パフォーマンスのチューニングやプロビジョニングを気にせずにオブジェクトへの高スループットのアクセスを実現できます。

パフォーマンスの違いについては別途検証ブログを執筆したいと思います。

サポートしているマウント

  • Amazon EC2 インスタンス
  • Container Service
    • Amazon ECS (Elastic Container Service) on EC2
    • EKS (Elastic Kubernetes Service)
  • オンプレミスシステム
    • 既存のオンプレミスシステムにインストールすることも可能で、AWS PrivateLink for Amazon S3 や Direct Connect 経由で S3 にアクセスできます。

対応しているストレージクラス

  • 読み取り可、書き込み可
    • S3 Standard
    • S3 Standard - IA
    • S3 Glacier Instant Retrieval
    • S3 Intelligent-Tiering (Archive Access 層、Deep Archive Access 層を除く)
  • 読み取り不可、書き込み可
    • S3 Glacier Flexible Retrieval
    • S3 Glacier Deep Archive
    • S3 Intelligent-Tiering (Archive Access 層、Deep Archive Access 層)

権限

EC2 のインスタンスプロファイルや ECS のタスクロール(タスク実行ロールではありません)へ
下記 API の許可または AmazonS3FullAccess の権限を付与する必要があります。

  • s3:ListBucket
  • s3:GetObject
  • s3:PutObject
  • s3:AbortMultipartUpload
  • s3:DeleteObject

使用方法

1.マウントポイントは RPM 形式で提供されているため、wgetコマンドとyumコマンドを用いることで簡単にインストールを行うことが可能です。

$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
$ sudo yum install ./mount-s3.rpm

2.インストールした後、あらかじめ作成したマウントポイントに S3 バケットをマウントします。
/path/to/mount : マウントしたいディレクトリのパス
DOC-EXAMPLE-BUCKET : マウントしたい S3 バケット名 (アクセスポイントの ARN やエイリアスも使用可)

$ mkdir /path/to/mount
$ mount-s3 DOC-EXAMPLE-BUCKET /path/to/mount

以上が、Mountpoint for Amazon S3 の基本的な使い方となります。

ECS on EC2 でやってみた

下記構成のように ECS on EC2 に対して ECSExec を使用して接続し、
S3バケットへマウントしてみました。

掻い摘んだ説明のため ECS on EC2 の構築の仕方の詳細は、
下記 AWS 公式ハンズオンの手順をご確認ください。
ECS Web Application ハンズオン

Dockerfile は下記のように記載しました。

FROM amazonlinux:2

# install amazon-linux-extras install
RUN amazon-linux-extras install -y

# Install dependencies
RUN yum update -y && \
 yum -y install httpd \
 systemd \
 tar \
 unzip \
 sudo
 
RUN systemctl enable httpd

# install aws cli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && sudo ./aws/install

# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html

RUN yum install -y wget
RUN wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
RUN yum install -y ./mount-s3.rpm

# init
CMD ["/sbin/init"]

ECS のタスク定義では、 containerDefinitions の中に下記を追記します。

~~~略~~~
"privileged": true,
"linuxParameters": {
    "capabilities": {
        "add": [
            "SYS_ADMIN"
        ]
    },
    "devices": [
        {
            "hostPath": "/dev/fuse",
            "containerPath": "/dev/fuse"
        }
    ]
},
~~~略~~~

上記 Dockerfile とタスク定義を使用し、ECS on EC2 を構築します。

構築ができたら CloudShell から ECSExec でコンテナに接続します。
ECSExec の有効化の仕方は下記ブログを参照ください。

ECSExec で対象タスクに接続します。

$ aws ecs execute-command \
	--cluster test-cluster \
	--task xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
	--container helloworld \
	--interactive \
	--command "/bin/bash"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-05b52217e0fdb9e6b
bash-4.2#

バージョンを確認すると、現在時点(2023/08/15)では 1.0.0 と表示されます。

bash-4.2# mount-s3 --version
mount-s3 1.0.0
bash-4.2#

続いてマウントをするkeisuke-pocというディレクトリを作成し、
実際にkeisuke-poc-tmpという S3 バケットにマウントします。
マウント時に、--prefixを指定することで特定のオブジェクトキーとマウントさせることも可能です。

bash-4.2# mkdir keisuke-poc
bash-4.2# mount-s3 keisuke-poc-tmp keisuke-poc/ 
bucket keisuke-poc-tmp is mounted at keisuke-poc/
bash-4.2#

現在対象 S3 バケットには下記オブジェクトがありますが、

マウントしたディレクトリをlsコマンドで参照すると、

このように参照できていることが分かります。

アンマウントしたい場合は、

bash-4.2# umount keisuke-poc

で可能です。

サービスで実行する場合等詳細は下記を参照ください。

できること と できないこと

できること

  • lsコマンド 等でファイル名を参照する
  • catコマンド等でファイルの中身を参照する

  • touchコマンド等でのファイル作成

  • rmコマンド等でのファイル削除

ただしファイル削除を許可する場合は、
マウント時に--allow-deleteを指定する必要があります。

  • S3 オブジェクトに対する変更アクションを禁止する。

マウント時に--read-onlyを指定する必要があります。

ちなみにマウント時に--allow-delete--read-onlyを両方指定した場合、
--read-onlyが優先されることが分かりました。

できないこと

  • 既存ファイルの上書き

echo コマンドで追記しようとしましたが、出来ませんでした。

注意点

  • Fargate などの AWS 管理のコンテナ環境では利用できない
    • Mountpoint は、Linux FUSE サブシステムを使用してファイル システムをマウントします。 Docker コンテナ内で FUSE ファイル システムを実行するには、ホスト インスタンスに昇格されたルートレベルの権限をコンテナに付与する必要があります。
  • Amazon S3 Encryption Client を使用したクライアント側の暗号化をサポートしていない
    • Mountpoint は、Amazon S3 Encryption Client を使用したクライアント側の暗号化をサポートしていません。
    • Amazon S3 管理キー (SSE-S3)、AWS KMS キー (SSE-KMS)、または AWS KMS キーによる二重層暗号化 (DSSE-KMS) で暗号化されたオブジェクトの読み取りをサポートします。
  • 特権モードのコンテナは SecurityHub のコントロールに引っかかります。
  • 完全な POSIX セマンティクスを必要としないファイルベースのワークロードをサポートしている。
    • POSIX セマンティクスが必要な場合は、Amazon FSx for Lustre を検討する必要があります。

参考

おわりに

Mountpoint for Amazon S3 は、大規模な読み込み負荷のあるアプリケーションでも本番環境で使用できる非常に便利なツールです。
さらに、既存のツールやスキルを活用してS3バケット内のオブジェクトを処理することが可能になります。
S3バケットをポータブルに活用することは、大規模なデータを扱う環境において大きなメリットとなります。
下記リンクにてロードマップも公開されていますので今後のアップデートも期待大です。
Roadmap · Mountpoint for Amazon S3 - Public Roadmap

この記事がどなたかの役に立てば嬉しいです。