终止 AWS Lambda 函数的上下文

Kill the context of an AWS Lambda function

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

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

知道如何从我的代码中删除上下文吗?

public class IncorrectFileExtensionException 
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}

我知道 Lambda 函数上下文没有得到 destroyed/killed 因为在我下次调用它时抛出自定义运行时异常后它使用相同的上下文,我可以确认这是使用相同的 CloudWatch 日志流,它不再进行冷启动。

我需要实现的是终止该调用的 Lambda 函数上下文,并在下次冷启动时启动它。

您不能通过 console/api 或从您的函数中手动终止执行环境(lambda 实例)。

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

所以您主要关心的是确保错误不会将您的函数代码置于不可恢复状态。 Lambda 调用至少在某种意义上是幂等的函数的结果不应该依赖于执行环境的状态。

就是说,当事情变得一团糟时,您可以使用一些技巧。

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

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