Ошибка при использовании Cloudwatch GetMetricWidgetImage API в Nodejs

#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 :

  1. Откройте график в консоли CloudWatch.
  2. Перейдите на вкладку Источник.
  3. Выберите представление 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')
    }
};