当前位置: 首页 > 知识库问答 >
问题:

AWS SDK无法将Lambda作为目标添加到Cloudwatch事件

穆季萌
2023-03-14

我正在开发一个需要安排任务的应用程序,所以我使用AWS Lambda。但是,调度时间是动态的,因为它取决于用户请求,所以不能使用AWS Console进行调度,所以我使用AWS JavascriptSDK来调度它。这是流程:

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

下面是节点。我写的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函数代码对所有人都是相同的。

共有1个答案

赵昊阳
2023-03-14

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

在函数策略中,确保添加事件的SourceArn。

 类似资料:
  • 我想将Lambda目标添加到现有的CloudWatch规则中。我使用以下内容引用现有规则: 后来我添加了一个目标: 执行cdk synth或deploy时,出现以下错误: 对象没有属性add_target 我知道IRule元素没有那种方法,但我找不到一个明确的方法来实现我所需要的。 我还尝试在Lambda中使用事件源,但出现以下错误: 无法识别的事件源,必须是kinesis、Dynamodb st

  • 我正在打电话给aws cloud. WatchEvent putRur

  • 问题内容: 我有一个通用的控件类,需要根据视图控制器来设置按钮的完成方式。由于setLeftButtonActionWithClosure函数需要将一个闭包作为参数来设置,因此应该将其设置为取消按钮的动作。在Swift中怎么可能因为我们需要将函数名称作为String传递给action:参数。 问题答案: 注意:就像@EthanHuang一样,“如果您有两个以上的实例,则此解决方案将不起作用。所有操

  • 我有一个附加在CloudWatch事件上的lambda,一旦事件触发,lambda将通过以下代码删除规则: 提前感谢!

  • 问题内容: 尝试从此处使用unstruction将alamofire添加到快速项目 完成所有这些步骤,清理项目很多计时器并重新启动XCode,没有任何帮助。错误不会消失 http://i.stack.imgur.com/kNU3R.png “无法为’Alamofire’加载基础模块”,无关紧要 我所做的更改: 1)将项目文件添加到我的项目 i.stack.imgur.com/eUe8E.png 2

  • 我尝试使用Cloudwatch Events/EventBridge JS SDK来启用/禁用在全局范围内有效的规则。但是,附加到我的lambda的cloudwatch事件的状态不会改变。 我希望有一个lambda,我可以启用/禁用CRON方面。我看到在AWSUI有一个切换来启用/禁用云观察事件,但我无法弄清楚如何使用JSSDK访问此功能。 AWS cloudwatch事件切换: