AWS Cloudwatch事件putTargets未添加Lambda事件源

时间:2016-06-01 14:29:25

标签: amazon-web-services aws-lambda aws-sdk amazon-cloudwatch

我正在调用aws cloudWatchEvent putRule& PutTarget api通过aws sdk创建cloudWatch规则并将目标附加到它。我的目标是一个lambda函数,规则被创建,目标附加到规则但当规则根据其计划触发时,目标lambda函数不会触发。所以我进一步看了一下,发现没有添加lambda函数下的事件源,这使得它不会触发。如果我通过AWS控制台创建规则和目标,则会创建事件源并且一切正常但不是API。

5 个答案:

答案 0 :(得分:8)

添加目标后,您需要调用lambda add-permission

那是(通过 boto3 给我):

  • 创建lambda
  • 创建规则
  • 创建目标
  • 使用lambda arn
  • 调用lambda add-permission

请参阅boto3 documentationcli doc

答案 1 :(得分:2)

可以通过aws sdk添加事件源。我遇到了同样的问题,请参阅下面的代码作为使用java的解决方案。

     AddPermissionRequest addPermissionRequest = new AddPermissionRequest();
                addPermissionRequest.setStatementId("12345ff");  //any unique string would go
                addPermissionRequest.withSourceArn(ruleArn);
                addPermissionRequest.setAction("lambda:InvokeFunction");
                addPermissionRequest.setPrincipal("events.amazonaws.com");
                addPermissionRequest.setFunctionName("name of your lambda function");

                AWSLambdaAsyncClient lambdaClient = new AWSLambdaAsyncClient();
                lambdaClient.withRegion(Regions.US_EAST_1); //region of your lambda's location

lambdaClient.addPermission(addPermissionRequest);

答案 2 :(得分:0)

据我所知,目前无法通过SDK实现此功能,因此只能通过控制台或使用CLI将CloudWatch事件源添加到lambdas。如果我错了,我很想知道什么是可能的,但这里的文档似乎同意。 http://docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html

答案 3 :(得分:0)

我在这里遇到了同样的问题,我通过@Anvita Shukla的消化来解决这个问题。

当我这样做时,这很好用:

  • 创建lambda(这是我在网页中创建的)

使用SDK

  • 创建规则对象
  • 创建目标对象
  • 提出规则的要求
  • 提出目标要求
  • 获取规则请求的响应对象以检索规则ARN
  • 创建权限对象(有@Anvita Shukla说)并设置规则 ARN
  • 通过lambda客户端对象添加权限

在aws lambda页面中,我可以看到我的lambda与关联的触发器事件。在aws cloudwatch events页面中,我可以看到创建的规则。 我用java语言写了这个。如果你想我可以分享代码。

答案 4 :(得分:0)

我修复了它。您需要在putTargets之后添加SourceArn为lambda的lambda权限。例如:

var lambdaPermission = {
        FunctionName: 'cloudwatch-trigger',
        StatementId : timestamp.toString(),
        Action: 'lambda:InvokeFunction',
        Principal: 'events.amazonaws.com', 
        SourceArn: 'arn:aws:events:ap-southeast-1:XXXXXX:rule/schedule_auto_1'
    };

    lambda.addPermission(lambdaPermission, function(err, data) {
        if (err) {
            console.log("Error", err);
        } else {
            console.log("Success", data);
            console.log("add permisson done");
        }
    });