AWS CloudWatch Schedule + Lambda:触发器无法正常工作

时间:2017-01-03 21:39:43

标签: java aws-lambda

我已经设置了一个简单的Lambda函数,用java jar文件打印出一行文本。我可以使用“测试”按钮运行测试。我还设置了5分钟的CloudWatch计划触发器,计划表达式:速率(5分钟)。触发器已启用。我可以查看触发器并在“编辑”中确认触发器已分配给我的函数,并且它将使用静态JSON作为输入。出于某种原因,我的功能似乎没有被我的5分钟触发器触发 - 我期望看到触发器的一些日志,但是根本没有任何东西。我正在使用这个记录器:com.amazonaws.services.lambda.runtime.LambdaLogger。我想知道是否还有其他设置我不知道需要设置以使触发器工作。谢谢你的时间。

1编辑:分辨率

计时器用于将λ转换为http到ElasticSearch服务。我们的ElasticSearch服务变得没有响应,我们不得不重新创建它。在我们重新创建ElasticSearch服务之后,计时器开始工作......虽然计时器工作,但在控制台中,我开始看到计时器的欺骗。在我关掉定时器后,它又创建了另一个副本。看起来像一个有缺陷的UI。我正在使用Chrome。

3 个答案:

答案 0 :(得分:3)

我过去遇到过这个问题,可能还有另一种方法可以解决这个问题,但我是如何做到的,因为我为创建的规则(CloudWatch触发器)指定了一个角色arn能够调用lambda函数。我使用的政策文件是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Resource": "*"
    }
  ]
}

我无法通过控制台/ Web界面弄清楚如何做到这一点。但你可以通过AWS Command Line Interface - Rule - Put Rule来做到这一点。所以你需要:

  1. 使用上述文档创建策略
  2. 为您的CloudWatch规则创建角色
  3. 将您在步骤1中创建的策略附加到第2步中的角色创建
  4. 像以前一样创建CloudWatch规则,但使用给定的角色。

答案 1 :(得分:0)

如果你正在做的情况是通过java sdk,那么将lambda作为目标放到CW之后就是解决方案。

AddPermissionRequest addPermissionRequest = new AddPermissionRequest();         addPermissionRequest.setStatementId( “12345ff”); //识别您的许可的独特方式         addPermissionRequest.withSourceArn(ruleArn);         addPermissionRequest.setAction( “拉姆达:InvokeFunction”);         addPermissionRequest.setPrincipal( “events.amazonaws.com”);         addPermissionRequest.setFunctionName(“你的lambda名字在这里”);

    AWSLambdaAsyncClient lambdaClient = new AWSLambdaAsyncClient();
    lambdaClient.withRegion(Regions.US_EAST_1); //specify whichever region your lambda is hosted in

答案 2 :(得分:0)

//*Build client* 
AmazonCloudWatchEvents cwe =
                AmazonCloudWatchEventsClientBuilder.defaultClient();

            //*Add rules*
                PutRuleRequest rulerequest = new PutRuleRequest()
                    .withName(name).withRoleArn(your-role-arn)
                    .withScheduleExpression(yourExpiryByRateorCron)
                    .withState(RuleState.ENABLED);

                PutRuleResult ruleresponse = cwe.putRule(rulerequest);

                //*Add targets*

                    Target target = new Target()
                        .withArn(lambda-arn)
                        .withId(id).withInput(input);

                    PutTargetsRequest targetrequest = new PutTargetsRequest()
                        .withTargets(target)
                        .withRule(rule-name);

                    cwe.putTargets(targetrequest);

                    AWSLambda al = AWSLambdaAsyncClientBuilder.defaultClient();
          // *Add Permissions*              
                    AddPermissionRequest apr = new AddPermissionRequest()
                            .withFunctionName("function:yourfunctionname")
                            .withAction("lambda:InvokeFunction")
                            .withPrincipal("events.amazonaws.com")
                            .withStatementId(id)
                            .withSourceArn(arn);
                            al.addPermission(apr);