小さなファイルアクセスを高速化!Mountpoint for Amazon S3 の共有キャッシュ機能を試してみた

小さなファイルアクセスを高速化!Mountpoint for Amazon S3 の共有キャッシュ機能を試してみた

Clock Icon2025.04.17

2024 年 11 月 Mountpoint for Amazon S3 に「共有キャッシュ」機能が追加されました。
通常の S3 バケットにアクセスした際、1MB 以下のファイルは自動的に S3 Express One Zone(ディレクトリバケット)へコピーされ、キャッシュストレージとして活用できます。これにより、小さなファイルの高速アクセスや、複数インスタンス間でのアクセス向上が期待できます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/mountpoint-amazon-s3-high-performance-shared-cache/

共有キャッシュ機能について

Mountpoint for Amazon S3 の共有キャッシュは、ディレクトリバケットをキャッシュ領域として利用します。

  • 1MB 以下のファイルを複数インスタンスから繰り返し読み込む用途に最適
  • ローカルキャッシュ容量を超える大規模データセットにも対応可能
  • キャッシュされたデータは自動で削除されないため、ライフサイクルポリシーで削除設定を推奨

https://dev.classmethod.jp/articles/amazon-s3-express-one-zone-s3-lifecycle-expirations/

試してみた

検証環境

  • 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 のディレクトリバケットも利用するようになります。

セットアップスクリプト
setup_mount_s3.sh
#!/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 のディレクトリバケットです。本バケットがキャッシュ領域として利用されます。

mountpoint-for-s3--apne1-az4--x-s3_-_S3_バケット___S3___ap-northeast-1.png

S3 Express One Zone のディレクトリバケット内には、キャッシュされたファイルごとにランダムな文字列のプレフィックスが自動生成されていることが確認できます。

mountpoint-for-s3--apne1-az4--x-s3_-_S3_バケット___S3___ap-northeast-1-2.png

なにかのオブジェクトが保存されていました。

mountpoint-for-s3--apne1-az4--x-s3_-_S3_バケット___S3___ap-northeast-1-3.png

S3 からアクセスしたオブジェクト(text.txt)と同じファイルサイズのオブジェクトでした。ダウンロードして内容を確認したところ、元ファイルと同じ内容でした。

1bbbd542c00166a104ef03fc8f84befd45681ed973e14b590236245b11b326bc_18fe6373666df7ac1b0da4e507c266ecbd4bdaaba6f3c3e733e877f68b94049b_0000000000_-_S3_バケット_mountpoint-for-s3--apne1-az4--x-s3_のオブジェクト___S3___ap-northeast-1.png

マウントした S3 から 1MB 以上のファイルは読み込んでも、S3 Express One Zone にキャッシュされたオブジェクトが保存されていませんでした。こちらは仕様通りです。

まとめ

Mountpoint for Amazon S3 の共有キャッシュ機能は、小さなファイルの高速アクセスや、複数インスタンス間でのデータ共有に非常に有効です。特に、大量の小ファイルを扱うワークロードや、複数台のサーバーから同じデータを繰り返し参照するケースで大きな効果が期待できます。

  • 1MB 以上のファイルはキャッシュ対象外
  • 共有キャッシュを利用する場合、ディレクトリバケットのストレージコストやリクエストコストが発生
  • キャッシュ用のディレクトリバケットにはライフサイクルポリシーで定期的なデータ削除設定することを推奨

おわりに

2025 年 4 月には、S3 Express One Zone のストレージ料金およびリクエスト料金が値下げされました。S3 Express One Zone を活用していきましょう。

https://dev.classmethod.jp/articles/update-amazon-s3-express-one-zone-pricing/

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.