Mountpoint for S3をEC2で使う

はじめに

Mountpoint for S3は、Amazon S3バケットをLinuxファイルシステムとしてマウントできるツールである。
従来のS3 APIを使ったアクセスとは異なり、標準的なファイル操作(lscatcpなど)でS3オブジェクトを操作できるため、直感的に使用できる。

今回は、EC2インスタンス上でMountpoint for S3をセットアップし、実際にS3バケットをマウントして使用することを試してみる。

Mountpoint for S3は、Amazon S3バケットをPOSIX準拠のファイルシステムとしてマウントできるオープンソースツールである。

環境

EC2 Amazon Linux 2023
mount-s3 1.18.0

準備

EC2インスタンスの準備

試験用のインスタンスは以下で作成をした。

項目設定値
名前test-ec2
OSAmazonLinux2023 AMI
アーキテクチャ64ビット(Arm)
インスタンスタイプt4g.nano
キーペアtest-ec2-key-pair
セキュリティグループec2-security-group
ストレージ8GB (gp3)
create-ec2-01

S3バケットの準備

testsamplebucket-01 というバケットを作成

create-s3-01

前提条件

IAMポリシーの作成

上記の権限を持つカスタムポリシーを作成する。

必要な権限は以下となる。

権限説明用途必要性
s3:GetObjectオブジェクトの読み取りファイルの閲覧・ダウンロード必須(読み取り操作)
s3:PutObjectオブジェクトの書き込みファイルの作成・アップロード必須(書き込み操作)
s3:DeleteObjectオブジェクトの削除ファイルの削除必須(削除操作)
s3:ListBucketバケット内容の一覧表示ディレクトリ構造の表示(lsコマンド)必須(一覧表示)
s3:GetBucketLocationバケットのリージョン取得接続時のリージョン確認必須(接続時)
s3:AbortMultipartUploadマルチパートアップロードの中止大容量ファイルアップロードの管理推奨(大容量ファイル)
s3:ListMultipartUploadPartsマルチパートの部分一覧アップロード状況の確認推奨(大容量ファイル)

また、特定のbucketのみの許可とするため、今回作成したtestsamplebucket-01ARNを設定する。

create-policy-01 create-policy-02

ポリシーJSON

作成されたポリシーのJSONは以下となっている。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetBucketLocation",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::[作成したバケット名]",
                "arn:aws:s3:::[作成したバケット名]/*"
            ]
        }
    ]
}

EC2にIAMロール(S3にアクセスする権限があるロール)をアタッチする

  1. インスタンスを選択→セキュリティ→IAMロールを変更を選択する
attach-iam-role-01
  1. 新しいIAMロールを作成を選択
attach-iam-role-02
  1. ロールを作成を選択
attach-iam-role-03
  1. サービス「EC2」→「次へ」を選択
attach-iam-role-04
  1. 先ほど作成したIAMポリシーを選択し、「次へ」
attach-iam-role-05
  1. ロール名を決めて作成をする
attach-iam-role-06
  1. 2の画面で作成したロールを選択する
attach-iam-role-07

Mountpoint for S3のインストール

rpmパッケージからのインストール

OSがAmazon Linuxなので、公式の手順に従ってインストールを行う。
また、Armなので、arm64のパッケージを利用する。

RPMパッケージをダウンロードする

wget https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.rpm

パッケージ署名の検証

  1. GPGのインストール
dnf install -y gpg
  1. パブリックキーのダウンロード
wget https://s3.amazonaws.com/mountpoint-s3-release/public_keys/KEYS
  1. マウントポイントのGPGキーのインストール
gpg --import KEYS
  1. フィンガープリントの検証
gpg --fingerprint [email protected]
詳細
[root@ip-172-31-38-112 tmp]# gpg --fingerprint [email protected]
pub   rsa2048 2023-08-01 [SC] [expires: 2026-07-31]
      673F E406 1506 BB46 9A0E  F857 BE39 7A52 B086 DA5A
uid           [ unknown] Mountpoint for Amazon S3 <[email protected]>

表示されたフィンガープリント文字列が以下と一致することを確認する。

673F E406 1506 BB46 9A0E  F857 BE39 7A52 B086 DA5A
  1. パッケージ署名ファイルのダウンロード
wget https://s3.amazonaws.com/mountpoint-s3-release/latest/arm64/mount-s3.rpm.asc
  1. パッケージ署名の検証
gpg --verify mount-s3.rpm.asc
ログ
[root@ip-172-31-38-112 tmp]# gpg --verify mount-s3.rpm.asc
gpg: assuming signed data in 'mount-s3.rpm'
gpg: Signature made Fri May 30 14:02:08 2025 UTC
gpg:                using RSA key BE397A52B086DA5A
gpg: Good signature from "Mountpoint for Amazon S3 <[email protected]>" [unknown]
gpg: WARNING: Using untrusted key!
  1. 確認

Good signatureが含まれていればOK

インストール

sudo dnf install ./mount-s3.rpm
ログ
Last metadata expiration check: 0:03:05 ago on Sun Jun  1 10:00:10 2025.
Dependencies resolved.
============================================================================================================
 Package                Architecture       Version                            Repository               Size
============================================================================================================
Installing:
 mount-s3               aarch64            1.18.0-1                           @commandline             12 M
Installing dependencies:
 fuse                   aarch64            2.9.9-13.amzn2023.0.2              amazonlinux              80 k
 fuse-common            aarch64            3.10.4-1.amzn2023.0.2              amazonlinux             8.5 k

Transaction Summary
============================================================================================================
Install  3 Packages

Total size: 12 M
Total download size: 89 k
Installed size: 71 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): fuse-common-3.10.4-1.amzn2023.0.2.aarch64.rpm                        243 kB/s | 8.5 kB     00:00
(2/2): fuse-2.9.9-13.amzn2023.0.2.aarch64.rpm                               1.1 MB/s |  80 kB     00:00
------------------------------------------------------------------------------------------------------------
Total                                                                       857 kB/s |  89 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                    1/1
  Installing       : fuse-common-3.10.4-1.amzn2023.0.2.aarch64                                          1/3
  Installing       : fuse-2.9.9-13.amzn2023.0.2.aarch64                                                 2/3
  Installing       : mount-s3-1.18.0-1.aarch64                                                          3/3
  Running scriptlet: mount-s3-1.18.0-1.aarch64                                                          3/3
  Verifying        : fuse-2.9.9-13.amzn2023.0.2.aarch64                                                 1/3
  Verifying        : fuse-common-3.10.4-1.amzn2023.0.2.aarch64                                          2/3
  Verifying        : mount-s3-1.18.0-1.aarch64                                                          3/3

Installed:
  fuse-2.9.9-13.amzn2023.0.2.aarch64  fuse-common-3.10.4-1.amzn2023.0.2.aarch64  mount-s3-1.18.0-1.aarch64

Complete!

バージョン確認

mount-s3 --version
[root@ip-172-31-38-112 tmp]# mount-s3 --version
mount-s3 1.18.0

Mountpoint for S3を使ってみる

マウントポイントディレクトリの作成

# マウントポイント用ディレクトリの作成
sudo mkdir -p /mnt/s3-bucket
sudo chown ec2-user:ec2-user /mnt/s3-bucket

マウント

# S3バケットをマウント
mount-s3 [作成したバケット名] /mnt/s3-bucket

# 今回は下記となる。
mount-s3 testsamplebucket-01 /mnt/s3-bucket

マウントができた

[root@ip-172-31-38-112 tmp]# mount-s3 testsamplebucket-01 /mnt/s3-bucket
bucket testsamplebucket-01 is mounted at /mnt/s3-bucket
# マウント確認
df -hT
[root@ip-172-31-38-112 tmp]# df -hT
Filesystem       Type      Size  Used Avail Use% Mounted on
devtmpfs         devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs            tmpfs     210M     0  210M   0% /dev/shm
tmpfs            tmpfs      84M  468K   84M   1% /run
/dev/nvme0n1p1   xfs       8.0G  1.9G  6.2G  23% /
tmpfs            tmpfs     210M   25M  185M  12% /tmp
/dev/nvme0n1p128 vfat       10M  1.4M  8.7M  14% /boot/efi
tmpfs            tmpfs      42M     0   42M   0% /run/user/1000
mountpoint-s3    fuse      8.0E     0  8.0E   0% /mnt/s3-bucket

/mnt/s3-bucket があることを確認する。

ファイル操作の確認

ディレクトリの確認

# マウントしたディレクトリの内容を確認
ls -la /mnt/s3-bucket/
[root@ip-172-31-38-112 tmp]# ls -la /mnt/s3-bucket/
total 0
drwxr-xr-x. 2 root root  0 Jun  1 10:12 .
drwxr-xr-x. 3 root root 23 Jun  1 10:04 ..

ファイルの書き込み

echo "Hello,World" >> /mnt/s3-bucket/test.txt

S3にも反映されていることを確認.

bucket-test-01

ディレクトリ内容の確認

ls /mnt/s3-bucket/test.txt
cat /mnt/s3-bucket/test.txt
[root@ip-172-31-38-112 tmp]# ls /mnt/s3-bucket/test.txt
/mnt/s3-bucket/test.txt
[root@ip-172-31-38-112 tmp]# cat /mnt/s3-bucket/test.txt
Hello,World

削除を試してみる

rm /mnt/s3-bucket/test.txt
[root@ip-172-31-38-112 s3-bucket]# rm /mnt/s3-bucket/test.txt
rm: remove regular file 'test.txt'? y
rm: cannot remove 'test.txt': Operation not permitted

※削除できない。

削除できるようにマウントしてみる

--allow-delete オプションをつけてマウントを行う。

mount-s3 testsamplebucket-01 /mnt/s3-bucket --allow-delete

マウントしなおし↓

[root@ip-172-31-38-112 /]# sudo umount /mnt/s3-bucket
[root@ip-172-31-38-112 /]# mount-s3 testsamplebucket-01 /mnt/s3-bucket --allow-delete
bucket testsamplebucket-01 is mounted at /mnt/s3-bucket

再度削除をしてみる。 削除できた!

[root@ip-172-31-38-112 s3-bucket]# sudo rm test.txt
[root@ip-172-31-38-112 s3-bucket]# ll
total 0
[root@ip-172-31-38-112 s3-bucket]#

オプションについて

以下のようなオプションがある

基本的な使用方法

mount-s3 [オプション] <バケット名> <ディレクトリ>

主要オプション一覧

バケット関連オプション

オプション説明デフォルト値使用例
--prefix <PREFIX>マウントするバケット内のプレフィックスバケット全体--prefix logs/
--region <REGION>バケットのAWSリージョン自動検出--region ap-northeast-1
--endpoint-url <URL>S3エンドポイントURL自動検出--endpoint-url https://s3.amazonaws.com
--force-path-styleパススタイルアドレッシングを強制---force-path-style
--transfer-accelerationS3転送アクセラレーションを使用---transfer-acceleration
--dual-stackデュアルスタックエンドポイントを使用---dual-stack
--requester-paysリクエスター支払いを設定---requester-pays
--storage-class <CLASS>新しいオブジェクトのストレージクラス---storage-class STANDARD_IA

認証関連オプション

オプション説明使用例
--no-sign-requestリクエストに署名しない(匿名アクセス)--no-sign-request
--profile <PROFILE>使用する認証プロファイル--profile production

マウント関連オプション

オプション説明使用例
--read-only読み取り専用でマウント--read-only
--allow-delete削除操作を許可--allow-delete
--allow-overwrite上書き操作を許可--allow-overwrite
--incremental-upload増分アップロードを有効化--incremental-upload
--auto-unmount終了時に自動アンマウント--auto-unmount
--allow-rootrootユーザーのアクセスを許可--allow-root
--allow-other他のユーザーのアクセスを許可--allow-other
--uid <UID>所有者UID--uid 1000
--gid <GID>所有者GID--gid 1000
--dir-mode <MODE>ディレクトリの権限--dir-mode 0755
--file-mode <MODE>ファイルの権限--file-mode 0644

パフォーマンス関連オプション

オプション説明デフォルト値使用例
--maximum-throughput-gbps <N>最大スループット(Gbps)自動検出--maximum-throughput-gbps 5
--max-threads <N>最大FUSEデーモンスレッド数16--max-threads 32
--part-size <SIZE>マルチパートのパートサイズ(バイト)8388608--part-size 16777216
--read-part-size <SIZE>読み取り用パートサイズ8388608--read-part-size 16777216
--write-part-size <SIZE>書き込み用パートサイズ8388608--write-part-size 16777216

ログ関連オプション

オプション説明デフォルト値使用例
-l, --log-directory <DIR>ログファイル出力ディレクトリsyslog--log-directory /var/log/s3
--log-metricsパフォーマンスメトリクスのログを有効---log-metrics
-d, --debugデバッグログを有効---debug
--debug-crtAWS Common Runtimeのデバッグログ---debug-crt
--no-logすべてのログを無効---no-log

キャッシュ関連オプション

オプション説明デフォルト値使用例
--cache <DIRECTORY>オブジェクトコンテンツのキャッシュ---cache /tmp/s3-cache
--metadata-ttl <SECONDS>メタデータキャッシュのTTLminimal--metadata-ttl 300
--negative-metadata-ttl <SECONDS>負のエントリのキャッシュTTLmetadata TTLと同じ--negative-metadata-ttl 60
--max-cache-size <MiB>キャッシュディレクトリの最大サイズ利用可能領域の5%--max-cache-size 1024

セキュリティ関連オプション

オプション説明使用例
--sse <ALGORITHM>サーバーサイド暗号化アルゴリズム--sse aws:kms
--sse-kms-key-id <ARN>KMS暗号化に使用するキーARN--sse-kms-key-id arn:aws:kms:...
--expected-bucket-owner <ID>期待されるバケット所有者のアカウントID--expected-bucket-owner 123456789012

オプション組み合わせ例

読み取り専用の高速マウント

mount-s3 testsamplebucket-01 /mnt/s3-bucket \
    --read-only \
    --cache /tmp/s3-cache \
    --metadata-ttl 600 \
    --max-threads 32

パフォーマンス最適化オプション

# 大容量ファイル用の最適化
mount-s3 testsamplebucket-01 /mnt/s3-bucket \
    --part-size 16777216 \
    --upload-checksums \
    --max-threads 10

# 読み取り専用モード(高速化)
mount-s3 testsamplebucket-01 /mnt/s3-bucket --read-only

# キャッシュ設定
mount-s3 testsamplebucket-01 /mnt/s3-bucket \
    --cache /tmp/s3-cache \
    --metadata-ttl 300

デバッグとログ設定

# 詳細ログ出力
mount-s3 your-bucket ~/s3-mount --debug

# ログファイルへの出力
mount-s3 your-bucket ~/s3-mount \
    --log-directory /var/log/mountpoint-s3 \
    --log-level info

権限とセキュリティ設定

# 特定のユーザー/グループでマウント
mount-s3 your-bucket ~/s3-mount \
    --uid $(id -u) \
    --gid $(id -g) \
    --file-mode 0644 \
    --dir-mode 0755

# 読み取り専用でマウント
mount-s3 your-bucket ~/s3-mount --read-only

自動マウントの設定

fuse.confの修正

--allow-otherオプションを使用するには、FUSE設定ファイルでuser_allow_otherを有効にする必要がある。

# /etc/fuse.confを編集
sudo tee -a /etc/fuse.conf << 'EOF'
user_allow_other
EOF

# 設定確認
cat /etc/fuse.conf

systemdサービスファイルの作成

# サービスファイルの作成
sudo tee /etc/systemd/system/mountpoint-s3.service << 'EOF'
[Unit]
Description=Mountpoint for S3 - your-bucket
After=network.target

[Service]
Type=forking
User=ec2-user
Group=ec2-user
ExecStart=/usr/bin/mount-s3 testsamplebucket-01 /mnt/s3-bucket --allow-delete --allow-overwrite --allow-other
ExecStop=/bin/umount /mnt/s3-bucket
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# サービスの有効化と開始
sudo systemctl daemon-reload
sudo systemctl enable mountpoint-s3
sudo systemctl start mountpoint-s3

# ステータス確認
sudo systemctl status mountpoint-s3

起動できていることを確認。

[root@ip-172-31-38-112 ec2-user]# sudo systemctl status mountpoint-s3
● mountpoint-s3.service - Mountpoint for S3 - your-bucket
     Loaded: loaded (/etc/systemd/system/mountpoint-s3.service; enabled; preset: disabled)
     Active: active (running) since Sun 2025-06-01 10:38:22 UTC; 25s ago
   Main PID: 29497 (mount-s3)
      Tasks: 13 (limit: 404)
     Memory: 6.5M
        CPU: 99ms
     CGroup: /system.slice/mountpoint-s3.service
             └─29497 /usr/bin/mount-s3 testsamplebucket-01 /mnt/s3-bucket --allow-delete --allow-overwrite --allow-other

Jun 01 10:38:21 ip-172-31-38-112.ap-northeast-1.compute.internal systemd[1]: Starting mountpoint-s3.service - Mountpoint for S3 - your-bucket...
Jun 01 10:38:22 ip-172-31-38-112.ap-northeast-1.compute.internal mount-s3[29496]: bucket testsamplebucket-01 is mounted at /mnt/s3-bucket
Jun 01 10:38:22 ip-172-31-38-112.ap-northeast-1.compute.internal systemd[1]: Started mountpoint-s3.service - Mountpoint for S3 - your-bucket.

再起動でマウントされるかを確認

reboot

マウント確認

ll /mnt/s3-bucket
[ec2-user@ip-172-31-38-112 ~]$ ll /mnt/s3-bucket/
total 0
[ec2-user@ip-172-31-38-112 ~]$ df -hT
Filesystem       Type      Size  Used Avail Use% Mounted on
devtmpfs         devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs            tmpfs     210M     0  210M   0% /dev/shm
tmpfs            tmpfs      84M  472K   84M   1% /run
/dev/nvme0n1p1   xfs       8.0G  1.9G  6.2G  23% /
tmpfs            tmpfs     210M     0  210M   0% /tmp
/dev/nvme0n1p128 vfat       10M  1.4M  8.7M  14% /boot/efi
mountpoint-s3    fuse      8.0E     0  8.0E   0% /mnt/s3-bucket
tmpfs            tmpfs      42M     0   42M   0% /run/user/1000

されているのでOK!

気になる点の動作検証

空のディレクトリをLinux上で作成した場合に、S3上に反映されるのか?
オブジェクトストレージであり、ディレクトリはただのprefixにすぎないため、恐らくディレクトリを作成しても反映されないはず。
が、一応試してみる。

空のディレクトリを作成

mkdir -p /mnt/s3-bucket/test1/
mkdir -p /mnt/s3-bucket/test2/
mkdir -p /mnt/s3-bucket/test3/

mkdir -p /mnt/s3-bucket/test1/test2/
mkdir -p /mnt/s3-bucket/test1/test2/test3/
[ec2-user@ip-172-31-38-112 s3-bucket]$ find
.
./test1
./test1/test2
./test1/test2/test3
./test2
./test3

test1/test2/ 以下に空のファイルを作成する

echo "Hello,World" >> /mnt/s3-bucket/test1/test2/test.txt
[ec2-user@ip-172-31-38-112 s3-bucket]$ find
.
./test1
./test1/test2
./test1/test2/test.txt
./test1/test2/test3
./test2
./test3

※この時点でS3バケットを確認する

bucket-test-02

test1/test2/test.txt のパスのオブジェクトしか作成されていないことを確認。

再起動して作成したディレクトリの有無を確認する

sudo reboot

マウントディレクトリの確認

find /mnt/s3-bucket
[ec2-user@ip-172-31-38-112 ~]$ find /mnt/s3-bucket
/mnt/s3-bucket
/mnt/s3-bucket/test1
/mnt/s3-bucket/test1/test2
/mnt/s3-bucket/test1/test2/test.txt

当然ながら、S3にあるパスのみをマウントしているので、test.txtがあるパスのみ生きている形となる。

結論

  • オブジェクトストレージなので「ディレクトリ」という実体は存在しないため。
  • あるのはキー(例: logs/file1.txt)で、それが /logs/ というプレフィックスに見えるだけ

つまり、

mkdir [ディレクトリ] した場合(空のディレクトリ)

  • 確認した通り、S3上には何も作られない
  • [ディレクトリ] という 仮想的なディレクトリ がローカルのマウントポイントで一時的に見えるだけ
  • 再マウント後には消える(S3に実体がないから)

という動作になっているようだ。

ディレクトリのようなものを作成したい場合

明示的に「ディレクトリっぽい」オブジェクトを作ることもできる 以下を実行することで、S3 に「キーが logs/ で中身が空」のオブジェクトを作るだけだが、GUIツールでは「ディレクトリのように」見えるようになる。

aws s3api put-object --bucket testsamplebucket-01 --key "logs/"
ログ
[ec2-user@ip-172-31-38-112 s3-bucket]$ aws s3api put-object --bucket testsamplebucket-01 --key "logs/"
{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ChecksumCRC64NVME": "AAAAAAAAAAA=",
    "ChecksumType": "FULL_OBJECT",
    "ServerSideEncryption": "AES256"
}
bucket-test-03

この場合では、再マウントしたときにどうなるのかを確認してみる。
umountしてから再マウントでもよいが、再起動で試す。

sudo reboot
[ec2-user@ip-172-31-38-112 ~]$ find /mnt/s3-bucket/
/mnt/s3-bucket/
/mnt/s3-bucket/logs
/mnt/s3-bucket/test1
/mnt/s3-bucket/test1/test2
/mnt/s3-bucket/test1/test2/test.txt

ちゃんとできているね。

参考

おわりに

Mountpoint for S3を使ってEC2からS3のバケットをマウントしてファイルの読み書き削除を行ってみた。
S3マウントする際は、goofysとか使っていたけど今後は公式のMountpoint for S3の方を使ってみようと思う。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。