有没有办法在动态计时器上触发AWS Lambda?目前,我正在使用计划事件来触发lambda,但这是一个设置的计时器。有没有一种方法可以动态设置从Lambda内部触发Lambda的时间?
这里的想法是,此Lambda进行特定的检查并执行代码以知道下一步应在何时运行(因为我只希望此Lambda在需要时运行)。我想1)确定下次需要运行的时间,以及2)从Lambda代码中设置时间。
我看到有很多资源可用于触发Lambda函数(SNS,Kinesis等),但是我似乎找不到一种动态启动的好方法。
这可以通过设置CloudWatch事件规则来触发Lambda函数来完成。每次调用Lambda函数时,该函数将需要确定其下一次运行时间并适当地修改事件规则。
var AWS = require("aws-sdk"); exports.handler = function(event, context) { var cloudwatchevents = new AWS.CloudWatchEvents(); var intervals = Array(3, 5, 7); var nextInterval = intervals[Math.floor(Math.random()*intervals.length)]; var currentTime = new Date().getTime(); // UTC Time var nextTime = dateAdd(currentTime, "minute", nextInterval); var nextMinutes = nextTime.getMinutes(); var nextHours = nextTime.getHours(); // ================================= // DO YOUR WORK HERE // ================================= var scheduleExpression = "cron(" + nextMinutes + " " + nextHours + " * * ? *)"; var params = { Name: "YOUR CLOUDWATCH EVENT RULE NAME", ScheduleExpression: scheduleExpression }; cloudwatchevents.putRule(params, function(err, data) { if (err) { console.log(err, err.stack); } else { console.log(data); } }) }; var dateAdd = function(date, interval, units) { var ret = new Date(date); // don't change original date switch(interval.toLowerCase()) { case 'year' : ret.setFullYear(ret.getFullYear() + units); break; case 'quarter': ret.setMonth(ret.getMonth() + 3*units); break; case 'month' : ret.setMonth(ret.getMonth() + units); break; case 'week' : ret.setDate(ret.getDate() + 7*units); break; case 'day' : ret.setDate(ret.getDate() + units); break; case 'hour' : ret.setTime(ret.getTime() + units*3600000); break; case 'minute' : ret.setTime(ret.getTime() + units*60000); break; case 'second' : ret.setTime(ret.getTime() + units*1000); break; default : ret = undefined; break; } return ret; }
您应该可以将自己的随机决定与自己的计划逻辑交换,并插入所需的任何内容代替我的评论。
您需要在我的代码段中将事件规则的名称替换为“您的CLOUDWATCH事件规则名称”。
博客的一个大问题:动态调度下一个运行时的AWS Lambda函数