Mountpoint for Amazon S3をDockerで起動する
概要
Mountpoint for Amazon S3はS3バケット内のオブジェクトをローカルファイルと同じように扱えるようにマウントするツールです。
特徴は高スループットな点で、読み取り負荷の大きい大規模アプリケーションの本番利用にも耐えられると謳っています。
Mountpoint for Amazon S3はLinux系OSをサポートしていますが、macOSはサポート外です。
そこで、多くの環境で実行できるDockerでの利用を検証しました。
Mountpoint for Amazon S3の基本的な使い方
通常の利用であればREADME.mdにあるように以下のようなコマンドで使えます。
# インストール
$ wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
$ sudo yum install -y ./mount-s3.rpm
# S3バケットをローカルディレクトリにマウント
$ mount-s3 amzn-s3-demo-bucket /path/to/mount
# S3バケットのオブジェクトに対してローカルファイルと同じように扱う
$ echo "Hello World!" > /path/to/mount/Data.txt
$ cat /path/to/mount/Data.txt
Hello World!
上のようなコマンドをLinux系OSのコンテナ上で実行すれば使えます。
Dockerで利用する
Mountpoint for Amazon S3をDockerで使う方法についてはdockerディレクトリに説明がありました。
# 公式のDockerfileをダウンロードする
$ wget https://raw.githubusercontent.com/awslabs/mountpoint-s3/main/docker/Dockerfile
# ダウンロードしたDockerfileでコンテナイメージをビルド
$ docker build -t mountpoint-s3 .
次に、このコンテナイメージを使った起動のパターンを2つ紹介します。
対話形式で実行する
上で使ったDockerfileは以下のようにEntrypoint
がmount-s3
コマンドになっています。
# Run in foreground mode so that the container can be detached without exiting Mountpoint
ENTRYPOINT [ "mount-s3", "-f" ]
そのため対話形式で使うには以下のようなコマンドで起動します。
docker run -ti --cap-add SYS_ADMIN --device /dev/fuse \
--entrypoint bash \
mountpoint-s3
他のMountpoint for Amazon S3の紹介記事ではDocker起動時に--privileged
オプションをつけるものを見かけました。
ですが--cap-add SYS_ADMIN
の方が権限を絞ることができるため安全です。
バックグラウンドで実行する
コンテナをバックグラウンド実行し、ローカルディレクトリをマウントすることでコンテナ外からアクセス可能にできます。
docker run -d --cap-add SYS_ADMIN --device /dev/fuse \
--mount type=bind,source=/path/to/mount,target=/mountpoint,bind-propagation=shared \
mountpoint-s3 \
amzn-s3-demo-bucket /mountpoint/bucket
AWS認証情報の受け渡し
EC2インスタンス等のAWSリソース上で実行する場合はIAMロールで権限を与える方法が推奨されています。
ローカルPCで実行する場合はホストOS上の認証情報を使うと簡便な場合が多いです。
その場合、~/.aws
をマウントすることで実現できます。
docker run -ti --rm --cap-add SYS_ADMIN --device /dev/fuse \
-v ~/.aws:/root/.aws:ro \
-e AWS_PROFILE="${aws_profile}" \
--entrypoint bash \
mountpoint-s3
この方法は以下の記事でAWS CLI v2のDockerコンテナに関連して紹介されています。
mount-s3以外の複数コマンド実行
Dockerコンテナで起動して複数のコマンドを実行後、すぐに終了したい場合があると思います。
その場合は以下のような方法で実現可能です。
docker run --rm --cap-add SYS_ADMIN --device /dev/fuse \
-v ~/.aws:/root/.aws:ro \
-e AWS_PROFILE="${aws_profile}" \
--entrypoint bash \
mountpoint-s3 \
-c "mount-s3 ${s3_bucket} /mnt > /dev/null 2>&1 && ls /mnt"
ちなみに公式Dockerfileはベースがamazonlinux:2023
なので、パッケージのインストールはdnf
コマンドで行います。
次の例ではコンテナを起動後にS3バケット内すべてのファイルをリストアップできます。
docker run --rm --cap-add SYS_ADMIN --device /dev/fuse \
-v ~/.aws:/root/.aws:ro \
-e AWS_PROFILE="${aws_profile}" \
--entrypoint bash \
mountpoint-s3 \
-c "dnf install -y findutils > /dev/null 2>&1 && mount-s3 ${s3_bucket} /mnt > /dev/null 2>&1 && find /mnt -type f"
参考資料
- Mountpoint for Amazon S3のAWS公式ユーザーガイド: Mountpoint for Amazon S3 の使用 - Amazon Simple Storage Service
- Mountpoint for Amazon S3(GitHubリポジトリ): awslabs/mountpoint-s3: A simple, high-throughput file client for mounting an Amazon S3 bucket as a local file system.
Discussion