in source/src/stack.ts [50:161]
constructor(scope: Construct, id: string, props: KeycloakStackProps = {}) {
super(scope, id, props);
const dbMsg = props.auroraServerless ? 'using aurora serverless' : 'rds mysql';
const vpcMsg = props.fromExistingVPC ? 'existing vpc' : 'new vpc';
this.setDescription(`(SO8021) - Deploy keycloak ${dbMsg} with ${vpcMsg}. template version: ${process.env.VERSION}`);
const certificateArnParam = this.makeParam('CertificateArn', {
type: 'String',
description: 'Certificate Arn for Application Load Balancer',
minLength: 5,
});
this.addGroupParam({ 'Application Load Balancer Settings': [certificateArnParam] });
this._keycloakSettings.certificateArn = certificateArnParam.valueAsString;
if (!props.auroraServerless) {
const databaseInstanceType = this.makeParam('DatabaseInstanceType', {
type: 'String',
description: 'Instance type to be used for the core instances',
allowedValues: INSTANCE_TYPES,
default: 'r5.large',
});
this.addGroupParam({ 'Database Instance Settings': [databaseInstanceType] });
this._keycloakSettings.databaseInstanceType = new ec2.InstanceType(databaseInstanceType.valueAsString);
}
if (props.fromExistingVPC) {
const vpcIdParam = this.makeParam('VpcId', {
type: 'AWS::EC2::VPC::Id',
description: 'Your VPC Id',
});
const pubSubnetsParam = this.makeParam('PubSubnets', {
type: 'List<AWS::EC2::Subnet::Id>',
description: 'Public subnets (Choose two)',
});
const privSubnetsParam = this.makeParam('PrivSubnets', {
type: 'List<AWS::EC2::Subnet::Id>',
description: 'Private subnets (Choose two)',
});
const dbSubnetsParam = this.makeParam('DBSubnets', {
type: 'List<AWS::EC2::Subnet::Id>',
description: 'Database subnets (Choose two)',
});
this.addGroupParam({ 'VPC Settings': [vpcIdParam, pubSubnetsParam, privSubnetsParam, dbSubnetsParam] });
const azs = ['a', 'b'];
const vpc = ec2.Vpc.fromVpcAttributes(this, 'VpcAttr', {
vpcId: vpcIdParam.valueAsString,
vpcCidrBlock: Aws.NO_VALUE,
availabilityZones: azs,
publicSubnetIds: azs.map((_, index) => Fn.select(index, pubSubnetsParam.valueAsList)),
privateSubnetIds: azs.map((_, index) => Fn.select(index, privSubnetsParam.valueAsList)),
isolatedSubnetIds: azs.map((_, index) => Fn.select(index, dbSubnetsParam.valueAsList)),
});
Object.assign(this._keycloakSettings, {
vpc,
publicSubnets: { subnets: vpc.publicSubnets },
privateSubnets: { subnets: vpc.privateSubnets },
databaseSubnets: { subnets: vpc.isolatedSubnets },
});
}
const minContainersParam = this.makeParam('MinContainers', {
type: 'Number',
description: 'minimum containers count',
default: 2,
minValue: 2,
});
const maxContainersParam = this.makeParam('MaxContainers', {
type: 'Number',
description: 'maximum containers count',
default: 10,
minValue: 2,
});
const targetCpuUtilizationParam = this.makeParam('AutoScalingTargetCpuUtilization', {
type: 'Number',
description: 'Auto scaling target cpu utilization',
default: 75,
minValue: 0,
});
this.addGroupParam({ 'AutoScaling Settings': [minContainersParam, maxContainersParam, targetCpuUtilizationParam] });
const javaOptsParam = this.makeParam('JavaOpts', {
type: 'String',
description: 'JAVA_OPTS environment variable',
});
this.addGroupParam({ 'Environment variable': [javaOptsParam] });
new KeyCloak(this, 'KeyCloak', {
vpc: this._keycloakSettings.vpc,
publicSubnets: this._keycloakSettings.publicSubnets,
privateSubnets: this._keycloakSettings.privateSubnets,
databaseSubnets: this._keycloakSettings.databaseSubnets,
certificateArn: this._keycloakSettings.certificateArn,
auroraServerless: props.auroraServerless,
databaseInstanceType: this._keycloakSettings.databaseInstanceType,
stickinessCookieDuration: Duration.days(7),
nodeCount: minContainersParam.valueAsNumber,
autoScaleTask: {
min: minContainersParam.valueAsNumber,
max: maxContainersParam.valueAsNumber,
targetCpuUtilization: targetCpuUtilizationParam.valueAsNumber,
},
env: {
JAVA_OPTS: javaOptsParam.valueAsString,
},
});
}