小さなファイルアクセスを高速化!Mountpoint for Amazon S3 の共有キャッシュ機能を試してみた
2024 年 11 月 Mountpoint for Amazon S3 に「共有キャッシュ」機能が追加されました。
通常の S3 バケットにアクセスした際、1MB 以下のファイルは自動的に S3 Express One Zone(ディレクトリバケット)へコピーされ、キャッシュストレージとして活用できます。これにより、小さなファイルの高速アクセスや、複数インスタンス間でのアクセス向上が期待できます。
共有キャッシュ機能について
Mountpoint for Amazon S3 の共有キャッシュは、ディレクトリバケットをキャッシュ領域として利用します。
- 1MB 以下のファイルを複数インスタンスから繰り返し読み込む用途に最適
- ローカルキャッシュ容量を超える大規模データセットにも対応可能
- キャッシュされたデータは自動で削除されないため、ライフサイクルポリシーで削除設定を推奨
試してみた
検証環境
- OS: Ubuntu 24.04
- S3 バケット名: devio-bucket-for-mountpoint
- S3 Express One Zone バケット名: mountpoint-for-s3--apne1-az4--x-s3
IAM ロールとポリシー
今回の検証では、以下 2 つの IAM ポリシーを付与した IAM ロールを使用しています。
S3 バケットへのアクセス権限
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::devio-bucket-for-mountpoint"
],
"Effect": "Allow"
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::devio-bucket-for-mountpoint/*"
],
"Effect": "Allow"
}
]
}
S3 Express One Zone バケットへのアクセス権限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccessRegionalEndpointAPIs",
"Effect": "Allow",
"Action": [
"s3express:DeleteBucket",
"s3express:DeleteBucketPolicy",
"s3express:CreateBucket",
"s3express:PutBucketPolicy",
"s3express:GetBucketPolicy",
"s3express:ListAllMyDirectoryBuckets"
],
"Resource": "arn:aws:s3express:ap-northeast-1:12345679012:bucket/mountpoint-for-s3--apne1-az4--x-s3/*"
},
{
"Sid": "AllowCreateSession",
"Effect": "Allow",
"Action": "s3express:CreateSession",
"Resource": "*"
}
]
}
これらの権限により、S3 バケットおよび S3 Express One Zone バケットの操作や共有キャッシュ機能の利用が可能となります。
セットアップ
S3 バケットは、次のスクリプトでインストールから自動マウントまで設定しました。
今回のアップデートでは、--cache-xz
オプションを利用して共有キャッシュ用のバケットを指定できるようになりました。これにより、S3 バケットをマウントすると、キャッシュ領域として S3 Express One Zone のディレクトリバケットも利用するようになります。
セットアップスクリプト
#!/bin/bash
# =======================
# 設定する変数(ここだけ編集)
# =======================
BUCKET_NAME="devio-bucket-for-mountpoint"
CACHE_XZ="mountpoint-for-s3--apne1-az4--x-s3"
DIRECTORY="/mnt/s3"
USER_NAME="ubuntu"
GROUP_NAME="ubuntu"
# =======================
# 以降は通常編集不要
# =======================
OPTIONS="--allow-delete --allow-other"
if [[ -n "$CACHE_XZ" ]]; then
OPTIONS="$OPTIONS --cache-xz $CACHE_XZ"
fi
if ! command -v mount-s3 &>/dev/null; then
sudo apt update
sudo apt install libfuse2 -y
wget -P /tmp https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.deb
sudo apt-get install /tmp/mount-s3.deb -y
fi
SERVICE_ID=$(echo -n "${BUCKET_NAME}:${DIRECTORY}" | md5sum | awk '{print $1}')
SERVICE_ID=${SERVICE_ID:0:8}
SERVICE_NAME="mountpoint-s3-${SERVICE_ID}"
if ! grep -q "^user_allow_other" /etc/fuse.conf; then
echo "user_allow_other" | sudo tee -a /etc/fuse.conf
fi
sudo mkdir -p "${DIRECTORY}"
sudo chown "${USER_NAME}:${GROUP_NAME}" "${DIRECTORY}"
sudo chmod 770 "${DIRECTORY}"
tee > "${SERVICE_NAME}.service" <<EOF
[Unit]
Description=Mount s3://${BUCKET_NAME} at ${DIRECTORY}
Wants=network-online.target
After=default.target
AssertPathIsDirectory=${DIRECTORY}
[Service]
Type=forking
User=${USER_NAME}
Group=${GROUP_NAME}
ExecStart=/usr/bin/mount-s3 ${OPTIONS} ${BUCKET_NAME} ${DIRECTORY}
ExecStop=/usr/bin/fusermount -u ${DIRECTORY}
[Install]
WantedBy=default.target
EOF
sudo mv "${SERVICE_NAME}.service" /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable "${SERVICE_NAME}"
sudo systemctl restart "${SERVICE_NAME}"
echo "Mountpoint for S3 started as systemd service: ${SERVICE_NAME}"
ファイル操作・キャッシュ動作の確認
/mnt/s3/
に 1MB 以下のtext.txt
ファイルを配置し、実際にファイルへアクセスしてキャッシュ機能の動作を確認しました。
$ tree -h /mnt/s3/
[ 0] /mnt/s3/
├── [ 0] reads
│ ├── [ 23M] 2D2L_rep1_R1.fastq.gz
│ ├── [ 24M] 2D2L_rep1_R2.fastq.gz
│ ├── [ 21M] 2D2L_rep2_R1.fastq.gz
│ ├── [ 21M] 2D2L_rep2_R2.fastq.gz
│ ├── [ 17M] 2D2L_rep3_R1.fastq.gz
│ ├── [ 18M] 2D2L_rep3_R2.fastq.gz
│ ├── [ 16M] 2D_rep1_R1.fastq.gz
│ ├── [ 17M] 2D_rep1_R2.fastq.gz
│ ├── [ 14M] 2D_rep2_R1.fastq.gz
│ ├── [ 14M] 2D_rep2_R2.fastq.gz
│ ├── [ 18M] 2D_rep3_R1.fastq.gz
│ └── [ 18M] 2D_rep3_R2.fastq.gz
└── [ 57] text.txt
$ cat /mnt/s3/text.txt
S3に保存してあるテキストファイルです。
マネージメントコンソールから確認
共有キャッシュ用に作成した S3 Express One Zone のディレクトリバケットです。本バケットがキャッシュ領域として利用されます。
S3 Express One Zone のディレクトリバケット内には、キャッシュされたファイルごとにランダムな文字列のプレフィックスが自動生成されていることが確認できます。
なにかのオブジェクトが保存されていました。
S3 からアクセスしたオブジェクト(text.txt)と同じファイルサイズのオブジェクトでした。ダウンロードして内容を確認したところ、元ファイルと同じ内容でした。
マウントした S3 から 1MB 以上のファイルは読み込んでも、S3 Express One Zone にキャッシュされたオブジェクトが保存されていませんでした。こちらは仕様通りです。
まとめ
Mountpoint for Amazon S3 の共有キャッシュ機能は、小さなファイルの高速アクセスや、複数インスタンス間でのデータ共有に非常に有効です。特に、大量の小ファイルを扱うワークロードや、複数台のサーバーから同じデータを繰り返し参照するケースで大きな効果が期待できます。
- 1MB 以上のファイルはキャッシュ対象外
- 共有キャッシュを利用する場合、ディレクトリバケットのストレージコストやリクエストコストが発生
- キャッシュ用のディレクトリバケットにはライフサイクルポリシーで定期的なデータ削除設定することを推奨
おわりに
2025 年 4 月には、S3 Express One Zone のストレージ料金およびリクエスト料金が値下げされました。S3 Express One Zone を活用していきましょう。