在 Nodejs 中使用 Cloudwatch GetMetricWidgetImage API 时出错

Error while using Cloudwatch GetMetricWidgetImage API in Nodejs

我正在 Node.js 中创建一个 AWS Lambda 函数。我想使用 Cloudwatch GetMetricWidgetImage API 来获取仪表板快照,但我似乎遇到了问题。下面是我编写的代码,没有得到任何正确的响应。代码一直执行到 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);
        }
});

};

这里有几个问题。

首先,确保 lambda 具有调用 GetMetricWidgetImage 的权限。

那么就是这样得到widgetDefinition:

  1. 在 CloudWatch 控制台中打开图表。
  2. 单击 来源 选项卡。
  3. Select Image api 查看并从那里复制代码。

像这样使用您选择的代码(您所在的地区可能不同):

var image = {
    "view": "timeSeries",
    "stacked": false,
    "metrics": [
        [ "AWS/Events", "FailedInvocations" ]
    ],
    "region": "us-east-1"
}

var widgetDefinition = {
    MetricWidget: JSON.stringify(image)
};

那么您需要等待 GMWI 承诺。在 API 响应之前你的 lambda returns。

const response = await cloudwatch.getMetricWidgetImage(widgetDefinition).promise();

此外,GMWI returns 一个缓冲区,所以你不应该再次转换为缓冲区。

综合起来:

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')
    }
};