AWSTemplateFormatVersion: '2010-09-09'
Description: 'JFrog Artifactory Quick Start Deployment into an Existing VPC (qs-1q037efj0)'
Metadata:
  QuickStartDocumentation:
    EntrypointName: "Launch into an existing VPC"
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Essential configuration
        Parameters:
          - KeyPairName
          - DatabasePassword
      - Label:
          default: Network configuration
        Parameters:
          - AvailabilityZones
      - Label:
          default: Security configuration
        Parameters:
          - AccessCidr
          - RemoteAccessCidr
      - Label:
          default: Amazon EC2 configuration
        Parameters:
          - VolumeSize
          - InstanceType
      - Label:
          default: JFrog Artifactory configuration
        Parameters:
          - ArtifactoryVersion
          - NumberOfSecondary
          - SmLicenseName
          - SmCertName
          - ArtifactoryServerName
          - MasterKey
      - Label:
          default: Amazon RDS configuration
        Parameters:
          - DatabaseInstance
          - DatabaseAllocatedStorage
      - Label:
          default: JFrog Xray Configuration
        Parameters:
          - InstallXray
          - XrayVersion
          - XrayInstanceType
    ParameterLabels:
      KeyPairName:
        default: SSH key name
      AccessCidr:
        default: Permitted IP range
      RemoteAccessCidr:
        default: Remote access CIDR
      AvailabilityZones:
        default: Availability Zones
      VolumeSize:
        default: EBS root volume size
      InstanceType:
        default: EC2 instance type
      ArtifactoryVersion:
        default: Artifactory version
      NumberOfSecondary:
        default: Secondary instances
      SmLicenseName:
        default: Artifactory licenses secret name
      SmCertName:
        default: Artifactory certificate secret name
      ArtifactoryServerName:
        default: Artifactory server name
      MasterKey:
        default: Master server key
      DatabasePassword:
        default: Database password
      DatabaseInstance:
        default: Database instance type
      DatabaseAllocatedStorage:
        default: Database allocated storage
      InstallXray:
        default: Install JFrog Xray
      XrayVersion:
        default: Version of Xray to install
      XrayInstanceType:
        default: Xray instance type
Parameters:
  BastionRootVolumeSize:
    Description: Size of the root volume in the bastion instances.
    Default: 10
    Type: Number
  QsS3BucketName:
    Description: S3 bucket name for the Quick Start assets. This string can include
      numbers, lowercase letters, and hyphens (-). It cannot start
      or end with a hyphen (-).
    AllowedPattern: ^[0-9a-z]+([0-9a-z-]*[0-9a-z])*$
    ConstraintDescription: Quick Start bucket name can include numbers, lowercase
      letters, and hyphens (-). It cannot start or end with a hyphen (-).
    Default: aws-quickstart
    Type: String
  QsS3KeyPrefix:
    Description: S3 key prefix for the Quick Start assets. Quick Start key prefix
      can include numbers, lowercase letters, uppercase letters, hyphens (-), and
      forward slash (/).
    AllowedPattern: ^[0-9a-zA-Z-/]*$
    ConstraintDescription: Quick Start key prefix can include numbers, lowercase letters,
      uppercase letters, hyphens (-), and forward slash (/).
    Default: quickstart-jfrog-artifactory/
    Type: String
  QsS3BucketRegion:
    Default: 'us-east-1'
    Description: AWS Region where the Quick Start S3 bucket (QSS3BucketName) is hosted. If you use your own bucket, you must specify your own value.
    Type: String
  EnableBastion:
    Description: If set to true, a bastion host will be created.
    Default: "true"
    Type: String
    AllowedValues:
      - "true"
      - "false"
  KeyPairName:
    Description: Name of an existing key pair,
      which allows you to connect securely to your instance after it launches.
      This is the key pair you created in your preferred Region.
    Type: AWS::EC2::KeyPair::KeyName
  AccessCidr:
    Description: CIDR IP range that is permitted to access Artifactory.
      We recommend that you set this value to a trusted IP range.
      For example, you might want to grant only your corporate network access to the software.
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$
    Default: 0.0.0.0/0
    Type: String
  RemoteAccessCidr:
    Description: Remote CIDR range that allows you to connect to the bastion instance by using SSH.
      It is recommended that you set this value to a trusted IP range.
      For example, you may want to grant specific ranges from within your corporate network that use the SSH protocol.
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$
    Type: String
  AvailabilityZone1:
    Description: Availability Zone 1 to use for the subnets in the VPC. Two
      Availability Zones are used for this deployment.
    Type: AWS::EC2::AvailabilityZone::Name
  AvailabilityZone2:
    Description: Availability Zone 2 to use for the subnets in the VPC. Two
      Availability Zones are used for this deployment.
    Type: AWS::EC2::AvailabilityZone::Name
  VolumeSize:
    Description: Size in gigabytes of the available storage (min 10GB); the Quick Start will create an
      Amazon Elastic Block Store (Amazon EBS) volumes of this size.
    Default: 100
    Type: Number
  InstanceType:
    Description: EC2 type for the Artifactory instances.
    AllowedValues:
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5.4xlarge
      - m5.8xlarge
      - m5.12xlarge
      - m5.16xlarge
      - m5.24xlarge
      - m5.metal
      - m5d.large
      - m5d.xlarge
      - m5d.2xlarge
      - m5d.4xlarge
      - m5d.8xlarge
      - m5d.12xlarge
      - m5d.16xlarge
      - m5d.24xlarge
      - m5d.metal
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - m5a.4xlarge
      - m5a.8xlarge
      - m5a.12xlarge
      - m5a.16xlarge
      - m5a.24xlarge
    ConstraintDescription: Must contain valid instance type.
    Default: m5.xlarge
    Type: String
  ArtifactoryVersion:
    Description: Version of Artifactory that you want to deploy into the Quick Start.
      To select the correct version, see the release notes at
      https://www.jfrog.com/confluence/display/RTF/Release+Notes.
    Default: 7.17.5
    Type: String
  NumberOfSecondary:
    Description: Number of secondary Artifactory servers to complete your
      HA deployment. To align with Artifactory best practices, the minimum number
      is two, and the maximum is seven. Do not select more instances than you
      have licenses for.
    AllowedValues:
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
    Default: 2
    Type: Number
  SmLicenseName:
    Description: Secret name created in AWS Secrets Manager, which contains the Artifactory licenses.
    Default: ''
    Type: String
  SmCertName:
    Description: Secret name created in AWS Secrets Manager, which contains the SSL certificate and certificate key.
    Default: ''
    Type: String
  ArtifactoryServerName:
    Description: Name of your Artifactory server. Ensure that this matches your certificate.
    Default: 'artifactory'
    Type: String
  MasterKey:
    Description: Master key for the Artifactory cluster. Generate a master key by using the command '$openssl rand -hex 16'.
    AllowedPattern: ^[a-zA-Z0-9]+$
    MinLength: '1'
    MaxLength: '64'
    ConstraintDescription: Only capital or lowercase letters and numbers, with a Max of 64 characters.
    NoEcho: 'true'
    Default: 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
    Type: String
  DatabasePassword:
    Description: Password for the Artifactory database user.
    AllowedPattern: ^[^ \\']+$
    MinLength: '8'
    MaxLength: '12'
    ConstraintDescription: Must be at least 8 and no more than
      12 characters containing letters and (minimum 1 capital letter), numbers and
      symbols.
    NoEcho: 'true'
    Type: String
  DatabaseInstance:
    Description: Size of the database to be deployed as part of the Quick Start.
    AllowedValues:
      - db.m5.large
      - db.m5.xlarge
      - db.m5.2xlarge
      - db.m5.10xlarge
      - db.m5.16xlarge
      - db.m5.large
      - db.m5.xlarge
      - db.m5.2xlarge
      - db.m5.4xlarge
      - db.m5.12xlarge
      - db.m5.24xlarge
    ConstraintDescription: Must be a valid database Instance Type.
    Default: db.m5.large
    Type: String
  DatabaseAllocatedStorage:
    Description: Size in gigabytes of the available storage for the database instance.
    MinValue: 5
    MaxValue: 1024
    Default: 10
    Type: Number
  InstallXray:
    Description: Choose true to install JFrog Xray instance(s).
    ConstraintDescription: True or False
    AllowedValues:
      - "true"
      - "false"
    Default: "true"
    Type: String
  XrayVersion:
    Description: The version of Xray that you want to deploy into the Quick Start.
    Default: 3.22.1
    Type: String
  XrayNumberOfInstances:
    Description: The number of Xray instances servers to complete your
      HA deployment. The minimum number is one; the maximum is seven.
      Do not select more than instances than you have licenses for.
    MinValue: 1
    MaxValue: 7
    Default: 1
    Type: Number
  XrayInstanceType:
    Description: The EC2 instance type for the Xray instances.
    AllowedValues:
      - c5.2xlarge
      - c5.4xlarge
    ConstraintDescription: Must contain valid instance type.
    Default: c5.2xlarge
    Type: String
  XrayDatabaseUser:
    Description: The login ID for the Xray database user.
    MinLength: '1'
    MaxLength: '16'
    AllowedPattern: ^[a-zA-Z]([a-zA-Z0-9])+$
    ConstraintDescription: 1 to 16 alphanumeric characters. First character must be a letter.
    Default: xray
    Type: String
  XrayDatabasePassword:
    Description: The password for the Xray database user.
    AllowedPattern: ^[^ \\']+$
    MinLength: '8'
    MaxLength: '12'
    ConstraintDescription: Must be at least 8 and no more than
      12 characters containing letters and (minimum 1 capital letter), numbers and
      symbols.
    NoEcho: 'true'
    Type: String
  ArtifactoryProduct:
    Description: JFrog Artifactory product you want to install into an AMI.
    AllowedValues:
      - JFrog-Artifactory-Pro
      - JFrog-Artifactory-Enterprise
      - JFrog-Container-Registry
    Default: JFrog-Artifactory-Enterprise
    Type: String
Conditions:
  UsingDefaultBucket: !Equals [!Ref QsS3BucketName, 'aws-quickstart']

Resources:
  ArtifactoryNewVpcStack:
    Type: JFrog::Artifactory::NewVpc::MODULE
    Properties:
      LogicalId : "ArtifactoryNewVpcStack"
      EnableBastion: !Ref EnableBastion
      BastionRootVolumeSize: !Ref BastionRootVolumeSize
      KeyPairName: !Ref KeyPairName
      ProvisionBastionHost: "Enabled"
      AccessCidr: !Ref AccessCidr
      RemoteAccessCidr: !Ref RemoteAccessCidr
      ArtifactoryProduct: !Ref ArtifactoryProduct
      ArtifactoryVersion: !Ref ArtifactoryVersion
      VolumeSize: !Ref VolumeSize
      InstanceType: !Ref InstanceType
      NumberOfSecondary: !Ref NumberOfSecondary
      SmLicenseName: !Ref SmLicenseName
      SmCertName: !Ref SmCertName
      ArtifactoryServerName: !Ref ArtifactoryServerName
      MasterKey: !Ref MasterKey
      DatabasePassword: !Ref DatabasePassword
      DatabaseInstance: !Ref DatabaseInstance
      DatabaseAllocatedStorage: !Ref DatabaseAllocatedStorage
      DatabasePreferredAz: !Ref 'AvailabilityZone1'
      MultiAzDatabase: false
      QsS3BucketName: !Ref QsS3BucketName
      QsS3KeyPrefix: !Ref QsS3KeyPrefix
      QsS3BucketRegion: !Ref QsS3BucketRegion
      AvailabilityZone1: !Ref AvailabilityZone1
      AvailabilityZone2: !Ref AvailabilityZone2
      InstallXray: !Ref InstallXray
      XrayVersion: !Ref XrayVersion
      XrayNumberOfInstances: !Ref XrayNumberOfInstances
      XrayInstanceType: !Ref XrayInstanceType
      XrayDatabaseUser: !Ref XrayDatabaseUser
      XrayDatabasePassword: !Ref XrayDatabasePassword
