AWS开发工具包无法将Lambda添加为Cloudwatch事件的目标

vik*_*war 1 javascript amazon-web-services amazon-cloudwatch aws-sdk aws-lambda

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

  1. 创建一个CloudWatch规则(成功完成,我可以在控制台中看到正在创建的规则
  2. 向lambda策略添加权限,以便cloudwatch事件可以调用它(Lambda函数代码对于所有请求都是相同的,因此我在AWS Console中创建了lambda函数,而不是使用SDK)
  3. 将目标添加到在步骤1中创建的规则(此步骤失败)。我得到的错误是RoleArn不受目标arn: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)
      });  
    }
Run Code Online (Sandbox Code Playgroud)

我知道它必须与未经许可的角色一起做某事,我无法找出确切的原因,我为角色提供了以下访问权限 在此处输入图片说明

这是政策文件

{
  "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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*158 8

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

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

  • 谢谢,我浪费了几个小时来解决这个问题,并向 lambda 函数添​​加权限(使用“Lambda.addPermission”)修复了它。 (2认同)