infrastructure/private-deployment/private-deployment.yaml (185 lines of code) (raw):

AWSTemplateFormatVersion: 2010-09-09 Description: AWS ParallelCluster UI - Resources for Private Deployment Parameters: Vpc: Description: VPC ID to create the VPC Endpoint in. Type: AWS::EC2::VPC::Id PrivateSubnetOne: Description: Subnet ID of the first private subnet that will be used by the PCUI lambda. Type: AWS::EC2::Subnet::Id PrivateSubnetTwo: Description: Subnet ID of the seconds private subnet that will be used by the PCUI lambda. Type: AWS::EC2::Subnet::Id PrivateSubnetThree: Description: Subnet ID of the seconds private subnet that will be used by the PCUI lambda. Type: AWS::EC2::Subnet::Id DcvInstanceAmiId: Description: | AMI for the DCV node. Must be a DCV AMI, e.g. DCV-AmazonLinux2-x86_64-*. DCV AMI can be retrieved with the command: aws ec2 describe-images --filters "Name=owner-alias,Values=amazon" "Name=name,Values=DCV-AmazonLinux2-x86_64-*" "Name=creation-date,Values=2024-10-*" "Name=architecture,Values=x86_64" "Name=is-public,Values=true" --query 'Images[].{Name:Name,ImageId:ImageId}' --output table Type: String DcvInstanceKeypair: Description: EC2 Keypair for the client node. Type: AWS::EC2::KeyPair::KeyName DcvInstanceType: Description: Instance type for the DCV instance. Must have a NVIDIA GPU. Type: String Default: g4dn.xlarge DcvInstancePublicSubnet: Description: Subnet ID of the public subnet where the client instance will run. Type: AWS::EC2::Subnet::Id DcvSessionUser: Description: Username for the DCV session. Type: String Default: ec2-user MinLength: 3 MaxLength: 64 DcvSessionPassword: Description: Password for the DCV session. Type: String Default: password MinLength: 3 MaxLength: 64 NoEcho: true AllowedDcvSourcePrefixList: Description: Allowed prefix list for DCV traffic source. Type: String Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Networking Parameters: - Vpc - PrivateSubnetOne - PrivateSubnetTwo - PrivateSubnetThree - Label: default: DCV Instance Parameters: - DcvInstanceAmiId - DcvInstanceType - DcvInstanceKeypair - DcvInstancePublicSubnet - Label: default: DCV Session Parameters: - DcvSessionUser - DcvSessionPassword Mappings: Dcv: Constants: Port: 8443 Resources: VpcEndpoint: Type: AWS::EC2::VPCEndpoint Properties: SecurityGroupIds: - !Ref VpcEndpointSecurityGroup ServiceName: !Sub "com.amazonaws.${AWS::Region}.execute-api" SubnetIds: - !Ref PrivateSubnetOne - !Ref PrivateSubnetTwo - !Ref PrivateSubnetThree VpcEndpointType: Interface VpcId: !Ref Vpc VpcEndpointSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security Group for the VPC Endpoint. VpcId: !Ref Vpc DcvSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security Group for the DCV instance. VpcId: !Ref Vpc PCUILambdaSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security Group for the PCUI Lambda. VpcId: !Ref Vpc DcvSecurityGroupIngressFromPrefixList: Type: AWS::EC2::SecurityGroupIngress Properties: Description: Allow DCV traffic from the prefix list. GroupId: !Ref DcvSecurityGroup SourcePrefixListId: !Ref AllowedDcvSourcePrefixList IpProtocol: TCP FromPort: !FindInMap [ Dcv, Constants, Port ] ToPort: !FindInMap [ Dcv, Constants, Port ] VpcEndpointSecurityGroupIngressFromDcv: Type: AWS::EC2::SecurityGroupIngress Properties: Description: Allow HTTPS traffic from the DCV Security Group. GroupId: !Ref VpcEndpointSecurityGroup SourceSecurityGroupId: !Ref DcvSecurityGroup IpProtocol: TCP FromPort: 443 ToPort: 443 VpcEndpointSecurityGroupIngressFromPCUILambda: Type: AWS::EC2::SecurityGroupIngress Properties: Description: Allow HTTPS traffic from the PCUI Lambda Security Group. GroupId: !Ref VpcEndpointSecurityGroup SourceSecurityGroupId: !Ref PCUILambdaSecurityGroup IpProtocol: TCP FromPort: 443 ToPort: 443 DcvInstance: Type: AWS::EC2::Instance CreationPolicy: ResourceSignal: Timeout: PT10M Properties: ImageId: !Ref DcvInstanceAmiId InstanceType: !Ref DcvInstanceType KeyName: !Ref DcvInstanceKeypair SecurityGroupIds: - Ref: DcvSecurityGroup SubnetId: !Ref DcvInstancePublicSubnet Tags: - Key: Name Value: PCUI-DcvInstance UserData: Fn::Base64: !Sub - | #!/bin/bash -e # Create DCV session for ec2-user # Ref: https://www.ni-sp.com/support/how-to-install-nice-dcv-on-aws-ec2/ echo "${DcvSessionPassword}" | sudo passwd ${DcvSessionUser} --stdin sudo -u ${DcvSessionUser} dcv create-session session1 # Install Chromium Browser # Ref: https://stackoverflow.com/questions/72077341/how-do-you-install-chrome-on-amazon-linux-2 sudo amazon-linux-extras install epel -y sudo yum install -y chromium /opt/aws/bin/cfn-signal -e "$?" --stack "${AWS::StackName}" --resource DcvInstance --region "${AWS::Region}" - DcvSessionUser: !Ref DcvSessionUser DcvSessionPassword: !Ref DcvSessionPassword Outputs: VpcEndpoint: Value: !Ref VpcEndpoint Description: The VPC Endpoint. VpcEndpointSecurityGroup: Value: !Ref VpcEndpointSecurityGroup Description: The Security Group attached to the VPC Endpoint. VpcEndpointSubnetOne: Value: !Ref PrivateSubnetOne Description: The first subnet of the VPc Endpoint. VpcEndpointSubnetTwo: Value: !Ref PrivateSubnetTwo Description: The second subnet of the VPc Endpoint. VpcEndpointSubnetThree: Value: !Ref PrivateSubnetThree Description: The third subnet of the VPc Endpoint. PCUILambdaSecurityGroup: Value: !Ref PCUILambdaSecurityGroup Description: The security group for PCUI Lambda. DcvInstance: Value: !Ref DcvInstance Description: The EC2 instance running DCV server. DcvInstanceIp: Value: !GetAtt DcvInstance.PublicIp Description: The public IP of the DCV instance. DcvInstancePort: Value: !FindInMap [ Dcv, Constants, Port ] Description: The port to connect to the DCV instance.