首页 > 解决方案 > 终止 AWS Lambda 函数的上下文

问题描述

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

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

知道如何从我的代码中杀死上下文吗?

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

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

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

标签: javaamazon-web-servicesaws-lambdaaws-step-functions

解决方案


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

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

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

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

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

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


推荐阅读