📁

Mountpoint for Amazon S3をDockerで起動する

2025/01/24に公開

概要

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は以下のようにEntrypointmount-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"

参考資料

Discussion