Javascript AWS SDK可以';t将Lambda添加为Cloudwatch事件的目标

Javascript AWS SDK可以';t将Lambda添加为Cloudwatch事件的目标,javascript,amazon-web-services,aws-lambda,aws-sdk,amazon-cloudwatch,Javascript,Amazon Web Services,Aws Lambda,Aws Sdk,Amazon Cloudwatch,我正在开发一个需要调度任务的应用程序,因此我使用AWS Lambda进行调度。但是,调度时间是动态的,因为它取决于用户请求,所以无法使用AWS控制台进行调度,因此我使用AWS Javascript SDK进行调度。 这就是流程: 创建一个CloudWatch规则(这是成功的,我可以在控制台中看到正在创建的规则 向lambda的策略添加权限,以便cloudwatch事件可以调用它(lambda函数代码对于所有请求都是相同的,因此我在AWS控制台中创建了一个lambda函数,而不是使用SDK) 将目

我正在开发一个需要调度任务的应用程序,因此我使用AWS Lambda进行调度。但是,调度时间是动态的,因为它取决于用户请求,所以无法使用AWS控制台进行调度,因此我使用AWS Javascript SDK进行调度。 这就是流程:

  • 创建一个CloudWatch规则(这是成功的,我可以在控制台中看到正在创建的规则
  • 向lambda的策略添加权限,以便cloudwatch事件可以调用它(lambda函数代码对于所有请求都是相同的,因此我在AWS控制台中创建了一个lambda函数,而不是使用SDK)
  • 将目标添加到步骤1中创建的规则中(此步骤失败)。我得到的错误是目标arn不支持RoleArn:aws:lambda:eu-west-1:629429065286:function:prebook。
  • 下面是我编写的Node.js代码

    schedule_aws_lambda: function(booking_id, cronTimeIST, callback){
          var event = new AWS.CloudWatchEvents({
            accessKeyId: accessKeyId,
            secretAccessKey: secretAccessKey,
            region: 'eu-west-1'
          });
    
          var lambda = new AWS.Lambda({
            accessKeyId: accessKeyId,
            secretAccessKey: secretAccessKey,
            region: 'eu-west-1'
          });
    
          var year = cronTimeIST.utc().year();
          var month = cronTimeIST.utc().month() + 1;
          var date = cronTimeIST.utc().date();
          var hour = cronTimeIST.utc().hour();
          var minute = cronTimeIST.utc().minute();
          var cronExpression = "cron(" + minute + " "+ hour + " " + date + " " + month + " ? " + year +")";
          var hour_minute = cronTimeIST.format("HH_mm");
          var ruleParams = {
            Name: 'brodcast_' + booking_id + '_' + hour_minute,
            Description: 'prebook brodcast for ' + booking_id + '_' + hour_minute,
            ScheduleExpression: cronExpression, 
            RoleArn: 'arn:aws:iam::629429065286:role/service-role/prebook_lambda_role',
            State: 'ENABLED',
          };
          event.putRule(ruleParams).promise()
          .then(data => {
            var lambdaPermission = {
              FunctionName: 'arn:aws:lambda:eu-west-1:629429065286:function:prebook',
              StatementId: 'brodcast_' + booking_id + '_' + hour_minute,
              Action: 'lambda:*',
              Principal: 'events.amazonaws.com', 
            };
            return lambda.addPermission(lambdaPermission).promise();
          })
          .then(data => {
            var targetParams = {
              Rule: ruleParams.Name,
              Targets: [
                {
                  Id: 'default',
                  Arn: 'arn:aws:lambda:eu-west-1:629429065286:function:prebook',
                  RoleArn: ruleParams.RoleArn,
                  Input: JSON.stringify({booking_id: booking_id})
                }
              ]
            };
            return event.putTargets(targetParams).promise();
          })
          .then(data => {
            callback(null, data);
          })
          .catch(err => {
            callback(err)
          });  
        }
    
    我知道它与没有权限的角色有关,我无法找出确切原因,我已为该角色提供了以下访问权限

    这是政策文件

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        },
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "events.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    

    基本上,我想向lambda函数附加许多触发器(触发时间我不知道,它取决于用户请求),但是,lambda函数代码对所有函数都是相同的。

    尝试删除RoleArn属性。如果您向lambda函数添加权限以允许CloudWatch事件调用它,则不需要它


    在功能策略中,确保添加事件的SourceArn。

    您有过这样的经历吗?没有,目前我们使用节点cron而不是lambda进行调度,但是,这不是正确的方式,因为如果服务器崩溃或重新启动,cron调度将丢失。我们正在尝试其他解决方案,如Firebase cloud功能nd Firebase DB。谢谢,我花了几个小时来解决这个问题,并向lambda函数添加权限(使用
    lambda.addPermission
    )修复了它。