几小时延迟调用lambda函数

Cal*_*vin 5 aws-lambda

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

Ioa*_*kos 11

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

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

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

exports.handler =  async function(event, context) {
  throw new Error('Go back to the waiting queue and wait');
}
Run Code Online (Sandbox Code Playgroud)

执行队列:将执行队列作为触发器添加到您的 Lambda(您要调度)。

然后,要安排您的 lambda,您只需将消息发布到等待队列。

消息将进入等待队列,在那里它将被错误输出 lambda 使用。它将 tgen 放在等待队列中,直到其可见性超时,并将被推送到死信执行队列以供您计划的 lambda 提取。


s.h*_*sse 8

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

  1. 通过设置固定周期(或者如果向状态机提供输入数据,甚至是动态周期)来使用等待状态:

    {
      "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
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,您可以在任务状态中使用单独的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:CheckJob",
          "End": true
        }
      } 
    }
    
    Run Code Online (Sandbox Code Playgroud)