Skip to content

Instantly share code, notes, and snippets.

@acsrujan
Created June 26, 2020 04:58
Show Gist options
  • Save acsrujan/fd8d5d92b652cf56cf589e394917c61b to your computer and use it in GitHub Desktop.
Save acsrujan/fd8d5d92b652cf56cf589e394917c61b to your computer and use it in GitHub Desktop.
slack notification for cloudwatch alerts
##### To use: Setup a sns topic like cloudwatch-sns-slack.
### Enter webhook url in SLACK_URL; and change SLACK_CHANNEL;
import boto3
import json
import logging
import os
from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
SLACK_CHANNEL = "<enter your slack channel here>"
SLACK_URL = "<enter your slack webhook url here>"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Event: " + str(event))
message = json.loads(event['Records'][0]['Sns']['Message'])
logger.info("Message: " + str(message))
alarm_name = message['AlarmName']
new_state = message['NewStateValue']
reason = message['NewStateReason']
metric = message['Trigger']['MetricName']
dimensions = message['Trigger']['Dimensions'][0]
if new_state == 'ALARM':
slack_message = {
'channel': SLACK_CHANNEL,
'text': "OMG!!! :fire: *Alert Triggered*: {} \n *State*: `{}` \n *Reason*: {} \n *Metrics*: {} \n *Resource*: {}" .format(alarm_name, new_state, reason, metric,dimensions)
}
else:
slack_message = {
'channel': SLACK_CHANNEL,
'text': "Hey there!! :celebrate: {} \n *State*: `{}` \n *Reason*: {} \n *Metrics*: {} \n *Resource*: {}" .format(alarm_name, new_state, reason, metric,dimensions)
}
req = Request(SLACK_URL, json.dumps(slack_message).encode('utf-8'))
try:
response = urlopen(req)
response.read()
logger.info("delivered to", slack_message['channel'])
except HTTPError as e:
logger.error("Request failed: %d %s", e.code, e.reason)
except URLError as e:
logger.error("Conn failed: %s", e.reason)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment