Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Publish AWS SNS message to Pagerduty

I have integrated pagerduty with AWS cloudwatch and I am trying to publish a message manually to a SNS Topic that is subscribed by pagerduty and email. But I am not able to get incidents in pagerduty. However, cloudwatch alarms are triggering incidents in pagerduty using this same topic.

I referred some document for pagerduty message payload. But unable to make it work. My SNS message JSON is as follows,

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

Its not triggering an incident in pagerduty. I am not sure what I am missing in the request body. I am receiving email messages properly from this same message body. Could someone point out the mistake?

Thanks in advance.

like image 990
Sujai Sivasamy Avatar asked Oct 15 '18 10:10

Sujai Sivasamy


People also ask

How does PagerDuty integrate with AWS SNS?

Create a new SNS Subscription. Click the orange button “Create subscription”. On this page, enter the Protocol as HTTPS. This will cause AWS to send an HTTPS POST to PagerDuty with the Topic's events. The Endpoint should be the Integration URL from the “Create a PagerDuty Service” step at the end.

How do I publish a message to SNS?

Sign in to the Amazon SNS console . In the left navigation pane, choose Topics. On the Topics page, select a topic, and then choose Publish message. The console opens the Publish message to topic page.

How do I integrate PagerDuty with AWS CloudWatch?

Navigate to your PagerDuty Service click the Integrations tab click the to the right of your Amazon CloudWatch integration click Edit change the value for the Correlate events by option.

Does PagerDuty run on AWS?

PagerDuty integrates with various AWS services, including AWS CloudWatch, Amazon GuardDuty, AWS CloudTrail, AWS Personal Health Dashboard, Amazon EventBridge, AWS Security Hub, Amazon DevOps Guru, AWS Control Tower, AWS Outposts, and AWS S3 Storage Lens.


3 Answers

To do so, you must choose the option Custom Event Transformer for the PagerDuty Integration. In the integration, you can write your own JavaScript code as follows:

var normalized_event = {
    event_type: PD.Trigger,
    description: "SNS Event",
    details: PD.inputRequest
};

PD.emitGenericEvents([normalized_event]);

To parse the received payload from SNS, you can use:

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

And treat obj to treat your event according to your SNS message.

like image 143
filipebarretto Avatar answered Oct 06 '22 00:10

filipebarretto


I'm too late to answer this but still adding as @filipebarretto has suggested we need to use Custom Event Transformer for this type of integration.

Setup: ~ AWS Cloudwatch (RDS Metric) -> AWS SNS -> PagerDuty (CET)

I have successfully integrated AWS SNS to PagerDuty via 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]);

The above code will send incident as AlarmName and details as NewStateReason.

like image 34
Hussain K Avatar answered Oct 06 '22 00:10

Hussain K


I believe PagerDuty's native AWS CloudWatch integration is opinionated. So a Custom SNS message won't trigger an incident.

But PagerDuty has an inbound integration type that allows you to create a script using JS (ES5) to parse any custom message sent to the this integration - which can then trigger an incident based on the logic of your script.

Docs on the Custom Event Transformer: https://v2.developer.pagerduty.com/docs/creating-an-integration-inline

like image 38
Jay C Avatar answered Oct 06 '22 00:10

Jay C