终止 AWS Lambda 函数的上下文

Pab*_*ola 2 java amazon-web-services aws-lambda aws-step-functions

我有一个 AWS Lambda 函数,当它出现特定错误时,我需要终止它的上下文,因为如果上下文与上次调用相同,再次调用该错误将使 Lambda 函数无法正常工作。

根据我的理解,如果我抛出一个新的,RuntimeException它应该杀死上下文,但它并没有这样做。

知道如何从代码内部杀死上下文吗?

public class IncorrectFileExtensionException 
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道 Lambda 函数上下文没有被破坏/杀死,因为在我下次调用它时抛出该自定义运行时异常后,它使用相同的上下文,我可以确认这一点,因为它使用相同的 CloudWatch 日志流并且不再执行冷启动。

我需要实现的是杀死该调用的 Lambda 函数上下文,并使其在下次冷启动时启动。

Joh*_*y C 6

您无法通过控制台/api 或从函数内部手动终止执行环境(lambda 实例)。

从代码中抛出异常(或将错误传递给回调(e))只会产生一个调用错误,该错误会在cloudwatch中记录和报告。没有办法抛出“致命”错误,AWS 不会为您区分函数错误。相同的执行环境将被重复使用,直到它闲置一段不确定的时间或 aws 决定因其他原因终止它为止。对于函数超时也是如此。

因此,您主要关心的应该是确保错误不会使您的函数代码进入不可恢复的状态。Lambda 调用至少在函数结果不应该依赖于执行环境状态的意义上是幂等的。

也就是说,当事情变得混乱时,你可以使用一些技巧。

  1. 节流。您可以将函数的保留并发性减少到零,这将导致 aws 不会向您当前的任何执行环境传递新的调用。副作用当然是你的 lambda 函数无法访问,所以在生产中这样做是非常禁忌的。但最终解除限制应该会导致创建新的执行环境。当您的 lambda 处于错误阻止其处理的事件的失败/重试循环中时,这特别有用。
  2. 如果您要调用特定的函数别名,则可以发布函数的新版本并将别名移动到指向新版本。执行环境对于函数版本是唯一的。如果已经存在比有问题的版本更新的版本,这可能会产生意想不到的副作用,因为 lambda 版本控制是线性的并且无法分支。
  3. 如果您有效地调用 $LATEST,无论是通过别名还是不指定版本/别名,对 lambda 代码或配置(环境变量、内存限制、超时等)的任何更改都将导致所有当前执行环境接收不到新请求。

2 和 3 的明显问题是,在负载下的实际环境中,这会导致大量的冷启动损失,因为突然没有热执行环境来处理请求。