AWS Lambda未返回警报列表

时间:2017-03-31 04:40:16

标签: javascript node.js amazon-web-services aws-lambda amazon-cloudwatch

我在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;

1 个答案:

答案 0 :(得分:3)

至少有两个潜在的问题需要检查。在验证以下两项都是正确的之后,我能够使用您的代码并描述警报:

context.succeed的格式错误

您的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执行角色

您的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": "*"
    }
  ]
}

进一步阅读