Опубликовать сообщение 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
        }
      ]
    }
  }
}

Взято с https://aws.amazon.com/blogs/mt/customize-amazon-cloudwatch-alarm-notifications-to-your-local-time-zone-part-1/

Я слишком поздно отвечать на этот вопрос, но все же добавляю, поскольку @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"
}
Другие вопросы по тегам