[アップデート] Mountpoint for Amazon S3 が GA されました。
こんにちは、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 のコントロールに引っかかります。
- AWS SecurityHub 基礎セキュリティには「[ECS.4] ECS コンテナは、非特権として実行する必要があります」というコントロールがあり、タスク定義上で
privilege=true
が存在する場合に非準拠となります。 - 【Security Hub修復手順】[ECS.4] ECS コンテナは、非特権として実行する必要があります | DevelopersIO
- AWS SecurityHub 基礎セキュリティには「[ECS.4] ECS コンテナは、非特権として実行する必要があります」というコントロールがあり、タスク定義上で
- 完全な POSIX セマンティクスを必要としないファイルベースのワークロードをサポートしている。
- POSIX セマンティクスが必要な場合は、Amazon FSx for Lustre を検討する必要があります。
参考
- Working with Mountpoint for Amazon S3 - Amazon Simple Storage Service
- mountpoint-s3/docker at main · awslabs/mountpoint-s3
- mountpoint-s3/doc/CONFIGURATION.md at main · awslabs/mountpoint-s3
- Mountpoint for Amazon S3 – 一般公開されており、本番環境のワークロードにも対応可能 | Amazon Web Services ブログ
- s3fs-fuse/s3fs-fuse: FUSE-based file system backed by Amazon S3
- Open Source File Client – Mountpoint for Amazon S3 – AWS
おわりに
Mountpoint for Amazon S3 は、大規模な読み込み負荷のあるアプリケーションでも本番環境で使用できる非常に便利なツールです。
さらに、既存のツールやスキルを活用してS3バケット内のオブジェクトを処理することが可能になります。
S3バケットをポータブルに活用することは、大規模なデータを扱う環境において大きなメリットとなります。
下記リンクにてロードマップも公開されていますので今後のアップデートも期待大です。
Roadmap · Mountpoint for Amazon S3 - Public Roadmap
この記事がどなたかの役に立てば嬉しいです。