#javascript #amazon-web-services #aws-lambda #amazon-cloudwatch
Вопрос:
Я создаю функцию AWS Lambda в Node.js. Я хочу использовать GetMetricWidgetImage
API Cloudwatch для получения снимка панели мониторинга, но, похоже, у меня возникли проблемы с этим. Ниже приведен мой код, который я написал, не получив должного ответа. Код выполняется до hello1, и ответ, который я получаю, равен нулю.
console.log('Loading function');
const aws = require('aws-sdk');
var cloudwatch = new aws.CloudWatch({apiVersion: '2010-08-01'});
console.log("hello");
exports.handler = async (event, context, callback) =>{
var widgetDefinition = {
MetricWidget: '[ "AWS/IVS", "ConcurrentViews" ]',
OutputFormat: 'image.png'
};
console.log("hello1");
cloudwatch.getMetricWidgetImage(widgetDefinition, function(err, data) {
if (err) {
console.log(err, err.stack) ; //error occured
//console.log("hello2");
}
else {
console.log(data.MetricWidgetImage); // successful
var response = {
statusCode: 200,
body: new Buffer(data.MetricWidgetImage).toString('base64')
};
console.log(response);
}
});
};
Ответ №1:
Здесь есть пара проблем.
Во-первых, убедитесь, что у лямбды есть разрешение на вызов GetMetricWidgetImage.
Тогда это способ получить widgetDefinition
:
- Откройте график в консоли CloudWatch.
- Перейдите на вкладку Источник.
- Выберите представление api изображений и скопируйте код оттуда.
Используйте выбранный вами код следующим образом (ваш регион может отличаться).:
var image = {
"view": "timeSeries",
"stacked": false,
"metrics": [
[ "AWS/Events", "FailedInvocations" ]
],
"region": "us-east-1"
}
var widgetDefinition = {
MetricWidget: JSON.stringify(image)
};
Затем вам нужно дождаться обещания GMWI. Ваш лямбда-код возвращается до того, как API ответит.
const response = await cloudwatch.getMetricWidgetImage(widgetDefinition).promise();
Кроме того, GMWI возвращает буфер, поэтому вам не следует снова преобразовываться в буфер.
Складываю все это воедино:
const aws = require('aws-sdk');
const cloudwatch = new aws.CloudWatch({apiVersion: '2010-08-01'});
const image = {
"view": "timeSeries",
"stacked": false,
"metrics": [
[ "AWS/Events", "FailedInvocations" ]
],
"region": "us-east-1"
}
exports.handler = async (event, context, callback) =>{
const widgetDefinition = {
MetricWidget: JSON.stringify(image)
};
const response = await cloudwatch.getMetricWidgetImage(widgetDefinition).promise();
return {
statusCode: 200,
body: response.MetricWidgetImage.toString('base64')
}
};