async putCloudWatchEventRule()

in source/services/tasks/tasks.ts [873:945]


    async putCloudWatchEventRule(task: object): Promise<void | ErrorReturn> {
        // Only if the trigger type is schedule, CloudWatch Events rule is going to be created.
        if (task['triggerType'] === TriggerType.Schedule) {
            // Puts a rule
            let ruleParams: AWS.CloudWatchEvents.PutRuleRequest = {
                Name: task['taskId'],
                Description: task['description'],
                State: task['enabled'] ? 'ENABLED' : 'DISABLED'
            };

            if (task['scheduledType'] === ScheduledType.CronExpression) {
                ruleParams['ScheduleExpression'] = `cron(${task['scheduledCronExpression']})`;
            } else {
                ruleParams['ScheduleExpression'] = `rate(${task['scheduledFixedRateInterval']} ${task['scheduledFixedRateType']})`;
            }

            let ruleArn = '';
            try {
                let result = await this.cloudWatchEvents.putRule(ruleParams).promise();
                ruleArn = result.RuleArn;
            } catch (error) {
                LOGGER.error(`putCloudWatchEventRule Error: ${JSON.stringify(error)}`);
                return Promise.reject(
                    COMMON_UTIL.getErrorObject('PutCloudWatchEventRuleFailure', 500, 'Error occurred while putting a CloudWatchEvents rule.', error)
                );
            }

            // Puts a target
            let targetParams: AWS.CloudWatchEvents.PutTargetsRequest = {
                Rule: ruleParams.Name,
                Targets: []
            };

            task['manualTrigger'] = false;
            targetParams.Targets = [
                {
                    Id: task['taskId'],
                    Arn: this.resourceSelectorLambdaArn,
                    Input: JSON.stringify(task)
                }
            ]

            try {
                await this.cloudWatchEvents.putTargets(targetParams).promise();
                delete task['manualTrigger'];
            } catch (error) {
                LOGGER.error(`putCloudWatchEventRule Error: ${JSON.stringify(error)}`);
                return Promise.reject(
                    COMMON_UTIL.getErrorObject('PutCloudWatchEventRuleFailure', 500, 'Error occurred while putting CloudWatchEvents targets.', error)
                );
            }

            // Adds a permission to Lambda
            let lambdaParams: AWS.Lambda.AddPermissionRequest = {
                Action: 'lambda:InvokeFunction',
                FunctionName: this.resourceSelectorLambdaArn,
                Principal: 'events.amazonaws.com',
                SourceArn: ruleArn,
                StatementId: task['taskId']
            };

            try {
                await this.lambda.addPermission(lambdaParams).promise();
            } catch (error) {
                LOGGER.error(`putCloudWatchEventRule Error: ${JSON.stringify(error)}`);
                return Promise.reject(
                    COMMON_UTIL.getErrorObject('PutCloudWatchEventRuleFailure', 500, 'Error occurred while adding Lambda permission.', error)
                );
            }
        }

        return Promise.resolve();
    }