【问题标题】:Run AWS Lambda for multiple parameters one at a time on schedule按计划一次为多个参数运行 AWS Lambda
【发布时间】:2021-01-13 19:26:43
【问题描述】:

我有一个 lambda 函数,它接受一个参数,即 category_id,从 API 中提取一些数据,并根据响应更新数据库。

我必须每天间隔 1 分钟后为多个 ID 执行相同的 lambda 函数。 例如,在凌晨 12:00 为类别 1 运行 lambda,然后在凌晨 12:01 为类别 2 运行,然后为 500 多个类别运行一次。

实现这一目标的最佳解决方案是什么?
这是我目前的想法:

  • 使用 AWS SAM 编写 Lambda
  • 为共享依赖项添加 Lambda 层
  • 将 Lambda 附加到 AWS Cloudwatch Events 以按计划运行
  • 为 lambda 中的 category_id 添加环境变量
  • 更新 SAM 模板以一次又一次地使用相同的 lambda 函数,但只会在 Cron 表达式计划和环境变量 category_id 的值中发生变化

上述解决方案中的问题:

  • 账户中的 Lambda 函数数量将增加。
  • 每个 Lambda 都将附加一个 Cloudwatch 事件,因此其数量也会增加
  • 每个帐户的配额限制为最多 300 个 Cloudwatch 事件(尽管我们可以请求支持以提高该限制)
  • 由于 SAM 模板大小限制以及每个模板的资源数量最多为 200,因此需要使用嵌套堆栈。
  • 我将只能为每个嵌套堆栈创建 50 个 Lambda 函数,这意味着嵌套堆栈的数量也会增加,因为 1 lambda = 4 个资源(Lambda + Role + Rule + Event)

其他解决方案(不确定是否可以使用):

  • 阶梯函数的使用
  • 仅使用 Cron Schedule 触发第一个 Lambda 函数,并使用当前 lambda 为下一个类别调用 Lambda(只需要一个 CloudWatch 事件来调用第一个类别的函数,但时间差会有所不同,即下一个 lambda 将不会恰好在之后执行一分钟)。
  • 仅使用一个 Lambda 和一个 Cloud Watch 调度事件,Lambda 函数将具有所有类别 ID 的列表,并且该函数将通过一次使用一个类别 ID 并从列表中删除使用类别 ID 来递归调用自身(唯一的问题是,对于列表中的下一个 category_id,lambda 不会在一分钟后准确执行)

期待听到最佳解决方案。

【问题讨论】:

  • 它是每分钟调用一次相同的Lambda函数(使用不同的参数),还是需要调用不同的Lambda函数每次?
  • 为什么需要每分钟调用一次?如果 Lambda 函数的执行时间超过一分钟怎么办?或者,如果运行一个函数只需要 30 秒,是否可以立即启动下一个类别,而不必等待下一分钟? Lambda 函数中是否有任何限制或瓶颈阻止它们同时运行(例如,所有函数都试图使用同一个数据库)?
  • 相同的 lambda 具有相同的实现逻辑,只是每次自动执行时的参数不同。
  • One Lambda 函数的执行时间不到 30 秒,因为第三方 API 不允许连续 API 调用并阻止请求,因此需要每分钟调用一次。所以要延迟下一个 API 调用,它需要延迟执行,显然,我们不能在同一个 lambda 中添加 sleep 语句,因为 lambda 中的 sleep 语句仍然需要执行时间,而且 lambda 超时限制不允许太多类别。
  • @JohnRotenstein 拥有 500 多个具有不同静态输入的预定事件会很好吗?

标签: amazon-web-services aws-lambda aws-serverless aws-sam


【解决方案1】:

我建议使用标准的 Worker 模式:

  • 创建 Amazon SQS 队列
  • 配置 AWS Lambda 函数,使其在消息发送到 SQS 队列时触发运行
  • 在午夜触发一个单独的进程(例如另一个 Lambda 函数)将 500 条消息发送到 SQS 队列,每条消息都有不同的类别 ID

这将导致 Amazon SQS 函数执行。如果您只想随时运行其中一个 Lambda 函数(没有并行执行),将函数的并发限制设置为 1,以便在任何时候都只运行一个。当一个函数完成时,Lambda 会自动从队列中抓取另一条消息并开始执行。在函数的执行之间几乎不会有“浪费时间”。

【讨论】:

  • 看起来是一个很有前途的解决方案,但是,一次消息的批次之间需要延迟。我们可以使用 SQS 延迟队列来延迟 lambda 对每条消息的消费吗? SQS延迟队列会不会增加一些等待时间的成本?
  • 否,SQS 队列上的延迟配置不适用于 Lambda 触发器。 Lambda 执行之间需要多少间隔?
  • 如果每个 lambda 执行时间不同,则所需的间隙应该是自动随机的,但是,它可以是 20 秒到 40 秒。
  • 由于您的其他很棒的答案增加了一些相关成本,您是否也可以将其添加到此答案中?
  • 这并不容易。如果您要使用基本的 128MB Lambda 函数 500 x 30 秒,则大约是 3c,加上 API 成本(非常少)。 Amazon SQS 专为数百万条消息而设计,因此 500 条消息几乎没有任何成本(500 x 3 API 调用来创建、检索和删除)。因此,从成本的角度来看,Lambda 似乎比 EC2 更便宜,但它是一个更复杂的解决方案。
【解决方案2】:

鉴于您正在进行大量处理,Amazon EC2 实例可能更合适。

如果带宽要求较低(例如,如果它只是进行 API 调用),那么 T3a.micro(每小时 0.0094 美元)甚至 T3a.nano 实例(每小时 0.0047 美元)可能会非常划算。

在实例上运行的脚本可以处理一个类别,然后在一个大循环中休眠 30 秒。在一分钟内运行 500 个类别,每个类别大约需要 8 小时。每天不到 10 摄氏度!

当工作完成后,实例可以停止或自行终止。见:Auto-Stop EC2 instances when they finish a task - DEV Community

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2019-02-13
    • 2021-08-15
    • 2021-06-11
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多