constructor()

in javascript/programmatically-create-task-example/lib/amazon_connect_tasks_cloud_formation_template-stack.ts [9:148]


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

    /**
     * 
     * Parameters
     * 
     */
    const connectInstanceArn = new cdk.CfnParameter(this, "connectInstanceArn", {
      type: "String",
      description: "The ARN of the Amazon Connect instance you want to use."});

    /**
     * 
     * IAM Configuration
     * 
     */
    let createContactFlowPolicy = new iam.ManagedPolicy(this, `CreateContactFlowPolicy`, {
      description: "TODO",
      statements: [
        iam.PolicyStatement.fromJson({
          Sid: "CreateContactFlow",
          Effect: "Allow",
          Action: ["connect:CreateContactFlow"],
          Resource: [`${connectInstanceArn.valueAsString}`, `${connectInstanceArn.valueAsString}/*`],
        }),
      ],
    });

    let createTaskPolicy = new iam.ManagedPolicy(this, `CreateTaskPolicy`, {
      description: "TODO",
      statements: [
        iam.PolicyStatement.fromJson({
          Sid: "CreateTask",
          Effect: "Allow",
          Action: ["connect:StartTaskContact"],
          Resource: [`${connectInstanceArn.valueAsString}`, `${connectInstanceArn.valueAsString}/*`],
        }),
        iam.PolicyStatement.fromJson({
          Sid: "GetMessageContent",
          Effect: "Allow",
          Action: ["workmailmessageflow:GetRawMessageContent"],
          Resource: ['*'],
        }),
      ],
    });

    let sendEmailPolicy = new iam.ManagedPolicy(this, `SendEmailPolicy`, {
      description: "TODO",
      statements: [
        iam.PolicyStatement.fromJson({
          Sid: "SendEmail",
          Effect: "Allow",
          Action: ["ses:SendEmail"],
          Resource: ['*'],
        }),
      ],
    });

    /**
     * 
     * Lambda Configuration
     * 
     */
    const amazonConnectLayer = new lambda.LayerVersion(this, "AmazonConnectLayer", {
      // updated 10/15 --> TODO: update to include new zip with new create contact flow api
      code: lambda.Code.fromAsset(path.resolve(__dirname, "../src/lambdaLayer/TaskJsSDK.zip")),
      compatibleRuntimes: [lambda.Runtime.NODEJS_12_X, lambda.Runtime.NODEJS_10_X],
    });

    const mailParserLambda = new lambda.LayerVersion(this, "MailParserLambda", {
      // updated 10/15 --> TODO: update to include new zip with new create contact flow api
      code: lambda.Code.fromAsset(path.resolve(__dirname, "../src/lambdaLayer/mailparser_lambda_layer.zip")),
      compatibleRuntimes: [lambda.Runtime.NODEJS_12_X, lambda.Runtime.NODEJS_10_X],
    });


    const sendEmailLambda = new lambda.Function(this, "SendEmailLambda", {
      handler: "SendEmailHandler.handler",
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset(path.resolve(__dirname, `../src/lambdaFunctions/`))
    });
    sendEmailLambda.role?.addManagedPolicy(sendEmailPolicy);

    const connectServicePrincipal = new iam.ServicePrincipal('connect.amazonaws.com', {
      conditions: {
        ArnEquals: {
          'aws:SourceArn': sendEmailLambda.functionArn
        }
      }
    });
    
    sendEmailLambda.addPermission('ConnectAccess', {
      principal: connectServicePrincipal,
    });

    const solutionHelperLambda = new lambda.Function(this, "SolutionHelperLambda", {
      handler: "SolutionHelperHandler.handler",
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset(path.resolve(__dirname, `../src/lambdaFunctions/`)),
      layers: [amazonConnectLayer],
      environment: {
        INSTANCE_ARN: connectInstanceArn.valueAsString
      }
    });
    solutionHelperLambda.role?.addManagedPolicy(createContactFlowPolicy);

    const customResource = new cdk.CustomResource(this, "CreateContactFlows", {
      serviceToken: solutionHelperLambda.functionArn,
      resourceType: "Custom::LoadLambda",
      properties: {
        CustomAction: "CreateContactFlows",
        SendEmailFunctionArn: sendEmailLambda.functionArn
      }
    });
    
    const createTaskLambda = new lambda.Function(this, "CreateTaskLambda", {
      handler: "CreateTaskHandler.handler",
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset(path.resolve(__dirname, `../src/lambdaFunctions/`)),
      layers: [amazonConnectLayer, mailParserLambda],
      timeout: Duration.seconds(15),
      environment: {
        INSTANCE_ARN: connectInstanceArn.valueAsString,
        CONTACT_FLOW_ID: customResource.getAttString("contactFlowId")
      }
    });
    createTaskLambda.role?.addManagedPolicy(createTaskPolicy);
    const workmailServicePrincipal = new iam.ServicePrincipal(`workmail.${this.region}.amazonaws.com`, {
      conditions: {
        ArnEquals: {
          'aws:SourceArn': createTaskLambda.functionArn
        }
      }
    });
    
    createTaskLambda.addPermission('WorkMailAccess', {
      principal: workmailServicePrincipal,
    });
  }