我有一个lambda,它在S3中创建一个对象时运行,在某些情况下我需要重新安排这个lambda,让我们说15分钟后。
当我的lambda第二次运行时,我需要有相同的事件参数,我不介意其他字段而不是桶和路径。
event.Records[0].s3.bucket.name
event.Records[0].s3.object.key
。但是很容易有event
我的另一种方法是将这些数据保存在发电机中,并且每隔15分钟就会有另一个从那里读取的lambda(糟糕)。
但重新安排我当前的函数并将相同的参数传递给它会更好。 像这样:
exports.handler = (event, context, callback) => {
if(xyz)
reschedule(15 * 1000 * 60, 'ThisLambdaName', event, context);
}
像setTimeout这样的东西,但没有AWS为这15分钟充电我。
答案 0 :(得分:5)
您可以将DynamoDB与TTL,DynamoDB Streams和AWS Lambda一起使用。
将数据保存在DynamoDB中,并将TTL设置为15分钟后。
当达到项目的TTL时,它将创建一个DynamoDB流,然后您可以使用该流来再次使用原始数据触发原始功能。您很可能必须在处理程序中进行一些更改,以便以不同方式处理来自S3和DynamoDB Streams的事件。
参考文献:
答案 1 :(得分:1)
这是一个老问题,但目前唯一的答案是误导。利用带有TTL的DynamoDB并不好,因为根据AWS documentation,在删除过期项目之前可能需要长达48小时,因此根据用例,lambda函数可能会延迟执行几天。
有几种简单的解决方案可供选择。
1)在由S3触发的lambda函数中,将事件放在SQS delay queue上。请注意,消息可用之前的最长延迟时间为15分钟。
2)在S3触发的lambda函数中,使用CloudWatch Events PutRule API并创建一个在给定时间执行lambda函数的规则。确保delete the rule一旦处理完毕,因为每个区域的软限制为100条规则。