我在AWS中有一个小的node.js lambda(参见下面的代码)。运行时,它会报告“成功”,但不会按照我的预期打印CloudWatch警报列表。
AWS Javascript SDK让我相信我正在做的事应该奏效。我们确实有很多警报设置,所以我有点不知道为什么lambda没有列出所有警报的名称。
为什么这不起作用?
//generated from TypeScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var AWS = require("aws-sdk");
function handler(event, context) {
var cw = new AWS.CloudWatch();
var params = {};
cw.describeAlarms(params, function(err, data) {
if (err) {
console.log('Error: ', err);
}
data.MetricAlarms.forEach(function(alarm) {
console.log('Alarm: ', alarm.AlarmName);
});
});
context.succeed("Success");
}
exports.handler = handler;
答案 0 :(得分:3)
至少有两个潜在的问题需要检查。在验证以下两项都是正确的之后,我能够使用您的代码并描述警报:
您的context.succeed
方法的范围不正确 - 因为它发生在describeAlarms
之后的响应范围之外,它在您发出请求后立即处理,而不等待它完成。< / p>
将其移至回调范围,如下所示:
cw.describeAlarms(params, function(err, data) {
if (err) {
console.log('Error: ', err);
}
data.MetricAlarms.forEach(function(alarm) {
console.log('Alarm: ', alarm.AlarmName);
});
context.succeed("Success");
});
您的lambda执行角色需要获得与CloudWatch API通信的权限。执行角色是IAM角色,用于定义lambda可以与之交互的AWS服务。
一个好的起点是附加一个托管的CloudWatch只读访问策略,然后从那里减少所需的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:Describe*",
"cloudwatch:Describe*",
"cloudwatch:Get*",
"cloudwatch:List*",
"logs:Get*",
"logs:Describe*",
"logs:TestMetricFilter",
"sns:Get*",
"sns:List*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}