AWS ParallelCluster Slurm アカウンティングのための Aurora Serverless v2 を CloudFormation で構築
はじめに
AWS ParallelCluster では Slurm アカウンティング機能を利用することで、ジョブの実行履歴を記録できます。この機能を利用するには MySQL 互換のデータベースが必要となります。本記事では、AWS CloudFormation を使用して、Slurm アカウンティングに必要な Aurora Serverless v2 データベースとその関連リソースを構築する方法を紹介します。
背景
AWS ParallelCluster の Slurm アカウンティング設定には分かりづらい項目があります。特に Secrets Manager に保存するパスワードは、一般的な Key/Value 形式ではなく、プレーンテキストでの保存が必要です。
この点については以前のブログ記事で解説しました。前回は AWS CDK (TypeScript) を使用してリソースを作成しました。今回は CloudFormation テンプレートでリソースをデプロイする方法を紹介します。
前回のタイミングでは Aurora Serverless v2 が 0ACU までの縮退をサポートしていなかったため、安価な RDS for MySQL を採用していました。今回は Aurora Serverless v2 を採用しています。
作成するリソース
CloudFormation テンプレートでデプロイする主なリソースは以下の通りです。
- Secrets Manager(ランダム生成されたパスワードを保存)
- Aurora Serverless v2 (MySQL 互換)
- Aurora Serverless v2 のセキュリティグループ
CloudFormation テンプレート
以下に CloudFormation テンプレートの全文を掲載します。
折りたたみ
AWSTemplateFormatVersion: "2010-09-09"
Description: Aurora Serverless v2 MySQL with Plaintext password for Slurm Accounting
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Common Settings
Parameters:
- ProjectName
- Environment
- Label:
default: VPC Settings
Parameters:
- VpcId
- VpcRdsSubnetId1
- VpcRdsSubnetId2
- VpcHeadNodeSubnet
Parameters:
ProjectName:
Description: Project Name
Type: String
Default: unnamed
Environment:
Description: Environment
Type: String
Default: dev
AllowedValues:
- prod
- dev
- stg
VpcId:
Description: VPC ID
Type: AWS::EC2::VPC::Id
VpcRdsSubnetId1:
Description: RDS VPC subnet 1
Type: AWS::EC2::Subnet::Id
VpcRdsSubnetId2:
Description: RDS VPC subnet 2
Type: AWS::EC2::Subnet::Id
VpcHeadNodeSubnet:
Description: HeadNode VPC subnet
Type: String
Default: 10.0.0.0/16
DBClusterIdentifier:
Description: DBClusterIdentifier
Type: String
Default: slurmdb
AllowedPattern: ^[a-zA-Z0-9]*$
MinLength: 1
MaxLength: 60
DBMasterUsername:
Description: DBMasterUsername
Type: String
Default: admin
Resources:
# --------------------------------------------------------
# SecretsManager and Plaintext Password
# --------------------------------------------------------
SlurmDBPlaintextPassword:
Type: AWS::SecretsManager::Secret
Properties:
Description: Plaintext password for Slurm Accounting
GenerateSecretString:
ExcludePunctuation: true
IncludeSpace: false
PasswordLength: 32
RequireEachIncludedType: true
Name: !Sub ${ProjectName}-${Environment}-slurmdb-password
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
# --------------------------------------------------------
# DB Subnet Group
# --------------------------------------------------------
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: Database subnets for SlurmDB
SubnetIds:
- !Ref "VpcRdsSubnetId1"
- !Ref "VpcRdsSubnetId2"
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-db-subnet-group
- Key: Env
Value: !Ref Environment
# --------------------------------------------------------
# DB Cluster Parameter Group
# --------------------------------------------------------
DBClusterParameterGroup:
Type: AWS::RDS::DBClusterParameterGroup
Properties:
Description: Aurora Serverless v2 DB Cluster Parameter Group
Family: aurora-mysql8.0
Parameters:
time_zone: UTC
character_set_server: utf8
character_set_client: utf8
character_set_connection: utf8
character_set_results: utf8
character_set_database: utf8
performance_schema: 1
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-db-cluster-param-group
- Key: Env
Value: !Ref Environment
# --------------------------------------------------------
# DB Parameter Group
# --------------------------------------------------------
DBParameterGroup:
Type: AWS::RDS::DBParameterGroup
Properties:
Description: Aurora Serverless v2 DB Parameter Group
Family: aurora-mysql8.0
Parameters:
general_log: 0
slow_query_log: 1
long_query_time: 5000
log_output: FILE
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-db-param-group
- Key: Env
Value: !Ref Environment
# --------------------------------------------------------
# Aurora Serverless v2 Cluster
# --------------------------------------------------------
DBCluster:
Type: AWS::RDS::DBCluster
DeletionPolicy: Snapshot
Properties:
BackupRetentionPeriod: 35
DBClusterIdentifier: !Sub "${ProjectName}-${Environment}-${DBClusterIdentifier}"
DBClusterParameterGroupName: !Ref "DBClusterParameterGroup"
DBSubnetGroupName: !Ref "DBSubnetGroup"
DeletionProtection: true
Engine: aurora-mysql
EngineVersion: "8.0.mysql_aurora.3.08.0"
ServerlessV2ScalingConfiguration:
MinCapacity: 0
MaxCapacity: 1
MasterUsername: !Ref "DBMasterUsername"
MasterUserPassword: !Join
- ''
- - '{{resolve:secretsmanager:'
- !Ref SlurmDBPlaintextPassword
- ':SecretString:::}}'
Port: 3306
PreferredBackupWindow: 18:00-19:00
PreferredMaintenanceWindow: Sat:16:00-Sat:17:00
StorageEncrypted: true
AutoMinorVersionUpgrade: false
Tags:
- Key: Env
Value: !Ref Environment
VpcSecurityGroupIds:
- !Ref "SecurityGroup1"
DBInstance1:
Type: 'AWS::RDS::DBInstance'
Properties:
DBClusterIdentifier: !Ref DBCluster
DBInstanceClass: db.serverless
DBParameterGroupName: !Ref DBParameterGroup
Engine: aurora-mysql
EnablePerformanceInsights: true
PreferredMaintenanceWindow: Sat:16:00-Sat:17:00
PromotionTier: 0
AvailabilityZone: !Select
- 0
- !GetAZs
Ref: AWS::Region
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-db-instance
- Key: Env
Value: !Ref Environment
# --------------------------------------------------------
# Security Group
# --------------------------------------------------------
SecurityGroup1:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref "VpcId"
GroupDescription: Allow MySQL (TCP3306)
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: !Ref "VpcHeadNodeSubnet"
Tags:
- Key: Env
Value: !Ref Environment
Outputs:
RdsSecurityGroup:
Value: !Ref "SecurityGroup1"
DBClusterEndpoint:
Value: !GetAtt "DBCluster.Endpoint.Address"
テンプレートのポイント解説
Secrets Manager とプレーンテキストパスワード
AWS ParallelCluster の Slurm アカウンティング設定の仕様上、パスワードはプレーンテキストで保存する必要があります。CloudFormation では以下のように GenerateSecretString
を使用してパスワードを自動生成しています。
SlurmDBPlaintextPassword:
Type: AWS::SecretsManager::Secret
Properties:
Description: Plaintext password for Slurm Accounting
GenerateSecretString:
ExcludePunctuation: true
IncludeSpace: false
PasswordLength: 32
RequireEachIncludedType: true
Name: !Sub ${ProjectName}-${Environment}-slurmdb-password
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
パスワード参照の設定
Aurora クラスターの MasterUserPassword
では、Secrets Manager からパスワードを参照して設定するには以下の様な書き方になりました。
MasterUserPassword: !Join
- ''
- - '{{resolve:secretsmanager:'
- !Ref SlurmDBPlaintextPassword
- ':SecretString:::}}'
Aurora Serverless v2 の設定
コスト最適化のため、最小キャパシティを 0 ACU、最大キャパシティを 1 ACU に設定しています。ヘッドノードの停止時には自動的に 0 ACU まで縮退し DB の利用費を抑えます。
ServerlessV2ScalingConfiguration:
MinCapacity: 0
MaxCapacity: 1
DB のセキュリティグループ設定
セキュリティグループでは、ヘッドノードのサブネットからのみ MySQL ポート (3306) へのアクセスを許可しています。
SecurityGroup1:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref "VpcId"
GroupDescription: Allow MySQL (TCP3306)
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: !Ref "VpcHeadNodeSubnet"
クラスターの作成時に必要な設定
ここまでが Slurm アカウンティングのために必要なリソースの作成の紹介でした。以降は、ParallelCluster でクラスター作成時に今回の作成したリソースをどのように指定するのかを解説します。
クラスターの設定ファイルの指定箇所
クラスターの設定ファイルで、Slurm アカウンティングに必要なリソース名を指定します。CloudFormation のアウトプットに表示される Aurora クラスターのエンドポイント名と Secrets Manager の ARN を使用します。
Scheduling:
Scheduler: slurm # Slurm を指定
SlurmSettings:
ScaledownIdletime: 10
# --- Slurm Accounting 設定 ---
Database:
Uri: unnamed-dev-slurmdb.cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 # Aurora のエンドポイントとポート番号を指定
UserName: admin
PasswordSecretArn: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:unnamed-dev-slurmdb-password-AXOmyf # Secrets Manager の ARN を指定
DatabaseName: "slurm_acct_db" # データベース名の設定は任意
動作確認
クラスター作成後、ヘッドノードにログインして適当にジョブをサブミットしたあとに sacct
コマンドを実行します。テストジョブの結果が記録されていることが確認できます。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1 test_job test pcdefault 1 COMPLETED 0:0
1.batch batch pcdefault 1 COMPLETED 0:0
まとめ
本記事では、AWS ParallelCluster の Slurm アカウンティングに必要なリソースを CloudFormation で構築する方法を紹介しました。Aurora Serverless v2 を採用したことで、ヘッドノードを停止する時間が多い環境ではより コスト効率良く運用できます。
おわりに
CloudFormation でお客様環境の構築する機会があり、そのときの成果物を公開しました。同様なことでお困りの方の役に立てれば幸いです。