Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 你能在动态定时器上触发AWS Lambda吗?_Amazon Web Services_Scheduled Tasks_Aws Lambda - Fatal编程技术网

Amazon web services 你能在动态定时器上触发AWS Lambda吗?

Amazon web services 你能在动态定时器上触发AWS Lambda吗?,amazon-web-services,scheduled-tasks,aws-lambda,Amazon Web Services,Scheduled Tasks,Aws Lambda,有没有办法在动态计时器上触发AWS Lambda?目前,我正在利用计划事件触发lambda,但这是一个设置的计时器。有没有办法动态设置Lambda从Lambda内部触发的时间 这里的想法是,这个Lambda执行特定的检查和执行代码,以知道它下一步应该何时运行(因为我只希望这个Lambda在需要时运行)。我想1)确定下一次需要运行的时间,2)从Lambda代码中设置时间 我看到有很多资源用于触发Lambda函数(SNS、Kinesis等),但我似乎找不到一种动态启动Lambda函数的好方法。您可以

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

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


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

您可以创建一个CloudWatch规则在特定时间运行。CloudWatch规则可以定期运行,也可以使用类似cron的语法来指定单个运行时。不过,您以后可能需要清理这些数据。

您可以按照计划继续执行lambda,但可以在数据存储(如DynamoDB或S3)中保留一个值,该值告诉lambda下次何时运行


lambda将定期执行,但您可以控制它何时实际执行其预期用途。这里有一些计费方面的考虑(lambda将继续在后台消耗最少的资源),但希望事情不会太失控。可能比试图从同一个lambda中管理触发器更简单

这可以通过设置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事件规则名称”


对于一个博客来说,这是一个很好的问题:

现在不用使用step函数进行轮询就可以完成。您可以找到有关的更多信息,但基本上您需要为step函数定义一个状态机,它使用
Wait
状态和
TimestampPath
字段。您的状态机可能最终看起来像

{
“SartAt”:“WaitState”,
“国家”:{
“等待状态”:{
“类型”:“等待”,
“timestampath”:“$.timestamp”,
“下一步”:“ExecuteLambda”
},
“ExecuteLambda”:{
“类型”:“任务”,
“资源”:“lambda arn”,
“结束”:没错,
“重试”:[
{ ... },
...
]
}
}
假设您使用的是Node,则可以使用以下代码调用step函数:

const AWS=require('AWS-sdk');
const stepFunctions=新的AWS.stepFunctions();
等待stepFunctions.startExecution({
StateMachiner:process.env.STATE\u MACHINE\u ARN,
名称:“唯一名称”,
输入:JSON.stringify({
时间戳:(新日期(/*要开始执行的日期*/).toISOString(),
//要传递给step函数的任何额外上下文。
}),
}).promise();

我没有详细研究过这一点,但是您可以简单地向Lambda函数添加一些代码来编辑实际触发Lambda的CloudWatch事件计划吗?相关:您可以在Lambda中动态设置CloudWatch规则吗?问题是我需要控制Lambda何时运行,而不是la上指定的代码何时运行mbda运行。我确实保留数据,让我知道下一步何时运行,但需要配置lambda运行时间。这基本上就是我们所做的。只需修改CloudWatch计时器,使其以我需要的下一次启动的速度运行。唯一的问题是精度不低于一分钟。不幸的是,计划的events不允许有秒的cron作业。但这就足够了。在这种情况下,我们不需要指定目标吗?答案中的blog post链接不再存在