Опубликовать сообщение AWS SNS в Pagerduty
Я интегрировал pagerduty с AWS cloudwatch и пытаюсь опубликовать сообщение вручную в теме SNS, на которую подписаны pagerduty и email. Но я не могу получить инциденты в 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. Я не уверен, что мне не хватает в теле запроса. Я получаю сообщения электронной почты должным образом из этого же тела сообщения. Может ли кто-то указать на ошибку?
Заранее спасибо.
5 ответов
Я тестировал следующие примеры событий в виде сообщения 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
}
]
}
}
}
Я слишком поздно отвечать на этот вопрос, но все же добавляю, поскольку @filipebarretto предложил нам использовать настраиваемый преобразователь событий для этого типа интеграции.
Настроить: ~ AWS Cloudwatch (RDS Metric) -> AWS SNS -> PagerDuty (CET)
Я успешно интегрировал AWS SNS в PagerDuty через Custom Event Transformer.
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
.
Для этого вы должны выбрать опцию Custom Event Transformer для интеграции 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, чтобы обработать ваше мероприятие в соответствии с вашим сообщением в соцсети.
Я считаю, что встроенная в AWS CloudWatch PagerDuty является самоуверенной. Таким образом, пользовательское сообщение SNS не вызовет инцидента.
Но PagerDuty имеет тип входящей интеграции, который позволяет вам создавать сценарий с использованием JS (ES5) для анализа любого настраиваемого сообщения, отправляемого в эту интеграцию, что может затем вызвать инцидент на основе логики вашего сценария.
Документы по преобразователю пользовательских событий: https://v2.developer.pagerduty.com/docs/creating-an-integration-inline
Я даже позже на игру здесь, но...
Как вы "вручную" отправляете события? Вы проверили, разрешает ли политика в теме 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"
}