Aws lambda 以小时延迟调用lambda函数

Aws lambda 以小时延迟调用lambda函数,aws-lambda,Aws Lambda,我试图找出5小时后调用aws lambda函数的最佳方法。我有另一个lambda函数,它会发出多个检索作业来从aws glacier中抓取项目,我需要一个解决方案,在每个项目被检索后运行另一个lambda函数,这大约需要5个小时。我在考虑使用sns,但想知道是否还有其他方法可以做到这一点。欢迎任何输入。理想的方法是使用CloudWatch事件调度Lambda函数。除了使用CloudWatch之外,请查看关于相同的的更多详细信息,在您的案例中,另一个有趣的方法是使用: 通过设置固定周期(或者如果向

我试图找出5小时后调用aws lambda函数的最佳方法。我有另一个lambda函数,它会发出多个检索作业来从aws glacier中抓取项目,我需要一个解决方案,在每个项目被检索后运行另一个lambda函数,这大约需要5个小时。我在考虑使用sns,但想知道是否还有其他方法可以做到这一点。欢迎任何输入。

理想的方法是使用CloudWatch事件调度Lambda函数。除了使用CloudWatch之外,请查看关于相同的

的更多详细信息,在您的案例中,另一个有趣的方法是使用:

  • 通过设置固定周期(或者如果向状态机提供输入数据,则使用动态周期):

  • 或者,您可以在组合中使用单独的Lambda函数,该函数将在循环中检查另一个函数是否应运行:

    {
      "Comment": "A state machine that submits a Job to AWS Batch and monitors the Job until it completes.",
      "StartAt": "Wait X Seconds",
      "States": {
        "Wait X Seconds": {
          "Type": "Wait",
          "SecondsPath": "$.wait_time",
          "Next": "Get Job Status"
        },
        "Get Job Status": {
          "Type": "Task",
          "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:CheckJob",
          "Next": "Job Complete?"
        },
        "Job Complete?": {
          "Type": "Choice",
          "Choices": [
            {
              "Variable": "$.status",
              "StringEquals": "RUNNING",
              "Next": "Wait X Seconds"
            },
            {
              "Variable": "$.status",
              "StringEquals": "SUCCEEDED",
              "Next": "Do Job"
            }
          ],
          "Default": "Wait X Seconds"
        },
        "Do Job": {
          "Type": "Task",
          "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:DoJob",
          "End": true
        }
      } 
    }
    

  • 我觉得基于cloudwatch和step函数的解决方案不能很好地扩展,而且它们在代码方面非常繁重

    我建议创建两个SQS队列。一个是等待队列,另一个是执行队列

    等待队列: 将执行队列设置为等待队列的死信队列。 将默认可见性超时设置为运行lambda所需的等待时间(最多12小时)。 将最大接收设置为1。 创建使用SQS消息并返回错误的Lambda。将等待队列作为触发器添加到此lambda

    exports.handler =  async function(event, context) {
      throw new Error('Go back to the waiting queue and wait');
    }
    
    执行队列: 将执行队列作为触发器添加到Lambda(您要调度的)

    然后,要安排lambda,只需向等待队列发送一条消息


    消息将进入等待队列,在那里它将被错误输出lambda消耗。它将一直处于等待队列中,直到可见性超时,并将被推到死信执行队列中,由计划的lambda接收。

    如果您愿意使用AWS生态系统之外的解决方案,请查看使用Google Cloud Tasks API构建的通用延迟http请求服务

    5小时是一个常数,还是您希望运行取决于其他lambda函数输出?它应该是常数,而不依赖于其他lambda输出。Deal设计将使用CloudWatch事件。我在答复中补充了细节
    exports.handler =  async function(event, context) {
      throw new Error('Go back to the waiting queue and wait');
    }