我正在调用aws cloudWatchEvent putRule& PutTarget api通过aws sdk创建cloudWatch规则并将目标附加到它。我的目标是一个lambda函数,规则被创建,目标附加到规则但当规则根据其计划触发时,目标lambda函数不会触发。所以我进一步看了一下,发现没有添加lambda函数下的事件源,这使得它不会触发。如果我通过AWS控制台创建规则和目标,则会创建事件源并且一切正常但不是API。
答案 0 :(得分:8)
添加目标后,您需要调用lambda add-permission
。
那是(通过 boto3 给我):
add-permission
答案 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的消化来解决这个问题。
当我这样做时,这很好用:
使用SDK
在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");
}
});