【问题标题】:AWS Cloudwatch Event putTargets not adding Lambda event sourcesAWS Cloudwatch Event putTargets 未添加 Lambda 事件源
【发布时间】:2016-09-30 23:51:11
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    那是(通过 boto3 对我来说):

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

    请参阅boto3 documentationcli doc

    【讨论】:

    • 这需要通过 CLI 完成吗?正确的?我正在从 sdk 方面寻找一些东西。另一件事,我不想在 Lambda 下为每个规则创建 eventSource。我正在为所有云监视规则寻找一些通用许可。我有 1000 条规则。
    • 删除我的规则后,它们仍然保留在 Lambda 事件源下,并且它们有点不可删除,状态未知。我希望来自 AWS 的人对此发表看法。
    • @johnny 您可能还需要删除权限。
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

      当我这样做时效果很好:

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

      还有 SDK

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

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

      【讨论】:

        【解决方案4】:

        我修好了。您需要在 putTargets 之后使用 SourceArn 为 lambda 添加权限是 cloud watch。例如:

        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");
                }
            }); 
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 看起来是这样,将其添加到 sdk 中确实很有意义,否则至少在我的情况下没有多大用处。
          • 同意。不幸的是,很多 AWS 功能似乎就是这种情况。
          猜你喜欢
          • 2021-03-28
          • 2017-11-12
          • 2019-12-10
          • 2020-05-08
          • 1970-01-01
          • 1970-01-01
          • 2019-11-18
          • 2020-07-27
          • 1970-01-01
          相关资源
          最近更新 更多