【问题标题】:Prevent accidental infinite loop in Lambda with API Gateway使用 API Gateway 防止 Lambda 中的意外无限循环
【发布时间】:2021-05-21 23:41:14
【问题描述】:

我有一个由 API Gateway 触发的 Lambda 函数。

根据请求参数,此函数可能会调用另一个 API 端点。

其他 API 端点的 URL 在请求中通过参数传递。

因此,例如,我可以这样调用我的端点:

https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/my-function?other-api-endpoint=https://api.example.com/

因此,Lambda 函数将在某个时候调用另一个 API:https://api.example.com/

我的真实函数在调用其他 API 之前有一些复杂的逻辑,但你明白了。

在某些情况下,函数会调用自己的端点(递归),但是传递不同的参数来处理一些逻辑,这样就不会造成死循环。

但是可能有人不小心把参数配置错了,导致死循环,导致函数每小时被调用数百万次,导致AWS收费居高不下。

如何防止这个 Lambda 函数导致意外的无限循环并避免巨额 AWS 账单?

【问题讨论】:

  • 为什么不在调用自身之前验证参数?
  • 如果您可以完全控制代码和 API 调用,则在每次调用中包含一个递减的生存时间 (TTL) 参数。当它达到 0 时,停止。
  • @jarmod 你能提供更多关于如何实现它的细节吗?您的意思是在后续 API 调用中将此 TTL 值作为 HTTP 标头发送吗?
  • 它可能只是 HTTP API 请求上的查询参数,例如?id=21&ttl=3.

标签: amazon-web-services aws-lambda aws-api-gateway infinite-loop


【解决方案1】:

以下是我目前找到的一些选项:

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 在一段时间内被调用超过 x 次。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2021-01-16
    • 1970-01-01
    • 2015-03-22
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多