AWS ParallelCluster Slurm アカウンティング設定に必要なリソースを AWS CDK で作成してみた
AWS ParallelCluster で Slurm Accounting を設定する際に必要なデータベースを構築するための AWS CDK(TypeScript)のサンプルコードを紹介します。
背景
AWS ParallelCluster の Slurm Accounting 設定には一部分かりづらい項目があります。特に Secrets Manager に保存するパスワードは、一般的な Key/Value 形式ではなく、プレーンテキストでの保存が必要です。
この点については以前のブログ記事で解説しました。今回は Slurm Accounting に必要なリソースを一括でデプロイできる Infrastructure as Code (IaC) のコードを用意しました。
作成するリソース
CDK のコードでデプロイする主なリソースは以下の 2 つです。
- Secrets Manager(ランダム生成されたパスワードを保存)
- Amazon RDS for MySQL
サンプルコード
AWS CDK のサンプルコードは以下のリンクから参照できます。
Secrets Manager と RDS の設定説明
Slurm DB 用のパスワード
AWS ParallelCluster の Slurm Accounting 設定の仕様上、パスワードはプレーンテキストで保存する必要があります。一般的な Key/Value 形式で保存すると ParallelCluster が正しく読み取れません。
パスワードはランダム生成して Secrets Manager に保存しています。
// Secrets Manager でプレーンテキストパスワードを生成
const dbPasswordSecret = new secretsmanager.Secret(this, 'SlurmDBPlaintextPassword', {
secretName: 'slurmdb-password',
description: 'Plaintext password for Slurm DB MySQL instance',
generateSecretString: {
passwordLength: 30,
excludePunctuation: true,
includeSpace: false,
requireEachIncludedType: true,
},
});
RDS のセキュリティグループ
RDS のセキュリティグループのインバウンドルールは VPC の CIDR から許可しています。必要応じてより厳しく制限してください。
// セキュリティグループの作成
const securityGroup = new ec2.SecurityGroup(this, 'SlurmDbSecurityGroup', {
vpc: vpc,
description: 'Security group for Slurm DB',
allowAllOutbound: true,
});
// VPC CIDR からのインバウンドトラフィックを許可
securityGroup.addIngressRule(
ec2.Peer.ipv4(props.vpcCidr),
ec2.Port.tcp(3306),
'Allow MySQL access from VPC'
);
RDS の設定
低コスト運用のため db.t4g.micro インスタンスを非冗長構成で作成します。便利な Performance Insight にも対応していないタイプです。
MySQL のユーザー名はadmin
、パスワードは Secrets Manager に保存されたランダム生成のパスワードを使用して DB をセットアップします。
// RDS インスタンスの作成
const dbInstance = new rds.DatabaseInstance(this, 'SlurmDbInstance', {
engine: rds.DatabaseInstanceEngine.mysql({ version: rds.MysqlEngineVersion.VER_8_0_39 }),
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.MICRO), // メモ: t4g.micro は Performance Insights 非対応のタイプ
vpc: vpc,
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
subnetGroup: subnetGroup,
securityGroups: [securityGroup],
allocatedStorage: 20,
storageType: rds.StorageType.GP3,
storageEncrypted: true,
databaseName: 'slurmdb',
credentials: rds.Credentials.fromPassword('admin', dbPasswordSecret.secretValue),
removalPolicy: cdk.RemovalPolicy.DESTROY, // 注意: 本番環境では RETAIN を検討してください
deletionProtection: false, // 注意: 本番環境では true を検討してください
parameterGroup: parameterGroup,
optionGroup: optionGroup,
backupRetention: cdk.Duration.days(7),
preferredBackupWindow: '20:00-21:00', // UTC (JST 毎日 5:00-6:00)
preferredMaintenanceWindow: 'sun:21:00-sun:22:00', // UTC (JST 日曜日 6:00-7:00)
});
設定値
デプロイ後の RDS の設定画面を参考までに載せておきます。
クラスターの設定
クラスターの設定ファイルで、Slurm Accounting に必要なリソース名を指定します。
CDK により生成された CloudFormation のアウトプットには、RDS のエンドポイント名と Secrets Manager の ARN が表示されるのでこれらの値をコピペするのが手っ取り早いです。
Scheduling:
Scheduler: slurm # Slurm を指定
SlurmSettings:
ScaledownIdletime: 10
# --- Slurm Accounting 設定 ---
Database:
Uri: slumdb.hogehoge.ap-northeast-1.rds.amazonaws.com:3306 # RDS のエンドポイントとデータベース名とポート番号を指定
UserName: admin # RDS のユーザー名を指定
PasswordSecretArn: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:slurmdb-hoge # Secrets Manager の ARN を指定
ちなみに MySQL のパスワードについては直接入力する場面がないため、Secrets Manager に保存されているパスワードを知らないままでもクラスターは構築できます。
動作確認
クラスター作成後、ヘッドノードにログインしてsacct
コマンドを実行します。テストジョブが完了した結果が RDS へ保存されるようになりました。
$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1 test.sh p1 pcdefault 1 COMPLETED 0:0
1.batch batch pcdefault 1 COMPLETED 0:0
まとめ
本記事では、AWS ParallelCluster の Slurm Accounting に必要なリソースを構築するための AWS CDK サンプルコードを紹介しました。
おわりに
今回 AWS CDK のコード内でパスワードをランダム生成しました。AWS CDK もとより CloudFormation でパスワード生成できることをはじめて知りました。あとは Key/Value 形式にしないで Secrets Manager に文字列を保存する方法がわからなく時間を溶かしました。どなたかのお役にたてば幸いです。