当前位置:  开发笔记 > 编程语言 > 正文

您可以在动态计时器上触发AWS Lambda吗?

如何解决《您可以在动态计时器上触发AWSLambda吗?》经验,为你挑选了1个好方法。

有没有办法在动态计时器上触发AWS Lambda?目前,我正在使用计划事件来触发lambda,但这是一个设置的计时器。有没有一种方法可以动态设置从Lambda内部触发Lambda的时间?

这里的想法是,此Lambda进行特定的检查并执行代码以知道下一步应在何时运行(因为我只希望此Lambda在需要时运行)。我想1)确定下次需要运行的时间,以及2)从Lambda代码中设置时间。

我看到有很多资源可用于触发Lambda函数(SNS,Kinesis等),但是我似乎找不到一种动态启动的好方法。



1> Aaron Medacc..:

这可以通过设置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函数

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有