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