【问题标题】:Lambda Function exits unsuccessfullyLambda 函数退出失败
【发布时间】:2020-07-21 10:03:05
【问题描述】:

我在创建具有 JWT 令牌验证主要功能的 Java Lambda 函数时遇到了一个奇怪的问题。我现在正在使用 terraform 创建 lambda 并将我的 Jar 文件上传到 s3。下面是令牌验证块

public boolean validate(String token) throws Exception {

    try {

        Jws<Claims> claims = Jwts.parser().setSigningKey("mysigningkey").parseClaimsJws(token);

        if (claims.getBody().getExpiration().before(new Date())) {

            throw new Exception("Token expired");
        }

        return true;

    } catch (JwtException | IllegalArgumentException e) {

        throw new InvalidJwtAuthenticationException("Some exception");
    }
}

这行导致问题

Jws<Claims> claims = Jwts.parser().setSigningKey("mysigningkey").parseClaimsJws(token);

我已将 ExceptionError 放在 catch 块中,但它没有打印任何消息。但是这条线无法执行。我尝试使用相同的 Jar 文件在 AWS 控制台中手动创建函数,并且相同的代码运行良好。

知道这种行为吗?或者任何调试策略?在云监视日志上,它只是打印了执行不成功,并且没有其他特定的错误消息。

以下消息将写入 Cloudwatch 日志:

REPORT RequestId: ####### Duration: 1835.00 ms Billed Duration: 1900 ms Memory Size: 512 MB Max Memory Used: 93 MB Init Duration: 349.72 ms 

超时设置为 3 秒

【问题讨论】:

  • 请解释一下实际发生了什么?您在哪里看到错误?你怎么知道它不起作用?另外,请考虑这是否真的与 Terraform 有关。这个问题可以更笼统吗?
  • 我在 Lambda 控制台中看到了日志。它没有在我上面提到的那一行之后执行。没有具体的错误,但它只是打印执行不成功。无论如何,我找到了原因并修复了它。它与terraform无关。解释在下面作为答案给出
  • 从您的回答看来,您似乎在 Cloudwatch 日志中获得了一些信息(内存和时间)。请提供这个
  • REPORT RequestId:####### 持续时间:1835.00 毫秒计费持续时间:1900 毫秒内存大小:512 MB 使用的最大内存:93 MB 初始化持续时间:349.72 毫秒超时设置为 3 秒跨度>

标签: java aws-lambda


【解决方案1】:

这是由于超时问题。创建时 Lambda 的默认超时为 3 秒,因为令牌验证需要更多时间 Lambda 退出达到时间限制。将超时时间增加到 15 秒,它工作正常。但我没有在日志中看到任何错误消息,提示我这是因为超时

【讨论】:

  • 您无法以这种方式缓解冷启动。单个 Lambda 实例仅存活 15 分钟。您将在每个新实例或实例过期时(15 分钟后)获得冷启动。无论如何,更改内存配置可能会使当前的暖实例无效。
  • 你确定你没有达到 Lambda 超时吗?更高的内存分配具有为您提供更高规格的副作用。 EC2 实例,因此 CPU 处理速度更快,这可能意味着您的 Lambda 完成得更快。
  • 你减少了内存,它仍然有效。因此,问题与内存无关。
  • 是的,考虑到您的观点,我将超时时间增加到 15 秒,内存增加到 128 MB。那行得通,因此问题是超时而不是内存
  • 我同意这一点,这就是我们发现“实际问题”的方式:)
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多