amazon-web-services - 使用 API Gateway 防止 Lambda 中的意外无限循环
问题描述
我有一个由 API Gateway 触发的 Lambda 函数。
根据请求参数,此函数可能会调用另一个 API 端点。
其他 API 端点的 URL 通过请求中的参数传递。
因此,例如,我可以这样调用我的端点:
因此,Lambda 函数将在某个时候调用另一个 API:https ://api.example.com/
在调用其他 API 之前,我的真实函数有一些复杂的逻辑,但你明白了。
在某些情况下,函数会调用自己的端点(递归),但是传递不同的参数来处理一些逻辑,这样就不会造成死循环。
但是可能有人不小心把参数配置错了,导致死循环,导致函数每小时被调用数百万次,导致AWS收费居高不下。
如何防止此 Lambda 函数导致意外无限循环并避免巨额 AWS 账单?
解决方案
以下是我目前发现的一些选项:
1 - 在 API Gateway 中启用限制:
2 - 为 Lambda 函数配置适当的预留并发:
3 - 使用自定义 HTTP 标头限制调用链长度
您可以使用自定义 HTTP 标头(例如“CALL_CHAIN_LENGTH”)来计算调用链长度并将其发送到后续 API 调用。
在函数的开头,检查此标头是否存在。如果不存在,则将其设置为 1。如果存在,则将该值增加 1 并在任何后续 API 调用之前将其发送到 HTTP 标头中。如果该值大于已售出的值,则停止函数并返回错误(例如 HTTP 错误 429 - Too Many Requests)。
4 - 如果可能,在调用之前验证 API URL
这取决于应用程序,但如果函数逻辑很简单,您可以通过检查端点 URL 和参数来检查它是否会导致无限循环。
5 - 使用 CloudWatch 监控 Lambda 调用的数量
此外,您可以创建警报并发送电子邮件,以防您的 lambda 在一段时间内被调用超过 ax 次。
推荐阅读
- talend - 使用数据生成 Talend 序列
- javascript - 从节点 JavaScript 返回到 jQuery 的 Ajax 调用落在错误函数上
- c++ - c++11中如何检查类成员指针是类还是结构类型?
- java - java - 如何在按钮上获得鼠标按下事件
- angular - a2e datetimepicker - Datetimepicker 不会显示在输入焦点和单击图标上
- oracle - 如何读取csv数据并插入数据库
- python - Scapy - 从 pcap 中删除 Dot1q (801.2 Q)
- sql - 在打字稿中,如何像 MSSQL 的“order by”子句一样对 * 、 + - 等特殊字符进行排序
- powershell - 在 powershell 中为 ask-CLI 命令动态输入
- python - K-Means 在第一列是用户名(字符串)和第二列是 ID(整数)的数据集上进行 ID 聚类