@@ -115,6 +115,8 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
115115
116116 self .check_config ()
117117
118+ self .cluster_region = self .config ['Region' ]
119+
118120 if self .use_parallel_cluster :
119121 self .create_vpc ()
120122
@@ -1096,6 +1098,58 @@ def create_lambdas(self):
10961098 def create_parallel_cluster_lambdas (self ):
10971099 self .create_callSlurmRestApiLambda ()
10981100
1101+ self .parallel_cluster_lambda_layer = aws_lambda .LayerVersion (self , "ParallelClusterLambdaLayer" ,
1102+ description = 'ParallelCluster Layer' ,
1103+ code = aws_lambda .Code .from_bucket (
1104+ s3 .Bucket .from_bucket_name (self , 'ParallelClusterBucket' , f"{ self .cluster_region } -aws-parallelcluster" ),
1105+ f"parallelcluster/{ self .config ['slurm' ]['ParallelClusterConfig' ]['Version' ]} /layers/aws-parallelcluster/lambda-layer.zip"
1106+ ),
1107+ compatible_architectures = [
1108+ aws_lambda .Architecture .ARM_64 ,
1109+ aws_lambda .Architecture .X86_64 ,
1110+ ],
1111+ compatible_runtimes = [
1112+ aws_lambda .Runtime .PYTHON_3_9 ,
1113+ aws_lambda .Runtime .PYTHON_3_10 ,
1114+ # aws_lambda.Runtime.PYTHON_3_11, # Doesn't work: No module named 'rpds.rpds'
1115+ ],
1116+ )
1117+
1118+ createParallelClusterLambdaAsset = s3_assets .Asset (self , "CreateParallelClusterAsset" , path = "resources/lambdas/CreateParallelCluster" )
1119+ self .create_parallel_cluster_lambda = aws_lambda .Function (
1120+ self , "CreateParallelClusterLambda" ,
1121+ function_name = f"{ self .stack_name } -CreateParallelCluster" ,
1122+ description = "Create ParallelCluster from json string" ,
1123+ memory_size = 2048 ,
1124+ runtime = aws_lambda .Runtime .PYTHON_3_9 ,
1125+ architecture = aws_lambda .Architecture .X86_64 ,
1126+ timeout = Duration .minutes (15 ),
1127+ log_retention = logs .RetentionDays .INFINITE ,
1128+ handler = "CreateParallelCluster.lambda_handler" ,
1129+ code = aws_lambda .Code .from_bucket (createParallelClusterLambdaAsset .bucket , createParallelClusterLambdaAsset .s3_object_key ),
1130+ layers = [self .parallel_cluster_lambda_layer ],
1131+ vpc = self .vpc ,
1132+ allow_all_outbound = True
1133+ )
1134+ self .create_parallel_cluster_lambda .add_to_role_policy (
1135+ statement = iam .PolicyStatement (
1136+ effect = iam .Effect .ALLOW ,
1137+ actions = [
1138+ 's3:*' ,
1139+ ],
1140+ resources = ['*' ]
1141+ )
1142+ )
1143+ self .create_parallel_cluster_lambda .add_to_role_policy (
1144+ statement = iam .PolicyStatement (
1145+ effect = iam .Effect .ALLOW ,
1146+ actions = [
1147+ '*' ,
1148+ ],
1149+ resources = ['*' ]
1150+ )
1151+ )
1152+
10991153 def create_callSlurmRestApiLambda (self ):
11001154 callSlurmRestApiLambdaAsset = s3_assets .Asset (self , "CallSlurmRestApiLambdaAsset" , path = "resources/lambdas/CallSlurmRestApi" )
11011155 self .call_slurm_rest_api_lambda = aws_lambda .Function (
@@ -4143,102 +4197,29 @@ def create_parallel_cluster_config(self):
41434197 }
41444198 self .parallel_cluster_config ['SharedStorage' ].append (parallel_cluster_storage_dict )
41454199
4146- fh = NamedTemporaryFile ()
4147- yaml .dump (self .parallel_cluster_config , fh , encoding = 'utf-8' , sort_keys = False )
4148- self .parallelClusterConfigAsset = s3_assets .Asset (self , "ParallelClusterConfigAsset" , path = fh .name )
4149- self .parallelClusterConfigAsset .grant_read (self .parallel_cluster_asset_read_policy )
4150-
4151- createParallelClusterConfigAsset = s3_assets .Asset (self , "CreateParallelClusterConfigAsset" , path = "resources/lambdas/CreateParallelClusterConfig" )
4152- self .create_parallel_cluster_config_lambda = aws_lambda .Function (
4153- self , "CreateParallelClusterConfigLambda" ,
4154- function_name = f"{ self .stack_name } -CreateParallelClusterConfig" ,
4155- description = "Create ParallelCluster config file in s3" ,
4156- memory_size = 128 ,
4157- runtime = aws_lambda .Runtime .PYTHON_3_8 ,
4158- architecture = aws_lambda .Architecture .ARM_64 ,
4159- timeout = Duration .minutes (3 ),
4160- log_retention = logs .RetentionDays .INFINITE ,
4161- handler = "CreateParallelClusterConfig.lambda_handler" ,
4162- code = aws_lambda .Code .from_bucket (createParallelClusterConfigAsset .bucket , createParallelClusterConfigAsset .s3_object_key ),
4163- vpc = self .vpc ,
4164- allow_all_outbound = True
4165- )
4166- self .create_parallel_cluster_config_lambda .add_to_role_policy (
4167- statement = iam .PolicyStatement (
4168- effect = iam .Effect .ALLOW ,
4169- actions = [
4170- 's3:*' ,
4171- ],
4172- resources = ['*' ]
4173- )
4174- )
4175- # This is created as a custom resource so that resources get resolved in the config string before it gets passed to the lambda.
4176- self .parallel_cluster_config_s3_url = CustomResource (
4177- self , "ParallelClusterConfigS3Object" ,
4178- service_token = self .create_parallel_cluster_config_lambda .function_arn ,
4179- properties = {
4180- 'ParallelClusterConfigYaml' : yaml .dump (self .parallel_cluster_config , sort_keys = False ),
4181- 'S3Bucket' : self .parallelClusterConfigAsset .s3_bucket_name ,
4182- 'S3Key' : self .parallelClusterConfigAsset .s3_object_key ,
4183- 'S3ObjectUrl' : self .parallelClusterConfigAsset .s3_object_url
4184- }
4185- ).get_att_string ('S3ObjectUrl' )
4200+ self .parallel_cluster_config_json_s3_key = f"{ self .assets_base_key } /ParallelClusterConfig.json"
4201+ self .parallel_cluster_config_yaml_s3_key = f"{ self .assets_base_key } /ParallelClusterConfig.yml"
41864202
4187- self .parallel_cluster_lambda_layer = aws_lambda .LayerVersion (self , "ParallelClusterLambdaLayer" ,
4188- description = 'ParallelCluster Layer' ,
4189- code = aws_lambda .Code .from_bucket (
4190- s3 .Bucket .from_bucket_name (self , 'ParallelClusterBucket' , f"{ self .config ['Region' ]} -aws-parallelcluster" ),
4191- f"parallelcluster/{ self .config ['slurm' ]['ParallelClusterConfig' ]['Version' ]} /layers/aws-parallelcluster/lambda-layer.zip"
4192- ),
4193- compatible_architectures = [
4194- aws_lambda .Architecture .ARM_64 ,
4195- aws_lambda .Architecture .X86_64 ,
4196- ],
4197- compatible_runtimes = [
4198- aws_lambda .Runtime .PYTHON_3_8 ,
4199- aws_lambda .Runtime .PYTHON_3_9 ,
4200- # aws_lambda.Runtime.PYTHON_3_10,
4201- # aws_lambda.Runtime.PYTHON_3_11,
4202- ],
4203- )
4204- createParallelClusterAsset = s3_assets .Asset (self , "CreateParallelClusterAsset" , path = "resources/lambdas/CreateParallelCluster" )
4205- self .create_parallel_cluster_lambda = aws_lambda .Function (
4206- self , "CreateParallelClusterLambda" ,
4207- function_name = f"{ self .stack_name } -CreateParallelCluster" ,
4208- description = "Create ParallelCluster from config file in s3" ,
4209- memory_size = 2048 ,
4210- runtime = aws_lambda .Runtime .PYTHON_3_9 ,
4211- architecture = aws_lambda .Architecture .X86_64 ,
4212- timeout = Duration .minutes (15 ),
4213- log_retention = logs .RetentionDays .INFINITE ,
4214- handler = "CreateParallelCluster.lambda_handler" ,
4215- code = aws_lambda .Code .from_bucket (createParallelClusterAsset .bucket , createParallelClusterAsset .s3_object_key ),
4216- layers = [self .parallel_cluster_lambda_layer ],
4217- vpc = self .vpc ,
4218- allow_all_outbound = True
4219- )
4220- self .create_parallel_cluster_lambda .add_to_role_policy (
4221- statement = iam .PolicyStatement (
4222- effect = iam .Effect .ALLOW ,
4223- actions = [
4224- '*' ,
4225- ],
4226- resources = ['*' ]
4227- )
4228- )
42294203 self .parallel_cluster = CustomResource (
4230- self , "CreatedParallelCluster " ,
4204+ self , "ParallelCluster " ,
42314205 service_token = self .create_parallel_cluster_lambda .function_arn ,
42324206 properties = {
4207+ 'ParallelClusterConfigJson' : json .dumps (self .parallel_cluster_config , sort_keys = False ),
4208+ 'ParallelClusterConfigS3Bucket' : self .assets_bucket ,
4209+ 'ParallelClusterConfigJsonS3Key' : self .parallel_cluster_config_json_s3_key ,
4210+ 'ParallelClusterConfigYamlS3Key' : self .parallel_cluster_config_yaml_s3_key ,
42334211 'Region' : self .config ['Region' ],
42344212 'ClusterName' : self .config ['slurm' ]['ClusterName' ],
4235- 'ParallelClusterConfigJson' : self .parallel_cluster_config ,
4236- 'ParallelClusterConfigS3Url' : self .parallel_cluster_config_s3_url ,
42374213 }
42384214 )
4215+ self .parallel_cluster_config_json_s3_url = self .parallel_cluster .get_att_string ('ConfigJsonS3Url' )
4216+ self .parallel_cluster_config_yaml_s3_url = self .parallel_cluster .get_att_string ('ConfigYamlS3Url' )
42394217
4240- CfnOutput (self , "ParallelClusterConfigS3Url" ,
4241- value = self .parallelClusterConfigAsset .s3_object_url
4218+ CfnOutput (self , "ParallelClusterConfigJsonS3Url" ,
4219+ value = self .parallel_cluster_config_json_s3_url
4220+ )
4221+ CfnOutput (self , "ParallelClusterConfigYamlS3Url" ,
4222+ value = self .parallel_cluster_config_yaml_s3_url
42424223 )
42434224 CfnOutput (self , "MungeParameterName" ,
42444225 value = self .munge_key_ssm_parameter .parameter_name
0 commit comments