如何暂停/恢复AWS Lambda函数

20

例如,我有一些从Kinesis Stream中获取消息的lambda函数。如何停止和恢复函数,以便我不会产生费用,也不会丢失数据。

我知道如果事件持续失败,Kinesis将继续重试,这可能会导致成本非常高。

我不能删除该函数,因为通过CloudFormation周围有很多自动化。有没有一种方法可以停止和重新启动该函数?

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

注意: 规则和日志流的事件源无法使用事件源禁用。当使用SDK调用API时,您甚至无法在列表中找到它。对于这些情况,您必须禁用事件规则或日志订阅。


1
你在Lambda函数中使用别名和版本控制吗? - arjabbar
1
你是否担心在部署新的 Lambda 版本时正在进行中的事件? - Shibashis
更新已部署的 Lambda 函数应该是一个原子操作。在新版本完全部署之前,所有请求都应该发送到旧版本的代码中。不应该存在任何无效的中间状态。您是试图解决一个实际观察到的问题还是试图避免一个被认为存在或潜在的问题? - Michael - sqlbot
我正在使用别名,但我担心正在运行的事件,更具体地说,我担心停电,因为我必须关闭Lambda以修复代码问题或数据库问题,例如增加DynamoDB上的预配,如果数据库在几秒钟甚至几分钟内变得无法使用。假设有人提交了一个代码错误,导致分析计算错误,我需要关闭Lambda三天,因为修复问题需要很长时间。 - victor m
2个回答

12

更新后的AWS Lambda控制台现在在UI中支持此功能。单击Kinesis流喂养您的Lambda函数,切换底部的“启用/禁用”开关,然后保存。这将基本上暂停/恢复您的函数。截图-切换Kinesis输入到Lambda


7
让我们谈谈Kinesis。当您从流中拉取记录时,除非您“检查点”流,否则Kinesis不会“删除”这些记录。您可以一遍又一遍地阅读相同的记录,直到您向Kinesis确认您不再需要它们。
AWS Lambda在函数执行完成且没有错误(context.success())时,才会检查点流。
如果您部署的Lambda函数存在某种问题(以异常/错误退出),则Lambda函数将不会检查点流,并且您的记录将保留在流中,直到保留期过期(默认为24小时)。然后可以在随后的Lambda执行中读取“未检查点”的记录。
在部署期间,同样适用此规则。任何当前正在执行被中断的Lambda都不会检查点流,而任何当前正在成功执行的Lambda都将按照您的期望进行检查点。

那么,如果代码抛出异常并且我想防止大量事件失败的收费,我该怎么办?我想停止Lambda的运行,但我希望消息保留在Kinesis流中,直到我解决问题。我知道我可以增加Kinesis流的保留期,但如何停止我的Lambda函数呢?我不能删除它,因为有大量使用CloudFormation创建的工件附加到它们上面。 - victor m
@VAM,为了避免停电时产生的费用,您应该禁用Lambda。消息将在流中保留,不会出现问题。您无需删除Lambda,但可以禁用触发Lambda的事件。对您的Lambda的错误指标设置CW警报,并在达到阈值时禁用它(发送通知也可以)。 - devonlazarus
1
根据您的帖子,我进行了搜索并找到了这个链接:https://alestic.com/2015/11/aws-lambda-kinesis-pause-resume/。您的答案是正确的。 - victor m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接