2017-01-09 64 views
1

有沒有辦法在動態定時器上觸發AWS Lambda?目前,我正在使用計劃事件來觸發lambda,但這是一個計時器。是否有一種方法可以動態地設置Lambda從Lambda內部觸發的時間?您是否可以在動態計時器上觸發AWS Lambda?

的此想法是,這確實LAMBDA專項檢查和執行代碼,知道什麼時候應該下次運行(因爲我只想要這個拉姆達時,它需要運行)。我想1)確定下一次需要運行的時間,2)從Lambda代碼中設置時間。

我看到有大量的資源被用於觸發lambda函數(SNS,室壁運動等),但我似乎無法找到一個很好的方法來動態踢一個關。

+2

我沒有看過這個的任何細節,但你只需一些代碼添加到您的lambda函數編輯這實際上觸發拉姆達的CloudWatch的活動日程?相關:http://stackoverflow.com/questions/27382009/aws-lambda-scheduled-tasks?rq=1 – jarmod

回答

4

這可以通過設置一個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 Functions That Dynamically Schedule Their Next Runtime

+0

這實質上就是我們所做的。只需修改CloudWatch計時器,以下次啓動時的速度運行。唯一的問題是精度不低於一分鐘。不幸的是,計劃的事件不允許在幾秒鐘內完成cron作業。但現在這已經足夠了。 – Zonxwedop

0

您可以創建CloudWatch規則以在特定時間運行。 CloudWatch規則可以定期運行,也可以使用類似cron的語法來運行,以便指定單個運行時間。不過,您可能需要稍後清理它們。

+1

你可以在lambda中動態設置cloudwatch規則嗎? – Zonxwedop

0

您可以繼續執行的時間表拉姆達,但在數據存儲,例如DynamoDB和S3,它告訴拉姆達當它應該運行旁邊堅持一個值。

拉姆達將繼續定期執行,但是當它實際上做了什麼打算,你可以控制的。這裏有計費方面的考慮(lambda會在後臺繼續佔用最少的資源),但希望事情不應該太過失控。可能比試圖在相同的lambda內管理觸發器更簡單。

+0

問題是我需要控制何時運行lambda,而不是lambda運行時指定的代碼。我堅持讓我知道什麼時候可以運行的數據,但是lambda運行時間的必要性是可配置的。 – Zonxwedop

相關問題