几小时延迟调用lambda函数

时间:2017-10-23 20:22:02

标签: aws-lambda

我试图弄清楚5小时后调用aws lambda函数的最佳方法是什么。我有另一个lambda函数可以发出多个检索作业来从aws冰川中取出物品,我需要一个解决方案,一旦它们被检索,就会对每个物品运行另一个lambda函数,大约5个小时。我正在考虑使用sns但是想知道是否还有其他方法。任何意见都表示赞赏。

4 个答案:

答案 0 :(得分:6)

除了使用CloudWatch之外,另一种有趣的方法是使用AWS Step Functions

  1. 通过设置固定时间段(或者如果向状态机提供输入数据,甚至是动态时间段)来使用wait state

    {
      "Comment": "An example of the Amazon States Language using wait states",
      "StartAt": "WaitState",
      "States": {
        "WaitState": {
          "Type": "Wait",
          "Seconds": 10,
          "Next": "MyLambda"
        },
        "MyLambda": {
          "Type": "Task",
          "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
          "End": true
        }
      }
    }
    
  2. 或者您可以在task state中使用单独的Lambda函数并结合choice state,如果另一个函数应该运行,则会检查循环:

    {
      "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:CheckJob",
          "End": true
        }
      } 
    }
    

答案 1 :(得分:0)

理想的方法是使用CloudWatch事件安排Lambda函数。请参阅同一here

的详细信息

答案 2 :(得分:0)

我觉得基于云监视和步进功能的解决方案扩展性不佳,并且在代码方面非常繁琐。

我建议创建两个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提取。

答案 3 :(得分:0)

如果您愿意在AWS生态系统之外使用解决方案,请签出https://delayedrequest.com,这是使用Google Cloud Tasks API构建的通用延迟http请求服务。