in cdk-stacks/lib/cdk-backend-stack.ts [33:183]
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
//store physical stack name to SSM
const outputHierarchy = `${configParams.hierarchy}outputParameters`;
const cdkBackendStackName = new ssm.StringParameter(this, 'CdkBackendStackName', {
parameterName: `${outputHierarchy}/CdkBackendStackName`,
stringValue: this.stackName
});
const ssmParams = loadSSMParams(this);
// create infrastructure stacks
const cognitoStack = new CognitoStack(this, 'CognitoStack', {
SSMParams: ssmParams,
cdkAppName: configParams['CdkAppName']
});
const dynamodbStack = new DynamoDBStack(this, 'DynamoDBStack', {
SSMParams: ssmParams,
cdkAppName: configParams['CdkAppName']
});
//create Recording stack
let recordingAPIEndpoint = '';
if (ssmParams.deployRecordingStack) {
const recordingStack = new RecordingStack(this, 'RecordingStack', {
SSMParams: ssmParams,
cdkAppName: configParams['CdkAppName']
});
this.recordingECSClusterARN = recordingStack.recordingECSClusterARN;
this.recordingECSClusterName = recordingStack.recordingECSClusterName;
const recordingAPIStack = new RecordingAPIStack(this, 'RecordingAPIStack', {
SSMParams: ssmParams,
cdkAppName: configParams['CdkAppName'],
cognitoAuthenticatedRole: cognitoStack.authenticatedRole,
appTable: dynamodbStack.appTable,
recordingECSClusterARN: recordingStack.recordingECSClusterARN,
recordingECSClusterName: recordingStack.recordingECSClusterName,
recordingContainerName: recordingStack.recordingContainerName,
recordingTaskDefinitionARN: recordingStack.recordingTaskDefinitionARN,
recordingBucketName: recordingStack.recordingBucketName,
recordingTaskDefinitionExecutionRoleARN: recordingStack.recordingTaskDefinitionExecutionRoleARN
});
recordingAPIStack.addDependency(recordingStack);
recordingAPIEndpoint = recordingAPIStack.recordingAPI.apiEndpoint;
}
//create API stacks
const connectAPIStack = new ConnectAPIStack(this, 'ConnectAPIStack', {
SSMParams: ssmParams,
cognitoAuthenticatedRole: cognitoStack.authenticatedRole,
cognitoUserPoolId: cognitoStack.userPool.userPoolId,
cognitoUserPoolARN: cognitoStack.userPool.userPoolArn,
appTable: dynamodbStack.appTable,
cdkAppName: configParams['CdkAppName'],
});
connectAPIStack.addDependency(cognitoStack);
const chimeAPIStack = new ChimeAPIStack(this, 'ChimeAPIStack', {
SSMParams: ssmParams,
cognitoAuthenticatedRole: cognitoStack.authenticatedRole,
appTable: dynamodbStack.appTable,
cdkAppName: configParams['CdkAppName']
});
chimeAPIStack.addDependency(cognitoStack);
chimeAPIStack.addDependency(dynamodbStack);
const chatAPIStack = new ChatAPIStack(this, 'ChatAPIStack', {
SSMParams: ssmParams,
appTable: dynamodbStack.appTable,
cdkAppName: configParams['CdkAppName']
});
chatAPIStack.addDependency(dynamodbStack);
const meetingAPIStack = new MeetingAPIStack(this, 'MeetingAPIStack', {
SSMParams: ssmParams,
getAttendeeNameLambda: chimeAPIStack.getAttendeeNameLambda,
getAttendeeJoinDataLambda: chimeAPIStack.getAttendeeJoinDataLambda,
cdkAppName: configParams['CdkAppName']
});
meetingAPIStack.addDependency(chimeAPIStack);
const routingAPIStack = new RoutingAPIStack(this, 'RoutingAPIStack', {
SSMParams: ssmParams,
cognitoAuthenticatedRole: cognitoStack.authenticatedRole,
appTable: dynamodbStack.appTable,
cdkAppName: configParams['CdkAppName']
});
routingAPIStack.addDependency(cognitoStack);
routingAPIStack.addDependency(dynamodbStack);
//create webapp bucket
const webAppBucket = new s3.Bucket(this, "WebAppBucket", {
bucketName: `${configParams['CdkAppName']}-WebAppBucket-${this.account}-${this.region}`.toLowerCase(),
removalPolicy: cdk.RemovalPolicy.DESTROY
});
const webAppCloudFrontOAI = new cloudfront.OriginAccessIdentity(this, `${configParams['CdkAppName']}-WebAppOAI`,);
//create frontend config
const frontendConfigStack = new FrontendConfigStack(this, 'FrontendConfigStack', {
cdkAppName: configParams['CdkAppName'],
webAppBucket: webAppBucket,
backendStackOutputs: [
{ key: 'identityPoolId', value: cognitoStack.identityPool.ref },
{ key: 'userPoolId', value: cognitoStack.userPool.userPoolId },
{ key: 'userPoolWebClientId', value: cognitoStack.userPoolClient.userPoolClientId },
{ key: 'cognitoDomainURL', value: `https://${cognitoStack.userPoolDomain.domain}.auth.${this.region}.amazoncognito.com` },
{ key: 'connectAPI', value: `${connectAPIStack.connectAPI.apiEndpoint}/` },
{ key: 'chimeAPI', value: `${chimeAPIStack.chimeAPI.apiEndpoint}/` },
{ key: 'meetingAPI', value: `${meetingAPIStack.meetingAPI.apiEndpoint}/` },
{ key: 'chatAPI', value: `${chatAPIStack.chatAPI.apiEndpoint}/` },
{ key: 'routingAPI', value: `${routingAPIStack.routingAPI.apiEndpoint}/` },
{ key: 'recordingAPI', value: `${recordingAPIEndpoint}/` },
{ key: 'backendRegion', value: this.region },
{ key: 'connectInstanceARN', value: ssmParams.connectInstanceARN },
{ key: 'connectInstanceURL', value: ssmParams.connectInstanceURL },
{ key: 'cognitoSAMLEnabled', value: String(ssmParams.cognitoSAMLEnabled) },
{ key: 'cognitoSAMLIdentityProviderName', value: ssmParams.cognitoSAMLIdentityProviderName },
{ key: 'connectDefaultContactFlowId', value: ssmParams.connectDefaultContactFlowId },
{ key: 'websiteAdHocRouteBaseURL', value: ssmParams.websiteAdHocRouteBaseURL },
{ key: 'deployRecordingStack', value: String(ssmParams.deployRecordingStack) },
{ key: 'recordingAttendeeName', value: ssmParams.recordingAttendeeName }
]
});
frontendConfigStack.addDependency(cognitoStack);
frontendConfigStack.addDependency(connectAPIStack);
frontendConfigStack.addDependency(chimeAPIStack);
frontendConfigStack.addDependency(meetingAPIStack);
frontendConfigStack.addDependency(chatAPIStack);
frontendConfigStack.addDependency(routingAPIStack);
/**************************************************************************************************************
* CDK Outputs *
**************************************************************************************************************/
this.webAppBucket = webAppBucket;
this.webAppCloudFrontOAI = webAppCloudFrontOAI;
this.appTable = dynamodbStack.appTable;
new cdk.CfnOutput(this, "userPoolId", {
value: cognitoStack.userPool.userPoolId
});
}