Вот мои настройки:
A Лямбда-функция Python 3.6 , которую я хочу предварительно подогреть на определенном уровне параллелизма (скажем, 10).Инициализация лямбды достаточно болезненна, и я не хочу навязывать эту стоимость посетителям наугад.Я называю эти лямбды «работниками»
A Узел лямбда-функция , которая запускается каждые 5 минут, чтобы попытаться предварительно прогреть 10 экземпляров.Он использует тип вызова Event для 9 из них, а RequestResponse для 1. В любой момент времени работает только один или ноль этой лямбды.Я называю это «теплее».
Я следовал инструкциям на [https://www.jeremydaly.com/lambda-warmer-optimize-aws-lambda-function-cold-starts/],, а именно:
- Не пингуйте чаще, чем каждые 5 минут
- Вызвать функцию напрямую (т.е. не использовать API-шлюз для ее вызова)
- Передать тестовую полезную нагрузку, которая может быть идентифицирована как таковая
- Создать логику обработчика, которая отвечает соответствующим образом, не выполняявся функция
Вот проблема: это прекрасно работает в течение нескольких минут.Затем, когда я просматриваю логи, я начинаю получать тайм-ауты от своих рабочих лямбда-вызовов.Тайм-ауты быстро принимают все вызовы, которые пытается запустить теплый.
Теперь ни одна рабочая лямбда больше не разогревается.Но теплее продолжает пытаться, по расписанию cron событий Cloudwatch, терпя 100% тайм-ауты.Наконец, лямбда перестает пытаться запустить мою рабочую лямбду вообще.Такое ощущение, что какой-то аспект лямбды сводит на нет его состояние.Единственный способ восстановить это повторно развернуть лямбду.Это дает мне еще один час, когда работают предварительно нагретые лямбды.
Вопросы:
- Как мне понять, почему мои рабочие лямбды начинают истекать, а затем перестают отвечать на запросы??
- Каково определение «параллельного исполнения»?На главной панели Lambda она показывает мне их график.Тем не менее, кажется, что в два раза больше параллельных исполнений, чем я запрашиваю.
Вот код-лямбда-разминка (Node):
// warmer
"use strict";
/** Generated by Serverless WarmUP Plugin at ${new Date().toISOString()} */
const aws = require("aws-sdk");
aws.config.region = "${this.options.region}";
const lambda = new aws.Lambda({httpOptions: {timeout: 60000}});
const functionNames = ${JSON.stringify(functionNames)};
const delay = ms => new Promise(res => setTimeout(res, ms))
const concurrency = 10;
module.exports.warmUp = async (event, context, callback) => {
console.log("Warm Up Start");
const invokes = await Promise.all(functionNames.map(async (functionName) => {
let invocations = [];
try {
for(let i=1;i <= concurrency;i++){
let params = {
FunctionName: functionName,
InvocationType: (i===concurrency)?'RequestResponse': 'Event',
LogType: 'None',
Qualifier: process.env.SERVERLESS_ALIAS || "$LATEST",
Payload: JSON.stringify({
source: 'serverless-plugin-warmup',
'__WARMER_INVOCATION__': i,
'__WARMER_CONCURRENCY__': concurrency,
'__WARMER_REQUESTED__': new Date().toISOString(),
})
};
invocations.push(lambda.invoke(params).promise())
}
return await delay(75).then(Promise.all(invocations.map(p => p.catch(e => e)))
.then(results => console.log('results', results))
.catch(e => {
console.log(e);
return e;
}
))
} catch (e) {
console.log(\`Warm Up Invoke Error: \${functionName}\`, e);
return false;
}
}));
console.log(\`Warm Up Finished\`);
}
А вот рабочая лямбда (Python):
source = event.get('source')
if source == 'serverless-plugin-warmup':
time.sleep(0.05)
print(event)
return lambda_gateway_response(200, {"status": "lambda warmup"})