Я поддерживаю ответ Джона Ротенштейна о том, что если вы используете лямбду таким образом, вам, вероятно, не следует использовать лямбду. Хотя из моего собственного любопытства я думаю, что код, который вы будете искать, выглядит следующим образом (написано Node.JS)
let AWS = require('aws-sdk');
let functionName = 'YOUR_LAMBDA_FUNCTION_NAME'
let timeThreshholdInMillis = 5000 // 5 seconds
exports.handler = (event, context, callback) => {
let input = JSON.parse(event['foo']); // input from previous lambda, omitted try-catch for brevity
let done // set this variable to true when your code is done
let interval = setInterval(() => {
if (done) callback(null, true)
let remainingTime = context.get_remaining_time_in_millis();
if (remainingTime < timeThreshholdInMillis) {
// Going to restart
clearInterval(interval);
// save your progress (local or remote) to `input` variable
let lambda = new AWS.Lambda();
return lambda.invoke({
FunctionName: functionName,
Payload: JSON.stringify({ 'foo': input }) // Pass your progress here
}, (err, data) => {
// kill container
if (err) callback(err)
else callback(null, data)
});
}
}, 1000);
}
Редактировать: пример
Это должно прояснить, как «проходящий прогресс» будет работать в рекурсивных лямбдах.
Допустим, вы хотите увеличивать переменную (+1) каждую секунду, и вы хотите сделать это в лямбде.
Givens Мы будем увеличивать переменную на 1 один раз каждые 1000 мс. Лямбда будет работать, пока оставшееся время не станет <5000 мс. Тайм-аут выполнения лямбды составляет 60000 мс (1 минута). </p>
Псевдокод лямбда-функции:
function async (event, context) {
let counter = event.counter || 0
setInterval(() => {
if (context.get_remaining_time_in_millis() < 5000) {
// start new lambda and pass `counter` variable
// so it continues counting and we don't lose progress
lambda.invoke({ payload: { counter } })
} else {
// Add 1 to the counter variable
counter++
}
}, 1000)
}