AWS ParallelCluster で Mountpoint for Amazon S3 を fstab を利用してヘッドノードとコンピュートノードに自動マウントする方法

AWS ParallelCluster で Mountpoint for Amazon S3 を fstab を利用してヘッドノードとコンピュートノードに自動マウントする方法

Clock Icon2025.06.21

Mountpoint for Amazon S3 が 2025 年 5 月 30 日に fstab サポートを追加しました。AWS ParallelCluster でヘッドノードとコンピュートノードの両方に S3 バケットを公式な方法で自動マウントできるようになりました。これまで systemd サービスで実現していた自動マウントが fstab で簡単に設定できます。

https://dev.classmethod.jp/articles/mountpoint-for-amazon-s3-use-fstab/

ParallelCluster で使うときの従来の自動マウント方法

systemd サービスによる自動マウント

従来は systemd サービスを使って自動マウントを実現していました。運用上問題はありませんでしたが、非公式な実装方法であることが長らく気がかりでした。

# systemd サービスファイルの作成例
sudo tee /etc/systemd/system/mount-s3-bucket.service > /dev/null <<EOF
[Unit]
Description=Mount S3 bucket using Mountpoint for Amazon S3
Wants=network-online.target
After=network-online.target

[Service]
Type=exec
ExecStart=/usr/bin/mount-s3 --allow-delete --allow-other hpc-dev-mountpoint /mnt/s3
ExecStop=/usr/bin/fusermount -u /mnt/s3
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

詳細は以下の記事をご確認ください。

https://dev.classmethod.jp/articles/how-to-use-mountpoint-for-amaozn-s3-with-aws-parallelcluster-ubuntu2204/

なにが嬉しいのか

今回のアップデートで、ParallelCluster の設定がスマートになりました。何より公式に自動マウントをサポートしたのが一番ありがたいです。

  • 設定の簡素化: fstab エントリを記述するだけ
  • systemd サービス作成不要: 複雑なサービスファイル作成が不要

fstab エントリの構文例

/etc/fstab
s3://bucket-name/prefix/ /mount-point mount-s3 _netdev,allow-delete,allow-other

詳細は以下の記事をご確認ください。

https://dev.classmethod.jp/articles/mountpoint-for-amazon-s3-use-fstab/

ParallelCluster で試してみた

検証環境

項目
ParallelCluster v3.13.0
OS Ubuntu 24.04
Mountpoint for Amazon S3 v1.18.0
マウント対象の S3 バケット devio-bucket-for-mountpoint
マウントポイント /mnt/s3
設定スクリプト保存先 s3://devio-custom-boostrap-files/mount-s3-with-fstab/mount.sh

クラスターコンフィグ

設定ファイルの例です。ヘッドノードとコンピュートノードの両方で同じスクリプトを実行します。実行スクリプトの mount.sh は以下の引数を受け取ります。

  • S3 バケット名: devio-bucket-for-mountpoint
  • マウントポイント: /mnt/s3
  • マウントオプション: allow-delete,allow-other
fstab-cluster.yml
Region: ap-northeast-1
Image:
  Os: ubuntu2404
Tags:
  - Key: Name
    Value: cluster-v3.13.0

HeadNode:
  InstanceType: t3a.small
  Networking:
    ElasticIp: false
    SubnetId: subnet-029f0fb0acc64043d
  LocalStorage:
    RootVolume:
      Size: 45
      Encrypted: true
      VolumeType: gp3
  Iam:
    AdditionalIamPolicies:
      - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3
    S3Access:
      - BucketName: devio-custom-boostrap-files
        EnableWriteAccess: false
  CustomActions:
    OnNodeConfigured:
      Script: s3://devio-custom-boostrap-files/mount-s3-with-fstab/mount.sh
      Args:
        - devio-bucket-for-mountpoint
        - /mnt/s3
        - allow-delete,allow-other

Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    - Name: test
      ComputeResources:
        - Name: test
          Instances:
            - InstanceType: t3a.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 45
            Encrypted: true
            VolumeType: gp3
      CapacityType: SPOT
      AllocationStrategy: price-capacity-optimized
      Networking:
        SubnetIds:
          - subnet-029f0fb0acc64043d
          - subnet-0b9c598622ad54e61
          - subnet-01559948e762bd434
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
          - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3
        S3Access:
          - BucketName: devio-custom-boostrap-files
            EnableWriteAccess: false
      CustomActions:
        OnNodeConfigured:
          Script: s3://devio-custom-boostrap-files/mount-s3-with-fstab/mount.sh
          Args:
            - devio-bucket-for-mountpoint
            - /mnt/s3
            - allow-delete,allow-other

マウントスクリプトの内容

以下のスクリプトを事前にs3://devio-custom-boostrap-files/mount-s3-with-fstabバケットへアップロードしてあります。ヘッドノード、コンピュート起動時に S3 バケットからスクリプトをダウンロードして実行します。

mount.sh
#!/bin/bash

BUCKET_NAME=$1
TARGET_DIRECTORY=$2
OPTIONS=$3

# Setup
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

# Allow other users to access mount
if ! grep -q "^user_allow_other" /etc/fuse.conf
then
    echo "user_allow_other" | sudo tee -a /etc/fuse.conf
fi

# Create mount TARGET_DIRECTORY
sudo mkdir -p ${TARGET_DIRECTORY}
sudo chmod 777 ${TARGET_DIRECTORY}

# Ensure BUCKET_NAME has correct s3:// format
if [[ ! ${BUCKET_NAME} =~ ^s3:// ]]; then
    FORMATTED_BUCKET="s3://${BUCKET_NAME}/"
else
    if [[ ! ${BUCKET_NAME} =~ /$ ]]; then
        FORMATTED_BUCKET="${BUCKET_NAME}/"
    else
        FORMATTED_BUCKET="${BUCKET_NAME}"
    fi
fi

# Add entry to /etc/fstab for persistent mounting
FSTAB_ENTRY="${FORMATTED_BUCKET} ${TARGET_DIRECTORY} mount-s3 _netdev,${OPTIONS}"

# Check if entry already exists in fstab
sudo sed -i "\|${BUCKET_NAME}.*${TARGET_DIRECTORY}|d" /etc/fstab

# Add new entry
echo "${FSTAB_ENTRY}" | sudo tee -a /etc/fstab

# Mount the filesystem
sudo mount ${TARGET_DIRECTORY}

# Verify mount was successful
if mountpoint -q ${TARGET_DIRECTORY}; then
    echo "Successfully mounted ${FORMATTED_BUCKET} to ${TARGET_DIRECTORY}"
    ls -la ${TARGET_DIRECTORY}
else
    echo "Warning: Mount may have failed"
fi

クラスター作成と動作確認

クラスターを作成し、ヘッドノードとコンピュートノードでの自動マウントを確認します。

pcluster create-cluster --cluster-name fstab-test --cluster-configuration fstab-cluster.yml

ヘッドノードでの確認

ヘッドノードにログインして S3 バケットが自動マウントされていることを確認します。問題なくマウントできています。

$ df -h
Filesystem       Size  Used Avail Use% Mounted on
/dev/root         43G   28G   16G  65% /
tmpfs            959M     0  959M   0% /dev/shm
tmpfs            384M  1.1M  383M   1% /run
tmpfs            5.0M     0  5.0M   0% /run/lock
efivarfs         128K  3.8K  120K   4% /sys/firmware/efi/efivars
/dev/nvme0n1p16  881M   85M  734M  11% /boot
/dev/nvme0n1p15  105M  6.1M   99M   6% /boot/efi
mountpoint-s3    8.0E     0  8.0E   0% /mnt/s3
127.0.0.1:/      8.0E   13G  8.0E   1% /home
tmpfs            192M   88K  192M   1% /run/user/1000

エントリーが追加されています。

$ sudo cat /etc/fstab
LABEL=cloudimg-rootfs	/	 ext4	discard,commit=30,errors=remount-ro	0 1
LABEL=BOOT	/boot	ext4	defaults	0 2
LABEL=UEFI	/boot/efi	vfat	umask=0077	0 1
fs-0f66550e47cbc924b:/ /home efs _netdev,noresvport 0 0
s3://devio-bucket-for-mountpoint/ /mnt/s3 mount-s3 _netdev,allow-delete,allow-other

マウントした S3 バケットの内容も確認可能です。

$ ls -l /mnt/s3
total 1
drwxr-xr-x 2 root root  0 Jun 21 00:28 reads
-rw-r--r-- 1 root root 57 Apr 17 00:26 text.txt

コンピュートノードでの確認

Slurm ジョブでコンピュートノードのマウント状況を確認します。検証用スクリプトを作成してジョブをサブミットします。

$ cat check-mount.sh
#!/bin/bash

df -h
ls -l /mnt/s3
cat /mnt/s3/text.txt

ジョブをサブミットして実行結果を確認します。

$ sbatch check-mount.sh

実行結果

コンピュートノードからも S3 バケットをマウントし、アクセスが可能です。

$ cat slurm-5.out
Filesystem                              Size  Used Avail Use% Mounted on
/dev/root                                43G   28G   16G  64% /
tmpfs                                   460M     0  460M   0% /dev/shm
tmpfs                                   184M  1.2M  183M   1% /run
tmpfs                                   5.0M     0  5.0M   0% /run/lock
efivarfs                                128K  3.8K  120K   4% /sys/firmware/efi/efivars
/dev/nvme0n1p16                         881M   85M  734M  11% /boot
/dev/nvme0n1p15                         105M  6.1M   99M   6% /boot/efi
10.0.0.242:/opt/parallelcluster/shared   43G   28G   16G  65% /opt/parallelcluster/shared
127.0.0.1:/                             8.0E   13G  8.0E   1% /home
10.0.0.242:/opt/intel                    43G   28G   16G  65% /opt/intel
10.0.0.242:/opt/slurm                    43G   28G   16G  65% /opt/slurm
mountpoint-s3                           8.0E     0  8.0E   0% /mnt/s3
tmpfs                                    92M   88K   92M   1% /run/user/1000
total 1
drwxr-xr-x 2 root root  0 Jun 21 00:43 reads
-rw-r--r-- 1 root root 57 Apr 17 00:26 text.txt
S3に保存してあるテキストファイルです。

注意事項

各ノードの IAM ポリシー(hpc-dev-AllowMountpointForS3)でマウントする S3 バケットへのアクセス権限の確認をお忘れなく。マウントする S3 バケットを変更したとき IAM ポリシーを修正し忘れやすいです。

今回検証で使用した hpc-dev-AllowMountpointForS3 ポリシーの例です。

{
    "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"
        }
    ]
}

まとめ

従来の systemd サービスによる自動マウントと比較して、fstab サポートにより完結な設定で済むようになりました。

項目 systemd 方式 fstab 方式
設定の複雑さ 複雑(サービスファイル作成) 簡単(1行追加)
サポート 非公式 公式

おわりに

ゲノム解析や機械学習などの大規模データ処理において、S3 を直接マウントできるのは魅力的です。fstab サポートにより、公式な方法で自動マウント設定ができるようになった点が一番うれしいです。

HPC ワークロードの場合は、ストレージはなんでも Mountpoint for Amazon S3 で解決できるわけではないです。少数の大容量ファイルの読み込みであれば採用価値がありますので試してみてください。性能検証については以下の記事もご確認ください。

https://dev.classmethod.jp/articles/verify-openfold-with-s3-and-mountpoint-for-amazon-s3/

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.