在 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
:
- 在 CloudWatch 控制台中打开图表。
- 单击 来源 选项卡。
- 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')
}
};
我正在 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
:
- 在 CloudWatch 控制台中打开图表。
- 单击 来源 选项卡。
- 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')
}
};