AWS ParallelCluster 3.3.0 から 3.9.0 特定の操作により共有ストレージのデータが削除される問題と対処方法について
AWS ParallelCluster のバージョン 3.3.0 から 3.9.0 を使用しているクラスターでは、特定の操作により共有ストレージのデータが削除される問題が確認されています。この問題を未然に防ぐため、状況を確認し、必要に応じて対応しましょう。
共有ストレージのデータが削除されてしまう件
詳細は AWS ParallelCluster の Wiki に記載されていますが、ここでは重要な点を簡潔にまとめます。
対象のクラスターバージョン
バージョン 3.3.0 から 3.9.0 までの ParallelCluster が対象です。 これらのバージョンは、すべての OS、ジョブスケジューラ、共有ストレージタイプに影響があります。使用中のクラスターのバージョンを確認してください。対象バージョンのクラスターをご利用のユーザーには AWS からメール通知も届いているはずです。
- 概ね直近 1 年半以内にリリースされたバージョンで作成したクラスターが対象です
- 3.3.0 は 2022 年 11 月 2 日リリース
- 3.9.0 は 2024 年 3 月 12 日リリース
バージョン確認方法
バージョン確認はタグエディタからparallelcluster:version
のタグを検索するのがお手軽です。
問題点と原因
pcluster update-cluster
コマンドを実行すると、マウントされている共有ストレージ(EFS、FSx for Lustre、FSx for ONTAP など)からデータが削除される可能性があります。原因はアンマウント処理中にマウントディレクトリとそのサブディレクトリを削除する動作が入っていたためです。特にバックアップがない場合、データの完全な消失のリスクがあります。
対処方法
- バージョンアップ:
- AWS ParallelCluster の最新バージョン(3.9.1 以降)のクラスターに移行してください
- 3.9.1 は 2024 年 4 月 11 日にリリースされています
- 修正パッチの適用:
- 3.3.0 から 3.8.0 までのバージョンには、修正パッチを適用し回避可能です
- 詳細な手順はこちらを参照してください
- 3.9.0 は修正パッチ未提供であり、2024 年 4 月 16 日時点では 3.9.1 に乗り換えるしかありません
修正パッチを充ててみた
Wiki の手順を参考に修正パッチを適用します。
ヘッドノードで以下のコマンドを実行し、クラスターのバージョンを確認します。
$ cat /opt/parallelcluster/.bootstrapped aws-parallelcluster-cookbook-3.8.0
3.8.0 であることを確認できました。修正パッチ適用対象のバージョンなので作業をしていきます。
修正パッチの準備
スクリプトをダウンロードし、実行権限を付与します。
$ curl https://us-east-1-aws-parallelcluster.s3.amazonaws.com/patches/avoid-recursive-delete-on-unmount/patch-recursive-delete.sh -o patch-recursive-delete.sh $ chmod +x patch-recursive-delete.sh
ダウンロードしたスクリプトの内容
patch-recursive-delete.sh
の内容を参考までに載せておきます。スクリプトを実行して、クラスターのバージョンに応じた修正パッチを、実行したリージョンに基づいて所定のパスからダウンロードしてきて、ローカルの Chef でパッチを適用する様です。
#!/bin/bash set -xe # This script should be invoked with one argument, either 'https' or 's3' # e.g. 'patch-recursive-delete https' REQUEST_TYPE=$1 if [[ $REQUEST_TYPE != https && $REQUEST_TYPE != s3 ]]; then echo "The request type should be either 'https' or 's3'" exit 1 fi # Check the pcluster version # If running on a node use this (default) PCLUSTER_VERSION_OUTPUT=$(cat /opt/parallelcluster/.bootstrapped) # If running on a machine with the cli installed use this # PCLUSTER_VERSION_OUTPUT=$(pcluster version) echo "'pcluster version' output: $PCLUSTER_VERSION_OUTPUT" if [[ $PCLUSTER_VERSION_OUTPUT =~ .*([0-9]+\.[0-9]+)\.[0-9]+.* ]]; then PCLUSTER_VERSION="${BASH_REMATCH[1]}" echo "Found pcluster version $PCLUSTER_VERSION" else echo "Error: cannot find the pcluster version" exit 2 fi # download the patch CWD=$(pwd) PATCH_DIR="$CWD/avoid-recursive-delete-on-unmount" mkdir -p $PATCH_DIR PATCH="$PATCH_DIR/$PCLUSTER_VERSION.patch" # Source the config to get the region source /etc/parallelcluster/cfnconfig REGION=$(echo $cfn_region) if [[ $REGION =~ us-gov ]]; then S3_BUCKET="us-gov-west-1-aws-parallelcluster" S3_ENDPOINT="s3.$REGION.amazonaws.com" elif [[ $REGION =~ cn ]]; then S3_BUCKET="cn-north-1-aws-parallelcluster" S3_ENDPOINT="s3.$REGION.amazonaws.com.cn" elif [[ $REGION =~ us-isob ]]; then S3_BUCKET="$REGION-aws-parallelcluster" S3_ENDPOINT="s3.$REGION.sc2s.sgov.gov" elif [[ $REGION =~ us-iso ]]; then S3_BUCKET="$REGION-aws-parallelcluster" S3_ENDPOINT="s3.$REGION.c2s.ic.gov" else S3_BUCKET="us-east-1-aws-parallelcluster" S3_ENDPOINT="s3.amazonaws.com" fi S3_BUCKET_PATH="patches/avoid-recursive-delete-on-unmount" PATCH_FILE="$PCLUSTER_VERSION.patch" echo "Retrieving the patch from $S3_BUCKET" if [[ $REQUEST_TYPE == s3 ]]; then aws s3api get-object --region $REGION --bucket $S3_BUCKET --key "$S3_BUCKET_PATH/$PATCH_FILE" $PATCH else curl "https://$S3_BUCKET.$S3_ENDPOINT/$S3_BUCKET_PATH/$PATCH_FILE" -o $PATCH fi # execute the update to the cookbook COOKBOOK_DIR="/etc/chef" cd $COOKBOOK_DIR git apply $PATCH cd $CWD echo "Cookbook successfully patched!"
スクリプト実行と実行結果
スクリプトを実行してパッチを適用します。
sudo ./patch-recursive-delete.sh https
最後にCookbook successfully patched!
のメッセージを確認できたのでパッチ充て成功です。
$ sudo ./patch-recursive-delete.sh https + REQUEST_TYPE=https + [[ https != https ]] ++ cat /opt/parallelcluster/.bootstrapped + PCLUSTER_VERSION_OUTPUT=aws-parallelcluster-cookbook-3.8.0 + echo ''\''pcluster version'\'' output: aws-parallelcluster-cookbook-3.8.0' 'pcluster version' output: aws-parallelcluster-cookbook-3.8.0 + [[ aws-parallelcluster-cookbook-3.8.0 =~ .*([0-9]+\.[0-9]+)\.[0-9]+.* ]] + PCLUSTER_VERSION=3.8 + echo 'Found pcluster version 3.8' Found pcluster version 3.8 ++ pwd + CWD=/home/ubuntu + PATCH_DIR=/home/ubuntu/avoid-recursive-delete-on-unmount + mkdir -p /home/ubuntu/avoid-recursive-delete-on-unmount + PATCH=/home/ubuntu/avoid-recursive-delete-on-unmount/3.8.patch + source /etc/parallelcluster/cfnconfig ++ stack_name=v380 ++ cfn_preinstall='/opt/parallelcluster/scripts/fetch_and_run --execute-via-cfnconfig -preinstall' ++ cfn_preinstall_args=() ++ cfn_postinstall='/opt/parallelcluster/scripts/fetch_and_run --execute-via-cfnconfig -postinstall' ++ cfn_postinstall_args=() ++ cfn_postupdate='/opt/parallelcluster/scripts/fetch_and_run --execute-via-cfnconfig -postupdate' ++ cfn_postupdate_args=() ++ cfn_region=ap-northeast-1 ++ cfn_scheduler=slurm ++ cfn_scheduler_slots=vcpus ++ cfn_instance_slots=2 ++ cfn_ephemeral_dir=/scratch ++ cfn_ebs_shared_dirs= ++ cfn_proxy=NONE ++ cfn_node_type=HeadNode ++ cfn_cluster_user=ubuntu ++ cfn_volume= ++ echo ap-northeast-1 + REGION=ap-northeast-1 + [[ ap-northeast-1 =~ us-gov ]] + [[ ap-northeast-1 =~ cn ]] + [[ ap-northeast-1 =~ us-isob ]] + [[ ap-northeast-1 =~ us-iso ]] + S3_BUCKET=us-east-1-aws-parallelcluster + S3_ENDPOINT=s3.amazonaws.com + S3_BUCKET_PATH=patches/avoid-recursive-delete-on-unmount + PATCH_FILE=3.8.patch + echo 'Retrieving the patch from us-east-1-aws-parallelcluster' Retrieving the patch from us-east-1-aws-parallelcluster + [[ https == s3 ]] + curl https://us-east-1-aws-parallelcluster.s3.amazonaws.com/patches/avoid-recursive-delete-on-unmount/3.8.patch -o /home/ubuntu/avoid-recursive-delete-on-unmount/3.8.patch % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1813 100 1813 0 0 2911 0 --:--:-- --:--:-- --:--:-- 2910 + COOKBOOK_DIR=/etc/chef + cd /etc/chef + git apply /home/ubuntu/avoid-recursive-delete-on-unmount/3.8.patch + cd /home/ubuntu + echo 'Cookbook successfully patched!' Cookbook successfully patched!
https 指定の修正パッチであれば 3 分もあれば作業が終わりました。
まとめ
AWS ParallelCluster で特定の操作により発生する共有ストレージのデータが削除されてしまう問題の対処方法を紹介しました。 バージョン 3.9.0 はクラスターを移行するしか回避方法はないため注意が必要です。
おわりに
私はupdate-cluster
で共有ストレージを付け外しする機会はなかったので別にという感じなのですが、万が一事故ると悲しいのでパッチ充てておきました。
今後も AWS ParallelCluster を安全にご利用いただくために、定期的に新しいバージョンのクラスターへ乗り換えと、この機会に各種バックアップ設定の再確認をお勧めします。