如何暂停/恢复 aws lambda 函数

Posted

技术标签:

【中文标题】如何暂停/恢复 aws lambda 函数【英文标题】:How to pause / resume a aws lambda function 【发布时间】:2016-10-24 15:05:42 【问题描述】:

例如,我有使用 KinesisStream 消息的 lambda 函数。如何停止和恢复该功能,这样我就不会产生费用,也不会丢失流中的数据。

我知道如果事件不断失败,Kinesis 会不断重试,成本可能会非常高。

我无法删除该函数,因为通过 CloudFormation 围绕它有很多自动化。有没有办法停止和重新启动该功能?

解决方案:http://alestic.com/2015/11/aws-lambda-kinesis-pause-resume

注意:无法使用事件源禁用规则、日志流的事件源。使用 SDK 调用 API 时,您不会在列表中获取它。对于那些您必须禁用事件规则或日志订阅的人。

【问题讨论】:

您使用别名和版本控制还是您的 lambda 函数? 您是否担心在部署新的 lambda 版本期间发生的事件? 更新已部署的 lambda 函数应该是原子操作。所有请求都应该转到旧版本中的代码,直到完全部署新版本。不应有无效的中间期。您是在尝试解决实际观察到的问题,还是在尝试避免感知/潜在问题? 我正在使用别名,我担心飞行中的事件,但更具体地说,我担心我必须关闭 lambda 以解决代码问题或数据库问题,例如增加 DynamoDB 上的配置,其中数据库在几秒钟(如果不是几分钟)内变得不可用。假设有人检查了一个错误计算分析的代码错误,我需要将 lambda 降低 3 天,因为修复该问题需要很长时间。 【参考方案1】:

AWS 上更新的 Lambda 控制台现在在 UI 中支持此功能。单击提供您的 lambda 函数的 Kinesis 流,切换底部的“启用/禁用”切换,然后保存。这基本上会暂停/恢复您的功能。Screenshot - Toggling Kinesis input into Lambda

【讨论】:

【参考方案2】:

让我们先谈谈 Kinesis。当您从流中提取记录时,Kinesis 不会“删除”这些记录,直到您“检查点”流。您可以一遍又一遍地阅读相同的记录,直到您向 Kinesis 确认您不再需要它们为止。

AWS Lambda 在函数完成执行且没有错误之前不会检查点流。 (context.success())

如果您部署了一个 Lambda 函数并且它以某种方式被破坏(退出并出现异常/错误),则 Lambda 函数将不会检查点流,并且您的记录将一直保留在流中,直到保留期到期( 24 小时,默认情况下)。然后可以在后续的 Lambda 执行中读取“未检查点”记录。

在部署期间,同样适用。任何当前正在执行的被中断的 Lambda 都不会对流进行检查点,并且任何当前正在执行的成功完成的 Lambda 都将按照您的预期进行检查点。

【讨论】:

所以,如果代码抛出异常并且我想防止因大量事件失败而产生费用。我该怎么办?我想阻止 Lambda 运行,但我希望消息保留在 Kinesis 流中,直到我解决问题为止。我知道我可以增加 Kinesis 流的保留期,但如何停止我的 Lambda 函数。我无法删除它,因为它们附加了大量的工件,这些工件是使用 CloudFormation 创建的。 @VAM,为了防止在中断期间产生费用,您应该禁用 Lambda。消息将毫无问题地保留在流中。您不必删除 Lambda,但可以禁用触发 Lambda 的事件。为您的 Lambda 错误指标设置 CW 警报,并在达到阈值时禁用它(也发送通知)。 根据您的帖子,我搜索并找到了这个:alestic.com/2015/11/aws-lambda-kinesis-pause-resume。你的答案是正确的。

以上是关于如何暂停/恢复 aws lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停 setInterval() 函数?

如何暂停线程池、运行函数和恢复?

暂停和恢复 std::thread 的正确方法

如何暂停和恢复 UIDynamicAnimator 物理模拟

我如何在python中暂停录制屏幕

如何暂停/恢复 avplayer 预加载