in installer/resources/src/cdk_construct.py [0:0]
def scheduler(self):
"""
Create the Scheduler EC2 instance, configure user data and assign EIP
"""
# Create Lambda to reset AD DS password when using AD
if install_props.Config.directoryservice.provider == "activedirectory":
self.soca_resources["reset_ds_lambda"] = aws_lambda.Function(self, f"{user_specified_variables.cluster_id}-ResetDsLambdaFunction",
function_name=f"{user_specified_variables.cluster_id}-ResetDsLambdaFunction-{''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(20))}",
description="Lambda to reset AD DS password",
memory_size=128, role=self.soca_resources["reset_ds_password_lambda_role"],
timeout=core.Duration.minutes(3),
runtime=aws_lambda.Runtime.PYTHON_3_7,
log_retention=logs.RetentionDays.INFINITE,
handler="ResetDSPassword.lambda_handler",
code=aws_lambda.Code.asset("../functions/ResetDSPassword"))
# Generate EC2 User Data
user_data_substitutes = {"%%AWS_ACCOUNT_ID%%": core.Aws.ACCOUNT_ID,
"%%AWS_PARTITION%%": core.Aws.PARTITION,
"%%CLUSTER_ID%%": user_specified_variables.cluster_id,
"%%S3_BUCKET%%": user_specified_variables.bucket,
"%%AWS_REGION%%": core.Aws.REGION,
"%%SOCA_VERSION%%": "2.7.0",
"%%COMPUTE_NODE_ARN%%": self.soca_resources["compute_node_role"].role_arn,
"%%FS_DATA_PROVIDER%%": install_props.Config.storage.data.provider if not user_specified_variables.fs_data_provider else user_specified_variables.fs_data_provider,
"%%FS_APPS_PROVIDER%%": install_props.Config.storage.apps.provider if not user_specified_variables.fs_apps_provider else user_specified_variables.fs_apps_provider,
"%%FS_DATA_DNS%%": f"{self.soca_resources['fs_data'].ref}.{endpoints_suffix[install_props.Config.storage.data.provider]}" if not user_specified_variables.fs_data else f"{user_specified_variables.fs_data}.{endpoints_suffix[install_props.Config.storage.data.provider]}",
"%%FS_APPS_DNS%%": f"{self.soca_resources['fs_apps'].ref}.{endpoints_suffix[install_props.Config.storage.apps.provider]}" if not user_specified_variables.fs_apps else f"{user_specified_variables.fs_apps}.{endpoints_suffix[install_props.Config.storage.apps.provider]}",
"%%VPC_ID%%": self.soca_resources["vpc"].vpc_id,
"%%BASE_OS%%": user_specified_variables.base_os,
"%%LDAP_USERNAME%%": user_specified_variables.ldap_user,
"%%LDAP_PASSWORD%%": user_specified_variables.ldap_password,
"%%SOCA_INSTALL_AMI%%": self.soca_resources["ami_id"],
"%%RESET_PASSWORD_DS_LAMBDA%%": "false" if not self.soca_resources["reset_ds_lambda"] else self.soca_resources["reset_ds_lambda"].function_arn,
"%%SOCA_AUTH_PROVIDER%%": install_props.Config.directoryservice.provider,
"%%SOCA_LDAP_BASE%%": "false" if install_props.Config.directoryservice.provider == "activedirectory" else f"dc={',dc='.join(install_props.Config.directoryservice.openldap.name.split('.'))}".lower()}
with open("../user_data/Scheduler.sh") as plain_user_data:
user_data = plain_user_data.read()
for k, v in user_data_substitutes.items():
user_data = user_data.replace(k, v)
# Choose subnet where to deploy the scheduler
if not user_specified_variables.vpc_id:
if install_props.Config.entry_points_subnets.lower() == "public":
vpc_subnets = ec2.SubnetSelection(subnets=[self.soca_resources["vpc"].public_subnets[0]])
else:
vpc_subnets = ec2.SubnetSelection(subnets=[self.soca_resources["vpc"].private_subnets[0]])
else:
if install_props.Config.entry_points_subnets.lower() == "public":
subnet_info = user_specified_variables.public_subnets[0].split(",")
else:
subnet_info = user_specified_variables.private_subnets[0].split(",")
launch_subnet = ec2.Subnet.from_subnet_attributes(self, "SubnetToUse",
availability_zone=subnet_info[1],
subnet_id=subnet_info[0])
vpc_subnets = ec2.SubnetSelection(subnets=[launch_subnet])
# Create the Scheduler Instance
self.soca_resources["scheduler_instance"] = ec2.Instance(self, "SchedulerInstance",
availability_zone=vpc_subnets.availability_zones,
machine_image=ec2.MachineImage.generic_linux({
user_specified_variables.region: self.soca_resources["ami_id"]}),
instance_type=ec2.InstanceType(str(install_props.Config.scheduler.instance_type)),
key_name=user_specified_variables.ssh_keypair,
vpc=self.soca_resources["vpc"],
block_devices=[ec2.BlockDevice(
device_name="/dev/xvda" if user_specified_variables.base_os == "amazonlinux2" else "/dev/sda1",
volume=ec2.BlockDeviceVolume(
ebs_device=ec2.EbsDeviceProps(
volume_size=int(install_props.Config.scheduler.volume_size),
volume_type=ec2.EbsDeviceVolumeType.GP3))
)],
role=self.soca_resources["scheduler_role"],
security_group=self.soca_resources["scheduler_sg"],
vpc_subnets=vpc_subnets,
user_data=ec2.UserData.custom(user_data))
core.Tags.of(self.soca_resources["scheduler_instance"]).add("Name", f"{user_specified_variables.cluster_id}-Scheduler")
core.Tags.of(self.soca_resources["scheduler_instance"]).add("soca:BackupPlan", f"{user_specified_variables.cluster_id}")
# Ensure Filesystem are already up and running before creating the scheduler instance
if not user_specified_variables.fs_apps:
self.soca_resources["scheduler_instance"].node.add_dependency(self.soca_resources["fs_apps"])
if not user_specified_variables.fs_data:
self.soca_resources["scheduler_instance"].node.add_dependency(self.soca_resources["fs_data"])
ssh_user = "centos" if user_specified_variables.base_os == "centos7" else "ec2-user"
if install_props.Config.entry_points_subnets.lower() == "public":
# Associate the EIP to the scheduler instance
ec2.CfnEIPAssociation(self, "AssignEIPToScheduler",
eip=self.soca_resources["scheduler_eip"].ref,
instance_id=self.soca_resources["scheduler_instance"].instance_id)
core.CfnOutput(self, "SchedulerIP", value=self.soca_resources["scheduler_eip"].ref)
core.CfnOutput(self, "ConnectionString", value=f"ssh -i {user_specified_variables.ssh_keypair} {ssh_user}@{self.soca_resources['scheduler_eip'].ref}")
else:
core.CfnOutput(self, "SchedulerIP", value=self.soca_resources["scheduler_instance"].instance_private_ip)
core.CfnOutput(self, "ConnectionString", value=f"ssh -i {user_specified_variables.ssh_keypair} {ssh_user}@{self.soca_resources['scheduler_instance'].instance_private_ip}")