发布AWS SNS消息到Pagerduty

11
我已经将 PagerDutyAWS CloudWatch 集成,并尝试手动向一个由 PagerDutyEmail 订阅的SNS主题发布消息。但是我无法在 PagerDuty 中获得事故报告。然而,使用相同的 主题CloudWatch警报 可触发 PagerDuty 的事故报告。

我参考了一些有关 PagerDuty 消息有效载荷的文档,但无法使其正常工作。我的 SNS 消息 JSON 如下:

{
 "default":"test message",
 "email":"test email message",
 "https":{
    "service_key":"XXXX",
    "event_type":"trigger",
    "description":"Example alert on host1.example.com"
  }
}

在 PagerDuty 中它并没有触发事件。我不确定在请求体中缺少了什么。我从这个相同的消息主体正确接收电子邮件消息。请问有人能指出错误吗?

提前感谢。


我使用PagerDuty中的电子邮件集成来实现这一点,而不是API集成。这种方式运作良好,也很容易实现。 - Sujai Sivasamy
2
我向 PagerDuty 支持团队提出了同样的问题,他们指引我查看 https://v2.developer.pagerduty.com/docs/creating-an-integration-inline 以查看消息格式。如果我弄清楚了,我会回来的。 - brian d foy
现在有一个 API v2,其中包括:https://developer.pagerduty.com/docs/app-integration-development/events-integration/ - Efren
1
我已经完成了这个任务,并在这里记录了下来:https://blog.cetinich.net/content/2022/cloudwatch-pagerduty-sns/ - Brent
5个回答

4

我使用以下示例事件作为SNS消息进行测试,它能正常工作。

{
  "version": "0",
  "id": "bba1bcef-5268-9967-8628-9a6d09e042e9",
  "detail-type": "CloudWatch Alarm State Change",
  "source": "aws.cloudwatch",
  "account": "[Account ID]",
  "time": "2020-11-17T06:25:42Z",
  "region": "[region Id]",
  "resources": [
    "arn:aws:cloudwatch:[region Id]:[Account ID]:alarm:CPUUtilize"
  ],
  "detail": {
    "alarmName": "CPUUtilize",
    "state": {
      "value": "ALARM",
      "reason": "Threshold Crossed: 1 out of the last 1 datapoints [4.314689265544354 (17/11/20 06:20:00)] was less than the threshold (70.0) (minimum 1 datapoint for OK -> ALARM transition).",
      "reasonData": {
        "version": "1.0",
        "queryDate": "2020-11-17T06:25:42.491+0000",
        "startDate": "2020-11-17T06:20:00.000+0000",
        "statistic": "Average",
        "period": 300,
        "recentDatapoints": [
          4.314689
        ],
        "threshold": 70
      },
      "timestamp": "2020-11-17T06:25:42.493+0000"
    },
    "previousState": {
      "value": "OK",
      "reason": "Threshold Crossed: 1 out of the last 1 datapoints [4.484088172640544 (17/11/20 05:44:00)] was not greater than or equal to the threshold (70.0) (minimum 1 datapoint for ALARM -> OK transition).",
      "reasonData": {
        "version": "1.0",
        "queryDate": "2020-11-17T05:49:53.688+0000",
        "startDate": "2020-11-17T05:44:00.000+0000",
        "statistic": "Average",
        "period": 300,
        "recentDatapoints": [
          4.484088
        ],
        "threshold": 70
      },
      "timestamp": "2020-11-17T05:49:53.691+0000"
    },
    "configuration": {
      "description": "Alarm Notification in my local timezone",
      "metrics": [
        {
          "id": "16baea70-421b-0a6e-f6f1-bc913d2bf647",
          "metricStat": {
            "metric": {
              "namespace": "AWS/EC2",
              "name": "CPUUtilization",
              "dimensions": {
                "InstanceId": "i-0e448XXXXXXXXXXXX"
              }
            },
            "period": 300,
            "stat": "Average"
          },
          "returnData": true
        }
      ]
    }
  }
}

https://aws.amazon.com/blogs/mt/customize-amazon-cloudwatch-alarm-notifications-to-your-local-time-zone-part-1/中获取

4

虽然我回答有点晚了,但我还是像 @filipebarretto 建议的一样,建议我们使用自定义事件转换器(Custom Event Transformer)来进行这种类型的集成。

设置:~ AWS Cloudwatch(RDS度量)-> AWS SNS -> PagerDuty(CET)

我已经成功地通过自定义事件转换器(Custom Event Transformer)将AWS SNS与PagerDuty集成。

var body = JSON.parse(PD.inputRequest.rawBody)
var message = body.NewStateReason

var normalized_event = {
      event_type: PD.Trigger,
      description: body.AlarmName,
      details: message
    };
PD.emitGenericEvents([normalized_event]);

以上代码将会把 incident 作为 AlarmName,而将 details 作为 NewStateReason 发送。

4
为此,您必须选择PagerDuty集成的“自定义事件转换器”选项。在集成中,您可以编写如下JavaScript代码:
var normalized_event = {
    event_type: PD.Trigger,
    description: "SNS Event",
    details: PD.inputRequest
};

PD.emitGenericEvents([normalized_event]);

要解析从 SNS 接收到的有效载荷,您可以使用以下方法:

var rawBody = PD.inputRequest.rawBody;
var obj = JSON.parse(unescape(rawBody));

使用obj来根据您的SNS消息处理事件。


3

0

我在这里来得更晚了,但是...

你是如何“手动”发送事件的?你是否检查了SNS主题上的策略,以确保允许从任何用于发布事件的服务发布通知?

我曾经遇到过类似的问题,当时我需要向访问策略中添加类似以下内容:

{
      "Sid": "My-statement-id",
      "Effect": "Allow",
      "Principal": {
        "Service": "backup.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:region:account-id:myTopic"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接