AWS ParallelCluster 3.3.0 から 3.9.0 特定の操作により共有ストレージのデータが削除される問題と対処方法について

修正パッチは3分もあれば充てられます。ちょっと時間を見つけて充てておきましょう。
2024.04.16

AWS ParallelCluster のバージョン 3.3.0 から 3.9.0 を使用しているクラスターでは、特定の操作により共有ストレージのデータが削除される問題が確認されています。この問題を未然に防ぐため、状況を確認し、必要に応じて対応しましょう。

共有ストレージのデータが削除されてしまう件

詳細は AWS ParallelCluster の Wiki に記載されていますが、ここでは重要な点を簡潔にまとめます。

(3.3.0‐3.9.0) Potential data loss issue when removing storage with update‐cluster in AWS ParallelCluster 3.3 and above · aws/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 を安全にご利用いただくために、定期的に新しいバージョンのクラスターへ乗り換えと、この機会に各種バックアップ設定の再確認をお勧めします。