2017-01-09 4 views
1

Есть ли способ вызвать AWS Lambda на динамическом таймере? В настоящее время я использую запланированные события для запуска лямбда, но это заданный таймер. Есть ли способ динамически установить время, когда Лямбда запускается из Лямбды?Можете ли вы активировать AWS Lambda на динамическом таймере?

Идея здесь в том, что эта Лямбда выполняет определенные проверки и выполняет код, чтобы знать, когда он должен работать дальше (потому что я хочу, чтобы эта лямбда запускалась, когда это необходимо). Я хочу: 1) определить следующий раз, когда он должен быть запущен, и 2) установить время в пределах лямбда-кода.

Я вижу, что есть много ресурсов, которые используются для запуска лямбда-функций (SNS, Kinesis и т. Д.), Но я не могу найти хороший способ динамически отталкивать один.

+2

Я не смотрел на это в деталях, но вы можете просто добавить код к вашей функции лямбда редактировать расписание событий CloudWatch, что на самом деле запускающего лямбда? Связано: http://stackoverflow.com/questions/27382009/aws-lambda-scheduled-tasks?rq=1 – jarmod

ответ

4

Это можно сделать, установив правило события CloudWatch для запуска вашей функции лямбда. При каждом вызове вашей лямбда-функции функция должна определить свое следующее время выполнения и соответствующим образом изменить правило события.

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; 
} 

Вы должны быть в состоянии поменять свое случайное определение с вашей собственной логикой планирования и вставить любую работу, вам нужно вместо моего комментария.

В моем фрагменте вам нужно будет заменить имя правила вашего мероприятия «ВАШЕ ИМЯ ПРАВИЛЬНОГО ИСПОЛЬЗОВАНИЯ СОБЫТИЙ».

Большой вопрос для блога: AWS Lambda Functions That Dynamically Schedule Their Next Runtime

+0

Это по существу то, что мы сделали. Просто измените таймер CloudWatch, чтобы он работал со скоростью следующего раза, когда мне это нужно, чтобы начать. Единственная проблема заключается в том, что точность составляет не менее минуты. К сожалению, запланированные события не позволяют выполнять задания cron за считанные секунды. Но этого пока достаточно. – Zonxwedop

0

Вы можете создать правило CloudWatch для запуска в определенное время. Правила CloudWatch могут выполняться периодически или с синтаксисом cron, который позволяет указать единое время выполнения. Скорее всего, вам придется их очистить позже.

+1

Можете ли вы динамически установить правило облачного просмотра в лямбда? – Zonxwedop

0

Вы можете продолжать выполнять лямбда по расписанию, но сохраняйте значение в хранилище данных, таком как DynamoDB или S3, который сообщает лямбда, когда он должен работать дальше.

лямбда будет периодически выполняться, но вы можете контролировать, когда она на самом деле делает то, для чего она предназначена. Здесь есть соображения о выставлении счетов (лямбда будет продолжать потреблять минимальное количество ресурсов в фоновом режиме), но, надеюсь, что-то не слишком из-за границы. Наверное, проще, чем пытаться управлять триггерами из одной и той же лямбды.

+0

Проблема в том, что мне нужно контролировать, когда лямбда работает, а не когда указанный код на лямбде работает. Я сохраняю данные, которые позволяют мне знать, когда нужно работать дальше, но необходимо, чтобы время работы лямбды настраивалось. – Zonxwedop