我试图弄清楚5小时后调用aws lambda函数的最佳方法是什么。我有另一个lambda函数可以发出多个检索作业来从aws冰川中取出物品,我需要一个解决方案,一旦它们被检索,就会对每个物品运行另一个lambda函数,大约5个小时。我正在考虑使用sns但是想知道是否还有其他方法。任何意见都表示赞赏。
答案 0 :(得分:6)
除了使用CloudWatch之外,另一种有趣的方法是使用AWS Step Functions:
通过设置固定时间段(或者如果向状态机提供输入数据,甚至是动态时间段)来使用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
}
}
}
或者您可以在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请求服务。