#node.js #aws-lambda #amazon-cloudwatch
#node.js #aws-lambda #amazon-cloudwatch
Вопрос:
Я хочу создать функцию AWS Lambda для проверки доступности сайта. Я попробовал эту функцию.
'use strict';
var url = require('url');
var target = 'https://www.google.com'; // Change this one
exports.handler = function(event, context, callback) {
var urlObject = url.parse(target);
var mod = require(
urlObject.protocol.substring(0, urlObject.protocol.length - 1)
);
console.log('[INFO] - Checking ' target);
var req = mod.request(urlObject, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('[INFO] - Read body chunk');
});
res.on('end', function() {
console.log('[INFO] - Response end');
callback();
});
});
req.on('error', function(e) {
console.log('[ERROR] - ' e.message);
callback(e);
});
req.end();
};
Я попробовал это в разделе «Как это работает», прежде чем создавать фактическую функцию. Но когда я запускаю это, я получаю сообщение об ошибке «Процесс завершен до завершения запроса»
Моя цель — отправить оповещение, если сайт не работает (с помощью AWS cloud-watch).
Комментарии:
1. Ваша функция находится внутри VPC? Если да, включен ли у вас NAT?
2. @Shuvojit Нет. Не под VPC
3. работает ли код, если вы запускаете его локально? например, с
exports.handler({}, {}, console.log)
помощью?4. Рассматривали ли вы возможность использования возможностей проверки работоспособности Amazon Route 53? Она может сделать это за вас и запускать уведомления при сбое проверки работоспособности.
5. ДА. Это также вызовет метрику Amazon CloudWatch, которую можно использовать для запуска оповещений, поэтому CloudWatch будет вести историю и позволит вам реагировать. См. раздел: Создание проверок работоспособности Amazon Route 53 и настройка аварийного переключения DNS — Amazon Route 53
Ответ №1:
Ваш код завершается, потому что вы вызываете req.end
до того, как будут вызваны какие-либо события. По сути, эти API используют EventEmitter
API в NodeJS, поэтому он публикует события на каналах, которые их прослушивают, но поскольку все это происходит асинхронно, req.end
вызывается до запуска любого из этих событий.
Вы можете значительно упростить свой код, используя request
модуль. Просто упакуйте его в свои зависимости.
Я немного переработал ваш код, чтобы также использовать async / await, поэтому мне нужно было пообещать обратный вызов. Это хорошая практика для этого. Если вы хотите отправить уведомление, когда что-то пойдет не так, просто поместите код внутри catch
блока.
'use strict';
const target = 'https://www.google.com'; // Change this one
const request = require('request')
const handler = async (event) => {
try {
const data = await new Promise((res, rej) => {
request.get(target, (err, data) => {
if (err) {
return rej(err)
}
return res(data)
})
})
console.log(data)
} catch (e) {
console.log(e)
//send notification
}
};