2015-08-21 4 views
1

Я пытаюсь скопировать пример миниатюр, который находится в документации AWS (link). Я хочу использовать этот значок, как только он будет создан. Я надеялся, что обратного вызова context.done() будет достаточно. Обратный вызов дает мне хороший ответ, но он слишком скоро. Не всегда изображение изменяется и доступно в ведро s3, которое оно хранится. При вызове лямбда-функции я специально устанавливаю тип вызова в «Событие», поэтому обратный вызов должен возвращаться после того, как функция будет изменена.AWS Lambda callback node js слишком быстро

Учитывая пример в документации, что было бы удобным способом для ожидания всей лямбда-функции? Функция, которая вызывает функцию лямбда в моем приложении теперь выглядит следующим образом:

AWS.config.loadFromPath('./configs/config.json'); 
var lambda = new AWS.Lambda(); 
var params = { 
FunctionName: 'resizeImage', 
InvocationType: 'Event', 
Payload: JSON.stringify({key: req.body.key}) 
}; 
lambda.invoke(params, function (err, data) { 
if (err) { 
    console.log(err, err.stack); // an error occurred 
} else { 
    console.log(data);   // successful response 
    next(); 
} 
}); 
+0

Ваш ведро в нас-восток-1, и вы смотрели на [непротиворечивость модели] (https://aws.amazon.com/s3/faqs/#What_data_consistency_model_does_Amazon_S3_employ) как объяснение? – James

+0

Я использую зону eu-west-1, и модели согласованности, похоже, не являются проблемой, мои журналы CloudWatch показывают мне правильное время, необходимое для завершения лямбда-функции в ms, только мое приложение вызывается до этого. Приложение получает ответ после 500 мс, пока функция лямбда занимает около 2000 мс. – Menno

ответ

0

Вы не должны блокировать ожидая Lambda, чтобы закончить. Вместо этого вы должны опубликовать свой S3 Events до SNS Topic, а затем обработать эти события в своем приложении. Это гарантирует, что ваши объекты будут доступны при доступе к ним.

+0

Спасибо за идею! но это не кажется немного тяжелым. Поскольку эта лямбда-функция вызывается сразу после загрузки изображения, я хочу подождать, пока функция не закончится. Если темы sns - единственный способ пойти, я буду помнить об этом. – Menno

+0

Я бы рекомендовал подход S3, или вы можете отсканировать свое приложение от самой Лямбды. – kixorz

+1

Я подумаю об этом завтра, если это решение, которое я дам вам знать, спасибо за ввод только сейчас. – Menno

3

Я нашел ответ на свой вопрос. Я испортил типы вызовов, которые вы можете предоставить при вызове функции. Существует три способа вызова, и в моем вопросе я использую тип «Событие». Это заставляет лямбда-функцию давать прямой (и, следовательно, асинхронный отклик), функция еще не закончена. Изменение типа вызова на «RequestResponse» обеспечивает синхронизацию, когда мы хотим дождаться выполнения нашей функции.

Смотри также AWS Documentation

+0

Добро пожаловать в переполнение стека. Отличная работа, поиск собственного решения. Действительно, у вас действительно есть действительный случай ожидания функции. Если вам это нужно * сейчас *, а не «действительно скоро», это имеет смысл. –

Смежные вопросы