aws cloudwatch schedule+lambda:触发器不工作

brccelvz  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(318)

我已经设置了一个简单的lambda函数,以便在使用javajar文件执行时打印出一行文本。我可以用“test”按钮运行a测试。我还设置了一个5分钟cloudwatch调度触发器,调度表达式:rate(5分钟)。触发器已启用。我可以查看触发器,并在“编辑”中确认触发器已分配给我的函数,并且它将使用静态json作为输入。出于某种原因,我的函数似乎没有被触发我的5分钟触发器-我期待看到一些日志的触发器,但没有任何东西。我正在使用这个记录器:com.amazonaws.services.lambda.runtime.lambdalogger。我想知道是否有另一个设置我不知道,需要设置,以使触发器工作。谢谢你抽出时间。

1编辑:分辨率

计时器用于lambda将http转换为elasticsearch服务。我们的elasticsearch服务变得毫无React,我们不得不重新创建它。重新创建elasticsearch服务后,计时器开始工作。。。虽然计时器可以工作,但在控制台中,我开始看到计时器的重复。在我关掉定时器后,它又复制了一个。看起来像一个错误的用户界面。我用的是chrome。

bq9c1y66

bq9c1y661#

如果您所做的是通过javasdk,那么下面是将lambda作为cw的目标之后的解决方案。
addpermissionrequest addpermissionrequest=新建addpermissionrequest();addpermissionrequest.setstatementid(“12345ff”)//您的权限的唯一标识方式addpermissionrequest.with资源注册(rulearn);addpermissionrequest.setaction(“lambda: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
lg40wkob

lg40wkob2#

//*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);
zsohkypk

zsohkypk3#

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

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

我不知道如何通过控制台/web界面执行此操作。但是您可以通过aws命令行接口rule put rule来完成。所以你需要:
使用上述文档创建策略
为cloudwatch规则创建角色
将在步骤1中创建的策略附加到在步骤2中创建的角色
像以前一样创建cloudwatch规则,但使用给定的角色。

相关问题