我已将 pagerduty 与 AWS cloudwatch 集成,并且我正在尝试手动 publish 消息到由 pagerduty 和 email 订阅的 SNS 主题。但我无法在 pagerduty 中获取事件。但是,cloudwatch 警报 使用相同的 topic 触发 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 集成选择选项 自定义事件转换器。在集成中,您可以编写自己的 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 消息处理您的活动。
我认为 PagerDuty 的原生 AWS CloudWatch 集成 是固执己见的。因此自定义 SNS 消息不会触发事件。
但是 PagerDuty 具有入站集成类型,允许您使用 JS (ES5) 创建脚本来解析发送到此集成的任何自定义消息 - 然后可以根据脚本的逻辑触发事件。
有关自定义事件转换器的文档:https://v2.developer.pagerduty.com/docs/creating-an-integration-inline
我来不及回答这个问题了,但仍然添加了 @filipebarretto 建议我们需要使用 Custom Event Transformer 来进行这种类型的集成。
设置:
~ AWS Cloudwatch (RDS Metric) -> AWS SNS -> PagerDuty (CET)
我已通过 自定义事件转换器
成功将 AWS SNS 集成到 PagerDutyvar 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
。
我使用以下示例事件作为 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
}
]
}
}
}
我在这里比赛的时间甚至更晚,但是......
您如何“手动”发送事件?您是否检查过 SNS 主题上的策略是否允许从您用于发布事件的任何服务发布通知?
我在从 AWS Backup 发布通知/事件时遇到了类似的问题。我必须在访问策略中添加这样的内容:
{
"Sid": "My-statement-id",
"Effect": "Allow",
"Principal": {
"Service": "backup.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:region:account-id:myTopic"
}
Pagerduty 自定义事件转换器能够在我创建 aws sns 主题时触发事件,但是订阅处于待确认状态。 我想知道如何确认订阅?