constructor()

in lib/constructs/vcs/svn.ts [24:139]


  constructor(scope: cdk.Construct, id: string, props: SVNPatternProps) {
    super(scope, id);

    const svnSecurityGroup = new ec2.SecurityGroup(this, "svn-sg", {
      vpc: props.vpc,
    });
    props.allowAccessFrom.forEach((p) =>
      svnSecurityGroup.addIngressRule(p, ec2.Port.tcp(80))
    );
    svnSecurityGroup.addIngressRule(
      Peer.ipv4(props.vpc.vpcCidrBlock),
      ec2.Port.tcp(80)
    );

    const svnRole = new iam.Role(this, "svn-instance-role", {
      assumedBy: new ServicePrincipal("ec2.amazonaws.com"),
    });
    svnRole.attachInlinePolicy(createSSMPolicy(this, props.ssmLogBucket));

    const svnSecret = new secretsmanager.Secret(this, "VCSSecret", {
      generateSecretString: {
        secretStringTemplate: JSON.stringify({ username: "admin" }),
        generateStringKey: "password",
        excludePunctuation: true,
      },
    });
    svnSecret.grantRead(svnRole);

    const { region } = new cdk.ScopedAws(this);
    const userData = ec2.UserData.custom(`
#!/usr/bin/env bash

set -eux

sudo yum update -y
sudo yum install -y mod_dav_svn subversion jq

sudo cat <<EOF | sudo tee /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNParentPath /var/www/html/svn
AuthType Basic
AuthName "SVN Auth"
AuthUserFile /etc/svn-auth-users
Require valid-user
</Location>
EOF

sudo mkdir -p /var/www/html/svn
cd /var/www/html/svn
sudo svnadmin create testrepo
sudo chown -R apache.apache testrepo

PASSWORD=$(aws secretsmanager get-secret-value --secret-id ${svnSecret.secretArn} --region ${region} --query SecretString --output text | jq -r .password)
sudo htpasswd -cb /etc/svn-auth-users admin $PASSWORD

sudo systemctl enable httpd
sudo systemctl start httpd
        `);

    const instanceType = ec2.InstanceType.of(
      ec2.InstanceClass.C5,
      ec2.InstanceSize.XLARGE
    );
    const machineImage = ec2.MachineImage.latestAmazonLinux({
      generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
    });
    const ebsSetting = {
      volumeSize: 300,
      volumeType: autoscaling.EbsDeviceVolumeType.GP3,
      deleteOnTermination: false, // for a sudden termination
    };

    this.instance = new ec2.Instance(this, "svn-instance", {
      vpc: props.vpc,
      vpcSubnets: { subnetType: props.subnetType },
      securityGroup: svnSecurityGroup,
      instanceType,
      machineImage,
      userData,
      role: svnRole,
      blockDevices: [
        {
          deviceName: "/dev/sda1",
          volume: {
            ebsDevice: ebsSetting,
          },
        },
      ],
    });

    cdk.Tags.of(this.instance).add(
      props.backup.BackupTagKey,
      props.backup.BackupTagValue
    );

    const svnTemplate = new ec2.LaunchTemplate(this, "svn-template", {
      launchTemplateName: "svn-template",
      instanceType,
      machineImage,
      userData: userData,
      role: svnRole,
      blockDevices: [
        {
          deviceName: "/dev/sda1",
          volume: {
            ebsDevice: ebsSetting
          }
        },
      ],
      securityGroup: svnSecurityGroup,
    });
    cdk.Tags.of(svnTemplate).add(props.backup.BackupTagKey, props.backup.BackupTagValue)
  }