constructor()

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
    });
  }