【问题标题】:AWS CloudWatch Schedule + Lambda: trigger not workingAWS CloudWatch Schedule + Lambda:触发器不起作用
【发布时间】:2017-05-18 02:16:45
【问题描述】:

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

1 编辑:分辨率

计时器用于 lambda 以 http 访问 ElasticSearch 服务。我们的 ElasticSearch 服务没有响应,我们不得不重新创建它。在我们重新创建 ElasticSearch 服务后,计时器开始工作......虽然计时器工作,但在控制台中,我开始看到我的计时器被骗了。在我关闭计时器后,它又创建了它自己的另一个副本。看起来像一个错误的用户界面。我正在使用 Chrome。

【问题讨论】:

  • 只是为了排除记录器的问题 -- 如果您进入 Lambda 管理控制台并单击“监控”选项卡 -- 您是否看到任何调用或错误?
  • @DaveMaple:您好,在“监控”下,我看到了图表,还有这条消息“此函数包含外部库。上传新文件将覆盖这些库。” ,但没有错误。
  • 您是否在图表中每 5 分钟看到一次调用?
  • @DaveMaple:不是每 5 分钟一次,我只能说调用有一个高峰,持续时间也有一个高峰,但我认为这仅用于我的初始测试。从那以后我刷新了,图表没有改变。

标签: java aws-lambda


【解决方案1】:

我过去遇到过这个问题,可能还有另一种方法可以解决这个问题,但我是如何做到的,我为创建的规则(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 规则,但使用给定的角色。

【讨论】:

  • 非常感谢您的推荐。在我们重新创建其中一项服务后,计时器开始自行工作,请参阅上面的描述。不过还是谢谢你,我会记住你的帖子,一旦我们确定了我们在 aws 中所有内容的权限,我可能仍然需要使用它。
  • 该策略文档与 AWS 管理的“AWSLambdaRole”策略相同 - 因此在第 3 步中,您可以附加该“AWSLambdaRole”(并跳过第 1 步)。
【解决方案2】:

如果您正在做的情况是通过 java sdk,这里是您将 lambda 作为 CW 的目标后的解决方案。

AddPermissionRequest addPermissionRequest = new AddPermissionRequest(); addPermissionRequest.setStatementId("12345ff"); //唯一标识您的权限的方法 addPermissionRequest.withSourceArn(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

【讨论】:

    【解决方案3】:
    //*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);
    

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2018-02-26
      • 1970-01-01
      • 2019-06-25
      • 2022-11-03
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多