按计划一次为多个参数运行 AWS Lambda

Muh*_*nan 1 amazon-web-services aws-lambda aws-serverless aws-sam

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

我必须每天间隔 1 分钟后对多个 Id 执行相同的 lambda 函数。例如,在中午 12:00 为类别 1 运行 lambda,然后在上午 12:01 为类别 2 运行 lambda,等等,为 500 多个类别运行 lambda。

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

  • 使用 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 + 角色 + 规则 + 事件)

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

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

期待听到最佳解决方案。

Joh*_*ein 6

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

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

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