AWS ParallelCluster Slurm アカウンティングのための Aurora Serverless v2 を CloudFormation で構築

AWS ParallelCluster Slurm アカウンティングのための Aurora Serverless v2 を CloudFormation で構築

Clock Icon2025.04.28

はじめに

AWS ParallelCluster では Slurm アカウンティング機能を利用することで、ジョブの実行履歴を記録できます。この機能を利用するには MySQL 互換のデータベースが必要となります。本記事では、AWS CloudFormation を使用して、Slurm アカウンティングに必要な Aurora Serverless v2 データベースとその関連リソースを構築する方法を紹介します。

Untitled(19).png

背景

AWS ParallelCluster の Slurm アカウンティング設定には分かりづらい項目があります。特に Secrets Manager に保存するパスワードは、一般的な Key/Value 形式ではなく、プレーンテキストでの保存が必要です。

この点については以前のブログ記事で解説しました。前回は AWS CDK (TypeScript) を使用してリソースを作成しました。今回は CloudFormation テンプレートでリソースをデプロイする方法を紹介します。

前回のタイミングでは Aurora Serverless v2 が 0ACU までの縮退をサポートしていなかったため、安価な RDS for MySQL を採用していました。今回は Aurora Serverless v2 を採用しています。

https://dev.classmethod.jp/articles/aws-cdk-for-parallelcluster-slurm-accounting-setup/

作成するリソース

CloudFormation テンプレートでデプロイする主なリソースは以下の通りです。

  1. Secrets Manager(ランダム生成されたパスワードを保存)
  2. Aurora Serverless v2 (MySQL 互換)
  3. 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 でお客様環境の構築する機会があり、そのときの成果物を公開しました。同様なことでお困りの方の役に立てれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.